1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
28767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanCopyright (c) 2013-2014, The Linux Foundation. All rights reserved.
3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without
5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met:
6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions of source code must retain the above copyright
7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer.
8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions in binary form must reproduce the above copyright
9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer in the
10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      documentation and/or other materials provided with the distribution.
116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    * Neither the name of The Linux Foundation nor
12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      the names of its contributors may be used to endorse or promote
13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      products derived from this software without specific prior written
14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      permission.
15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/
28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*============================================================================
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            O p e n M A X   w r a p p e r s
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             O p e n  M A X   C o r e
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//** @file omx_vdec.cpp
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This module contains the implementation of the OpenMAX core & component.
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//                             Include Files
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h>
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h>
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <stdlib.h>
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h>
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <errno.h>
486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include "omx_vdec_hevc.h"
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h>
516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <media/msm_media_info.h>
526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <qdMetaData.h>
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h>
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h>
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if  defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <gralloc_priv.h>
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_HANDLE_QCOM 0x4F00
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define EGL_BUFFER_OFFSET_QCOM 0x4F01
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME "/data/input-bitstream.\0\0\0\0"
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define INPUT_BUFFER_FILE_NAME_LEN 30
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [INPUT_BUFFER_FILE_NAME_LEN] = "\0";
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output.yuv";
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar ouputextradatafilename [] = "/data/extradata";
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef VENUS_HEVC
958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/venus_dec"
968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEVICE_NAME "/dev/video/q6_dec"
988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_INPUT_ERROR DEFAULT_FPS
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
1196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" {
12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h>
12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000
1316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000
1326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
1356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define EXTRADATA_IDX(__num_planes) (__num_planes  - 1)
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
1388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer;
14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pollfd pfd;
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event dqevent;
14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.fd = omx->drv_ctx.video_driver_fd;
15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = poll(&pfd, 1, POLL_TIMEOUT);
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc) {
1568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Poll timedout");
15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (rc < 0) {
1598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error while polling: %d", rc);
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = omx->drv_ctx.num_planes;
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (uint64_t)v4l2_buf.timestamp.tv_usec;
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (vdec_msg.msgdata.output_frame.len) {
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = 1;
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
1998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pfd.revents & POLLPRI) {
20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved");
21161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT ) {
21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_INFO_CONFIG_CHANGED;
21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Port Reconfig recieved");
22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Flush Done Recieved");
22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Flush Done Recieved");
23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
2418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Close Done Recieved and async_message_thread Exited");
24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_ERROR;
24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("SYS Error Recieved");
24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
2538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                continue;
25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char id;
26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int n;
26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        n = read(omx->m_pipe_in, &id, 1);
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (0 == n) {
27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (1 == n) {
28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->process_event_cb(omx, id);
28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
28561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((n < 0) && (errno != EINTR)) {
2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
28861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret_value;
2976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx == NULL) {
2998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("message thread null pointer rxd");
30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
30161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
3028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret_value = write(omx->m_pipe_out, &id, 1);
3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Nothing to do
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    memset(m_q,0,sizeof(m_q));
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::insert_entry(unsigned p1, unsigned p2, unsigned id)
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].id       = id;
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param1   = p1;
32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param2   = p2;
32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_write++;
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_size ++;
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_write = 0;
33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
3348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::omx_cmd_queue::pop_entry(unsigned *p1, unsigned *p2, unsigned *id)
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size > 0) {
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *id = m_q[m_read].id;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p1 = m_q[m_read].param1;
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p2 = m_q[m_read].param2;
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Move the read pointer ahead
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ++m_read;
34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        --m_size;
35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_read = 0;
35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //initialize timestamps array
36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_ts_arr_list, 0, sizeof(m_ts_arr_list) );
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //free m_ts_arr_list?
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool duplicate_ts = false;
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //insert at the first available empty location
38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_ts_arr_list[idx].valid) {
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found invalid or empty entry, save timestamp
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].valid = true;
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].timestamp = ts;
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ts, idx);
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int min_idx = -1;
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_TICKS min_ts = 0;
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_ts_arr_list[idx].valid) {
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found valid entry, save index
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (min_idx < 0) {
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //first valid entry
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (min_idx < 0) {
42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //no valid entries found
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = 0;
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = m_ts_arr_list[min_idx].timestamp;
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[min_idx].valid = false;
43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ts, min_idx);
43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[idx].valid = false;
44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return (new omx_vdec);
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
463f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        ion_user_handle_t handle, int ionMapfd)
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::omx_vdec
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Constructor
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false),
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_state(OMX_StateInvalid),
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data(NULL),
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_mem_ptr(NULL),
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr(NULL),
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_err_count(0),
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress (false),
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress (false),
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_use_buffer (false),
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer (false),
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers(false),
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_output_pmem(OMX_FALSE),
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_region_smi(OMX_FALSE),
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_pvt_entry_pmem(OMX_FALSE),
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers(0),
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers(0),
50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bm_count(0),
50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bm_count(0),
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bPopulated(OMX_FALSE),
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bPopulated(OMX_FALSE),
50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_flags(0),
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr(NULL),
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bEnabled(OMX_TRUE),
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bEnabled(OMX_TRUE),
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_in_alloc_cnt(0),
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list(NULL),
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry(NULL),
51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info(NULL),
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    arbitrary_bytes (true),
51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    psource_frame (NULL),
52061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pdest_frame (NULL),
52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_heap_ptr (NULL),
52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_phdr_pmem_ptr(NULL),
52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_inp_bm_count (0),
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    codec_type_parse ((codec_type)0),
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_meta (true),
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_count (0),
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_count (0),
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_length(0),
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    look_ahead_nal (false),
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame(0),
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_buffer(NULL),
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_size (0),
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_device_file_ptr(NULL),
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vc1_profile((vc1_profile_type)0),
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_ts(LLONG_MAX),
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_flags(0),
53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts(LLONG_MAX),
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rst_prev_ts(true),
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frm_int(0),
54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    in_reconfig(false),
54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_display_id(NULL),
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_parser(NULL),
54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_extradata(0),
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_enable_android_native_buffers(OMX_FALSE),
54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_android_native_buffers(OMX_FALSE),
54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    iDivXDrmDecrypt(NULL),
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr(NULL),
55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    secure_mode(false)
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Assumption is that , to begin with , we have all the frames with decoder */
55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
5568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.debug.level", property_value, "1");
5578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    debug_level = atoi(property_value);
5588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
5598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.perf", property_value, "0");
56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    perf_flag = atoi(property_value);
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
56361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.start();
56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        proc_frms = latency = 0;
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.ts", property_value, "0");
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_timestamp = atoi(property_value);
57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.set_timestamp_reorder_mode(true);
57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.enable_debug_print(true);
57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.concealedmb", property_value, "0");
57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_concealedmb = atoi(property_value);
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cmp,0,sizeof(m_cmp));
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cb,0,sizeof(m_cb));
58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&drv_ctx,0,sizeof(drv_ctx));
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, sizeof(m_demux_offsets) );
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
5896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
5916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.timestamp_adjust = false;
59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = -1;
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vendor_config.pData = NULL;
59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&m_lock, NULL);
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&c_lock, NULL);
59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_init(&m_cmd_lock,0,0);
59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] =
60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[OUTPUT_PORT] = false;
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char extradata_value[PROPERTY_VALUE_MAX] = {0};
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.extradata", extradata_value, "0");
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_extradata = atoi(extradata_value);
60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_buffers.set_vdec_client(this);
6096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = {
61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR
6176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal};
6186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
6196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd)
6206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
6268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
6358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < array_sz) {
64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (--i; i >=0 ; i--) {
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(&sub, 0, sizeof(sub));
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sub.type = event_type[i];
64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
6458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
6546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
6608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
6698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
6756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::~omx_vdec
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destructor
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info = NULL;
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_in) close(m_pipe_in);
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_pipe_out) close(m_pipe_out);
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_in = -1;
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_out = -1;
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(msg_thread_id,NULL);
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_CMD_STOP;
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
7038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("STOP Command failed");
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_join(async_thread_id,NULL);
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsubscribe_to_events(drv_ctx.video_driver_fd);
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(drv_ctx.video_driver_fd);
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&m_lock);
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&c_lock);
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_destroy(&m_cmd_lock);
71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.end();
71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Exit OMX vdec Destructor");
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = 0;
72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
7296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::OMXCntrlProcessMsgCb
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL Client callbacks are generated through this routine. The decoder
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   provides the thread context for this routine.
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p1; // Parameter - 1
75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    signed int p2; // Parameter - 2
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int ident;
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int qsize=0; // qsize
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *pThis = (omx_vdec *) ctxt;
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!pThis) {
7598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Protect the shared queue data structure
76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Read the message id's from the queue*/
76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize) {
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pThis->m_cmd_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_ftb_q.m_size;
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_ftb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_etb_q.m_size;
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pThis->m_etb_q.pop_entry((unsigned *)&p1, (unsigned *)&p2, &ident);
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*process message if we have one*/
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize > 0) {
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id = ident;
79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (id) {
79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT:
79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        switch (p1) {
79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandStateSet:
79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = (OMX_STATETYPE) p2;
7978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->m_state);
79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL);
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_EventError:
80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_StateInvalid) {
8058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_state = (OMX_STATETYPE) p2;
80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else if (p2 == OMX_ErrorHardware) {
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error();
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortDisable:
8188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%d]", p2);
81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    break;
82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->in_reconfig) {
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
8288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->in_reconfig = false;
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet !=  OMX_ErrorNone) {
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error();
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortEnable:
8418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%d]", p2);
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            default:
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
8538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB:
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FTB:
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
8748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_COMMAND:
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_U32)p2,(OMX_PTR)NULL);
88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EBD:
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
8878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count++;
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ((OMX_BUFFERHEADERTYPE *)p1)->nTimeStamp,
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_inp_err_count = 0;
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
9018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_inp_err_count >= MAX_INPUT_ERROR) {
9058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Input bitstream error for consecutive %d frames.", MAX_INPUT_ERROR);
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED:
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int64_t *timestamp = (int64_t *)p1;
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p1) {
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(*timestamp,
91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            free(timestamp);
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FBD:
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS) {
9238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
9278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_buffer_done failure");
92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
9338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->input_flush_progress) {
9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_input_flush();
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
9408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
9478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_INPUT_PORT_INDEX,NULL );
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_IDLE_PENDING)) {
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
9558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->streaming[OUTPUT_PORT] = false;
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->output_flush_progress) {
9618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("Input flush done hence issue stop");
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
9748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!pThis->output_flush_progress) {
9768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->execute_output_flush();
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (p2 != VDEC_S_SUCCESS) {
9818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->omx_report_error ();
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else {
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                /*Check if we need generate event for Flush done*/
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
9878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Notify Output Flush done");
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventCmdComplete,OMX_CommandFlush,
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_CORE_OUTPUT_PORT_INDEX,NULL );
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
9958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_LOW("Internal flush complete");
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_CLEAR (&pThis->m_flags,
99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (BITMASK_PRESENT(&pThis->m_flags,
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event(OMX_CommandPortDisable,
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_CORE_OUTPUT_PORT_INDEX,
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_EVENT);
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        BITMASK_CLEAR (&pThis->m_flags,
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
10118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error ();
101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->streaming[CAPTURE_PORT] = false;
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (!pThis->input_flush_progress) {
10178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("Output flush done hence issue stop");
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                OMX_COMPONENT_GENERATE_STOP_DONE);
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_START_DONE:
10308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
10348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
10378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
10398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Move to executing");
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting, NULL);
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else if (BITMASK_PRESENT(&pThis->m_flags,
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_COMPONENT_PAUSE_PENDING)) {
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (/*ioctl (pThis->drv_ctx.video_driver_fd,
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
10508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error ();
105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
10568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Event Handler callback is NULL");
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
10618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
10698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                //Send the callback now
107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StatePause;
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StatePause, NULL);
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_RESUME_DONE:
10858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
10888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
10928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Moving the decoder to execute state");
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateExecuting;
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateExecuting,NULL);
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_STOP_DONE:
11088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 != VDEC_S_SUCCESS) {
11118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->complete_pending_buffer_done_cbs();
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
11168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                // Send the callback now
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = OMX_StateIdle;
11208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("Move to Idle State");
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete,OMX_CommandStateSet,
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_StateIdle,NULL);
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
11338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PORT_RECONFIG");
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 == OMX_IndexParamPortDefinition) {
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->in_reconfig = true;
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_EventPortSettingsChanged, p1, p2, NULL );
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive) {
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_INTERLACETYPE format = (OMX_INTERLACETYPE)-1;
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_EVENTTYPE event = (OMX_EVENTTYPE)OMX_EventIndexsettingChanged;
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameTopFieldFirst;
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else if (pThis->drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            format = OMX_InterlaceInterleaveFrameBottomFieldFirst;
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else //unsupported interlace format; raise a error
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            event = OMX_EventError;
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    event, format, 0, NULL );
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EOS_DONE:
11648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->prev_ts = LLONG_MAX;
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->rst_prev_ts = true;
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
11768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->omx_report_error ();
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG:
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    {
11818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG");
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pThis->m_cb.EventHandler) {
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_EVENTTYPE)OMX_EventIndexsettingChanged, OMX_CORE_OUTPUT_PORT_INDEX, 0, NULL );
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
119461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pThis->m_state != OMX_StatePause)
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (qsize>0);
1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
12026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::update_resolution(int width, int height)
12036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
12046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_height = height;
12056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_width = width;
12066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.scan_lines = height;
12076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.stride = width;
12086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nLeft = 0;
12096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nTop = 0;
12106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nWidth = drv_ctx.video_resolution.frame_width;
12116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    rectangle.nHeight = drv_ctx.video_resolution.frame_height;
12126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentInit
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Initialize the component.
1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_fmtdesc fdesc;
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0;
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fds[2];
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r,ret=0;
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool codec_ambiguous = false;
12448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_STRING device_name = (OMX_STRING)DEVICE_NAME;
12458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Opening device %s", device_name);
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_init(): Open device %s returned fd %d, errno %d",
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            device_name, drv_ctx.video_driver_fd, errno);
125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd == 0) {
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = open(device_name, O_RDWR);
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd < 0) {
12568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_denominator = 1;
1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
12626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    ret = pthread_create(&async_thread_id,0,async_message_thread,this);
126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret < 0) {
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.video_driver_fd);
12658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputBufferFile1 = fopen (outputfilename, "ab");
1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputExtradataFile = fopen (ouputextradatafilename, "ab");
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Copy the role information which provides the decoder kind
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.timestamp_adjust = true;
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_MPEG4;
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG4*/
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG4;
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "m4v");
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_MPEG2;
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG2*/
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG2;
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "mpg");
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
13128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("H263 Decoder selected");
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingH263;
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_H263;
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H263;
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "263");
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX_311;
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
13558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = createDivxDrmContext();
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet != OMX_ErrorNone) {
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("createDivxDrmContext Failed");
136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_H264;
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingAVC;
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H264;
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "264");
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_HEVC;
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_HEVC;
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
13906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef INPUT_BUFFER_LOG
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "265");
13926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_start_codes (codec_type_parse);
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(inputfilename, "vc1");
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",\
141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_VP8;
14195aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingVP8;
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VP8;
142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        arbitrary_bytes = false;
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
14238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    inputBufferFile1 = fopen (inputfilename, "ab");
1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
14326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        OMX_COLOR_FORMATTYPE dest_color_format = (OMX_COLOR_FORMATTYPE)
14336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
14346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (!client_buffers.set_color_format(dest_color_format)) {
14358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setting color format failed");
14366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            eRet = OMX_ErrorInsufficientResources;
14376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
1438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capture_capability= V4L2_PIX_FMT_NV12;
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = subscribe_to_events(drv_ctx.video_driver_fd);
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
14428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Subscribe Event Failed");
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_capability cap;
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
14498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to query capabilities");
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
14538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    " version = %d, capabilities = %x", cap.driver, cap.card,
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    cap.bus_info, cap.version, cap.capabilities);
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=0;
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
14608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        update_resolution(320, 240);
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
14808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on output port");
148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
14828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_ambiguous) {
148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (output_capability == V4L2_PIX_FMT_DIVX) {
148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control divx_ctrl;
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ret) {
14988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to set divx version");
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
15128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on capture port");
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
15148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = 1;
15188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ret) {
15218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(drv_ctx.video_driver_fd);
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Get the Buffer requirements for input and output ports*/
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_1M;
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_1M;
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.alignment=SZ_4K;
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf.alignment=SZ_4K;
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata = 0;
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.idr_only_decoding = 0;
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        m_state = OMX_StateLoaded;
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
15476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (eRet == OMX_ErrorNone && !secure_mode)
15486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            enable_extradata(DEFAULT_EXTRADATA, true, true);
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
15506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet=get_buffer_req(&drv_ctx.ip_buf);
15518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Input Buffer Size =%d",drv_ctx.ip_buf.buffer_size);
15526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        get_buffer_req(&drv_ctx.op_buf);
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC) {
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen = 0;
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nOffset = 0;
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.pBuffer == NULL) {
15618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_frame_parser.mutils == NULL) {
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils = new H264_Utils();
156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils == NULL) {
15718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInsufficientResources;
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->initialize_frame_checking_environment();
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_parser = new h264_stream_parser();
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!h264_parser) {
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pipe(fds)) {
15878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("pipe creation failed");
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int temp1[2];
159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (fds[0] == 0 || fds[1] == 0) {
159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pipe (temp1)) {
15938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("pipe creation failed");
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
15956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[0]);
159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //close (fds[1]);
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[0] = temp1 [0];
159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fds[1] = temp1 [1];
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_in = fds[0];
160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_out = fds[1];
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            r = pthread_create(&msg_thread_id,0,message_thread,this);
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (r < 0) {
16068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("component_init(): message_thread creation failed");
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
16116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone) {
16138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Component Init Failed");
16148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Calling VDEC_IOCTL_STOP_NEXT_MSG");
161561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NULL);
16178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Calling close() on Video Driver");
161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close (drv_ctx.video_driver_fd);
161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.video_driver_fd = -1;
162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
16218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("omx_vdec::component_init() success");
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetComponentVersion
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the component version.
1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   TBD.
1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX_ErrorNone.
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(
164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp,
164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName,
164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion,
164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion,
164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID
164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan )
1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
16518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
165461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* TBD -- Return the proper version */
165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (specVersion) {
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        specVersion->nVersion = OMX_SPEC_VERSION;
165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
1659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
166261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
167161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
16808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
16828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
16878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "to invalid port: %lu", param1);
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
16938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Command Processed");
1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
1700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
1703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
1716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int bFlag = 1,sem_posted = 0,ret=0;
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
17228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_state, eState);
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (cmd == OMX_CommandStateSet) {
17268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
17278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Loaded */
173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_state == OMX_StateLoaded) {
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //if all buffers are allocated or all ports disabled
173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (allocate_done() ||
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
17368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
17388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Loaded */
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
17468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to WaitForResources */
175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
17558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Executing */
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
17598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Pause */
176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
17668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Invalid */
177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
17738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
17778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eState);
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is IDLE */
178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateIdle) {
178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (release_done()) {
178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       Since error is None , we will post an event at the end
179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       of this function definition
179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     */
17938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
17958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Executing */
180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
18038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
18068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state=OMX_StateExecuting;
18088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Idle */
181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
18128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to WaitForResources */
181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
18198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Pause */
182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*To pause the Video core we need to start the driver*/
182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
182861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      NULL) < */0) {
18298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
18348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
183661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Invalid */
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
18408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
18448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1847dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Executing */
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateExecuting) {
18538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Idle */
185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition
185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 */
18598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Paused */
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
18708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("PAUSE Command Issued");
187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StatePause;
187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Loaded */
187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
18768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to WaitForResources */
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
18838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Executing */
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Invalid */
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
18978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
19018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Pause  */
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StatePause) {
190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Executing */
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateExecuting) {
19118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Executing");
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StateExecuting;
191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Idle */
191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
19198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Idle");
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to loaded */
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
19308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> loaded");
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to WaitForResources */
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
19378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Pause */
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
19448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Pause");
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Invalid */
195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
19518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Invalid");
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
19558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is WaitForResources  */
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateWaitForResources) {
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded */
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
19678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to WaitForResources */
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Executing */
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
19788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Pause */
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
19858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Invalid */
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
19928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded -
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               is NOT tested by Khronos TS */
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
20008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /********************************/
200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Current State is Invalid */
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*******************************/
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (m_state == OMX_StateInvalid) {
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* State Transition from Inavlid to any state */
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StateIdle || OMX_StateExecuting
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StatePause || OMX_StateInvalid)) {
20128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_EventError,OMX_ErrorInvalidState,\
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInvalidState;
2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandFlush) {
20188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!sem_posted) {
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_posted = 1;
20288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Semaphore");
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_post (&m_cmd_lock);
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            execute_omx_flush(param1);
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bFlag = 0;
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( cmd == OMX_CommandPortEnable) {
20348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_TRUE;
203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || allocate_input_done()) {
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
20458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
20528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Enable output Port command recieved");
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_TRUE;
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || (allocate_output_done())) {
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
20628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandPortDisable) {
20698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "with param1: %lu", param1);
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_FALSE;
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_input_done()) {
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_FALSE;
20938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Disable output Port command recieved");
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_output_done()) {
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
21148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone && bFlag) {
211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!sem_posted) {
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sem_post(&m_cmd_lock);
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ExecuteOmxFlush
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Executes the OMX flush.
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   flushtype - input flush(1)/output flush(0)/ both.
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("in %s", __func__);
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (flushType) {
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_INPUT_PORT_INDEX:
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT;
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_CORE_OUTPUT_PORT_INDEX:
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input_flush_progress = true;
216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            output_flush_progress = true;
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT |
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
21678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Flush Port (%lu) Failed ", flushType);
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = false;
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
217761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT.
2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
218061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate FBD for all Buffers in the FTBq*/
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
21948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Output Flush");
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
21968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer queue size %d pending buf cnt %d",
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_ftb_q.m_size,pending_output_buffers);
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
21998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ID(%x) P1(%x) P2(%x)", ident, p1, p2);
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == m_fill_output_msg ) {
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress = false;
220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
22138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
222061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT.
2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
222361a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned       i =0;
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p1 = 0; // Parameter - 1
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      p2 = 0; // Parameter - 2
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned      ident = 0;
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate EBD for all Buffers in the ETBq*/
22378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Input Flush");
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
22408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Check if the Queue is empty");
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
22458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_input_buffers++;
22498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
22538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p1);
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.flush_timestamp();
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Check if Heap Buffers are to be flushed*/
22608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (arbitrary_bytes && !(codec_config_flag)) {
22618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Reset all the variables before flusing");
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
22708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Initialize parser");
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (m_input_pending_q.m_size) {
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&p1,&p2,&ident);
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned int)NULL,
228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned int)NULL);
228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
22928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (codec_config_flag) {
22938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
22948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "is not sent to the driver yet");
229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress = false;
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
23078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommandEvent
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Send the event to decoder pipe.  This is needed to generate the callbacks
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   in decoder thread context.
2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::post_event(unsigned int p1,
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int p2,
232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int id)
2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet      =                      false;
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (id == m_fill_output_msg ||
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_FBD) {
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,id);
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_EBD ||
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,id);
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cmd_q.insert_entry(p1,p2,id);
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet = true;
23488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_message(this, id);
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNoMore;
235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!profileLevelType)
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profileLevelType->nPortIndex == 0) {
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 2) {
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel4;
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // TODO
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
23828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d",
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        profileLevelType->nProfileIndex);
238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
23918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
24028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
24158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %lu", profileLevelType->nProfileIndex);
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
24208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %lu", profileLevelType->nPortIndex);
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetParameter
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
243161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Parameter method implementation
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
243461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if successful.
2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     paramData)
2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
24468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter:");
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
24488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid State");
2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
24528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
24608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = update_portdef(portDefn);
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone)
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_port_def = *portDefn;
246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoInit:
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *portParamType =
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
24708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nSize = sizeof(portParamType);
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nPorts           = 2;
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portParamType->nStartPortNumber = 0;
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
24828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt->nSize             = sizeof(portFmt);
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == portFmt->nPortIndex) {
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex) {
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eCompressionFormat = eCompressionFormat;
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
24938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore compression formats");
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (1 == portFmt->nPortIndex) {
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (0 == portFmt->nIndex)
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (1 == portFmt->nIndex)
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat = OMX_COLOR_FormatYUV420Planar;
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
25068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore Color formats");
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =  OMX_ErrorNoMore;
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
25098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("returning %d", portFmt->eColorFormat);
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
25118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portFmt->nPortIndex);
251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamAudioInit:
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *audioPortParamType =
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
25228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nSize = sizeof(audioPortParamType);
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nPorts           = 0;
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                audioPortParamType->nStartPortNumber = 0;
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamImageInit:
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PORT_PARAM_TYPE *imagePortParamType =
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PORT_PARAM_TYPE *) paramData;
25348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nSize = sizeof(imagePortParamType);
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nPorts           = 0;
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                imagePortParamType->nStartPortNumber = 0;
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Component should support this port definition*/
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamOtherInit:
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role->nSize = sizeof(*comp_role);
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_MAX_STRINGNAME_SIZE);
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmType =
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PRIORITYMGMTTYPE *) paramData;
25698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                priorityMgmType->nSize = sizeof(priorityMgmType);
2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Added for parameter test */
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
25808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nSize = sizeof(bufferSupplierType);
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (0 == bufferSupplierType->nPortIndex)
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (1 == bufferSupplierType->nPortIndex)
258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
25968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        paramIndex);
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelQuerySupported:
261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = get_supported_profile_level_for_1080p(profileLevelType);
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (secure_mode) {
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                GRALLOC_USAGE_PRIVATE_UNCACHED);
263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | GRALLOC_USAGE_PRIVATE_UNCACHED);
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
26428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("nativeBuffersUsage->nUsage %x", (unsigned int)nativeBuffersUsage->nUsage);
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
26458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
26548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet =OMX_ErrorUnsupportedIndex;
265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
26608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_width,
266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_height,
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.stride,
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.scan_lines);
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((params == NULL) ||
267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer == NULL) ||
267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer->handle == NULL) ||
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !m_enable_android_native_buffers)
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = (OMX_U8*)mmap(0, handle->size,
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer == MAP_FAILED) {
269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::Setparameter
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
270661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Parameter method implementation.
2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        paramData)
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
27206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    int ret=0;
27216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    struct v4l2_format fmt;
272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
27238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
27278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((m_state != OMX_StateLoaded) &&
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_TRUE) &&
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_inp_bEnabled == OMX_TRUE)) {
27358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //been called.
27458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameHeight,
274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (int)portDefn->format.video.nFrameWidth);
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (OMX_DirOutput == portDefn->eDir) {
27498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_display_id = portDefn->format.video.pNativeWindow;
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    unsigned int buffer_size;
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!client_buffers.get_buffer_req(buffer_size)) {
27538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error in getting buffer requirements");
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = set_buffer_req(&drv_ctx.op_buf);
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (eRet == OMX_ErrorNone)
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                m_port_def = *portDefn;
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
27648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%lu: %lu)",
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.op_buf.mincount, drv_ctx.op_buf.buffer_size,
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->nBufferCountActual, portDefn->nBufferSize);
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (OMX_DirInput == portDefn->eDir) {
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // Frame rate only should be set if this is a "known value" or to
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // activate ts prediction logic (arbitrary mode only) sending input
277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        // timestamps with max value (LLONG_MAX).
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %lu",
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.xFramerate >> 16);
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_denominator);
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!drv_ctx.frame_rate.fps_numerator) {
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = 30;
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (drv_ctx.frame_rate.fps_denominator)
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator = (int)
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_denominator = 1;
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator;
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                frm_int, drv_ctx.frame_rate.fps_numerator /
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (float)drv_ctx.frame_rate.fps_denominator);
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
27948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.video_resolution.frame_height !=
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameHeight ||
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.video_resolution.frame_width  !=
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->format.video.nFrameWidth) {
27998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("SetParam IP: WxH(%d x %d)",
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth,
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameHeight);
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->format.video.nFrameHeight != 0x0 &&
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->format.video.nFrameWidth != 0x0) {
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            update_resolution(portDefn->format.video.nFrameWidth,
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->format.video.nFrameHeight);
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            fmt.fmt.pix_mp.pixelformat = output_capability;
28108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (ret) {
28138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Set Resolution failed");
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = OMX_ErrorUnsupportedSetting;
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                eRet = get_buffer_req(&drv_ctx.op_buf);
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (~(buffer_prop->alignment - 1));
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = set_buffer_req(buffer_prop);
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
28268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%lu: %lu)",
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ip_buf.mincount, drv_ctx.ip_buf.buffer_size,
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portDefn->nBufferCountActual, portDefn->nBufferSize);
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->eDir ==  OMX_DirMax) {
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)portDefn->nPortIndex);
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret=0;
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
28448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->eColorFormat);
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (1 == portFmt->nPortIndex) {
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.pixelformat = capture_capability;
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    enum vdec_output_fromat op_format;
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) ||
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar))
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else if (portFmt->eColorFormat ==
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_COLOR_FORMATTYPE)
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka)
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        op_format = VDEC_YUV_FORMAT_TILE_4x2;
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorBadParameter;
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.output_format = op_format;
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ret) {
28688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Set output format failed");
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            /*TODO: How to handle this case */
287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = get_buffer_req(&drv_ctx.op_buf);
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (eRet == OMX_ErrorNone) {
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
28778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("Set color format failed");
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorBadParameter;
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPortDefn:
2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
28898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %d",
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        portFmt->nFramePackingFormat);
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Input port */
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == 0) {
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (secure_mode) {
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = false;
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode in secure session");
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            eRet = OMX_ErrorUnsupportedSetting;
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            arbitrary_bytes = true;
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (portFmt->nFramePackingFormat ==
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        arbitrary_bytes = false;
290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %lu",
290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nFramePackingFormat);
290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
29118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_out_mem_region_smi = OMX_TRUE;
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
29178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_use_output_pmem = OMX_TRUE;
291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole:
29266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_COMPONENTROLETYPE *comp_role;
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
29298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        comp_role->cRole);
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ((m_state == OMX_StateLoaded)&&
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Set Parameter called in valid state");
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
29368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((char*)comp_role->cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) {
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ) {
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) {
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet =OMX_ErrorUnsupportedSetting;
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!strncmp((const char*)comp_role->cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (!strncmp((const char*)comp_role->cRole,"video_decoder.vpx",OMX_MAX_STRINGNAME_SIZE))) {
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        strlcpy((char*)m_cRole,"video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
29988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
30028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorInvalidComponentName;
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
30066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt:
3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state != OMX_StateLoaded) {
30118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorIncorrectStateOperation;
301361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
30158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %d",
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupID);
3017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
30188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %d",
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        priorityMgmtype->nGroupPriority);
3020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
3023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier:
30286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            {
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
30308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufferSupplierType->eBufferSupplier);
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2:
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
30628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        paramIndex);
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDecoderPictureOrder:
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int pic_order,rc=0;
30728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pictureOrder->eOutputPictureOrder);
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadParameter;
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (eRet == OMX_ErrorNone) {
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = pic_order;
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
30868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Set picture order failed");
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamConcealMBMapExtraData:
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
30978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamFrameInfoExtraData:
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode)
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ((QOMX_ENABLETYPE *)paramData)->bEnable);
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else {
31078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("secure mode setting not supported");
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamInterlaceExtraData:
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
31178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamH264TimeInfo:
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode)
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else {
31268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("secure mode setting not supported");
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDivx:
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPlatformPvt:
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
31378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_pvt_entry_pmem = OMX_TRUE;
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
31458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_use_output_pmem = OMX_TRUE;
314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc;
315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.idr_only_decoding = 1;
315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
31638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Set picture order failed");
316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (rc) {
31708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Sync frame setting failed");
317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamIndexExtraDataType:
317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->bEnabled == OMX_TRUE) &&
318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (extradataIndexType->nPortIndex == 1)) {
31848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableSmoothStreaming:
3192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control control;
319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                control.value = 1;
319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc < 0) {
319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Need to allow following two set_parameters even in Idle
320661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * state. This is ANDROID architecture which is not in sync
320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * with openmax standard. */
320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (enableNativeBuffers) {
321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_enable_android_native_buffers = enableNativeBuffers->enable;
321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = use_android_native_buffer(hComp, paramData);
321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableTimeStampReorder:
322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int =0;
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(true);
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else
323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        time_stamp_dts.set_timestamp_reorder_mode(false);
323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_dts.set_timestamp_reorder_mode(false);
323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (reorder->bEnable == OMX_TRUE) {
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorUnsupportedSetting;
323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
32418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorUnsupportedIndex;
324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetConfig
3251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Config Method implementation.
3254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
3260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     configData)
3265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
32698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)configIndex) {
327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigInterlaced:
327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (configFmt->nPortIndex == 1) {
327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (configFmt->nIndex == 0) {
328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 1) {
328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else if (configFmt->nIndex == 2) {
328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        configFmt->eInterlaceType =
328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
32898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                " NoMore Interlaced formats");
329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eRet = OMX_ErrorNoMore;
329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
32948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (int)configFmt->nPortIndex);
329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorBadPortIndex;
329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                decoderinstances->nNumOfInstances = 16;
330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigVideoFramePackingArrangement:
330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
331161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->get_frame_pack_data(configFmt);
331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonOutputCrop:
332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
332161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
33278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
333761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetConfig
3339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Config method implementation
3342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        configData)
3352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
33548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_VIDEO_CONFIG_NALSIZE *pNal;
336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Set Config Called");
336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateExecuting) {
33648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("set_config:Ignore in Exe state");
336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (configIndex == (OMX_INDEXTYPE)OMX_IndexVendorVideoExtraData) {
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_VENDOR_EXTRADATATYPE *config = (OMX_VENDOR_EXTRADATATYPE *) configData;
33708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData called");
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc")) {
33728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Index OMX_IndexVendorVideoExtraData AVC");
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 extra_size;
337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Parsing done here for the AVC atom is definitely not generic
337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Currently this piece of code is working, but certainly
337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // not tested with all .mp4 files.
337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Incase of failure, we might need to revisit this
337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // for a generic piece of code.
337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Retrieve size of NAL length field
338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // byte #4 contains the size of NAL lenght field
338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_length = (config->pData[4] & 0x03) + 1;
338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_size = 0;
338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (nal_length > 2) {
338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Presently we assume that only one SPS and one PPS in AvC1 Atom */
338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extra_size = (nal_length - 2) * 2;
338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // SPS starts from byte #6
339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pSrcBuf = (OMX_U8 *) (&config->pData[6]);
339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 *pDestBuf;
3393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 6 --> SPS starts from byte #6
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // minus 1 --> picture param set byte to be ignored from avcatom
339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.nDataSize = config->nDataSize - 6 - 1 + extra_size;
339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc(m_vendor_config.nDataSize);
339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U32 len;
340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            OMX_U8 index = 0;
340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // case where SPS+PPS is sent as part of set_config
340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pDestBuf = m_vendor_config.pData;
340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
34048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Rxd SPS+PPS nPortIndex[%d] len[%d] data[0x%x]",
340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nPortIndex,
340661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.nDataSize,
340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_vendor_config.pData);
340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (index < 2) {
340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                uint8 *psize;
341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = *pSrcBuf;
341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = len << 8;
341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len |= *(pSrcBuf + 1);
341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psize = (uint8 *) & len;
341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(pDestBuf + nal_length, pSrcBuf + 2,len);
341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                for (unsigned int i = 0; i < nal_length; i++) {
341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pDestBuf[i] = psize[nal_length - 1 - i];
341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //memcpy(pDestBuf,pSrcBuf,(len+2));
341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pDestBuf += len + nal_length;
342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf += len + 2;
342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index++;
342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pSrcBuf++;   // skip picture param set
342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                len = 0;
342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4") ||
342661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2")) {
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nPortIndex = config->nPortIndex;
3428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_vendor_config.nDataSize = config->nDataSize;
342961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_vendor_config.pData = (OMX_U8 *) malloc((config->nDataSize));
343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(m_vendor_config.pData, config->pData,config->nDataSize);
343161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strcmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1")) {
343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_vendor_config.pData) {
343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_vendor_config.pData);
343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = NULL;
343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = 0;
343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (((*((OMX_U32 *) config->pData)) &
343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        VC1_SP_MP_START_CODE_MASK) ==
344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
34418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 simple/main profile");
344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc(config->nDataSize);
344661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) config->pData) == VC1_AP_SEQ_START_CODE) {
34508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Advance profile");
345161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize = config->nDataSize;
345361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData =
345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_U8 *) malloc((config->nDataSize));
345561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData, config->pData,
345661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        config->nDataSize);
345761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_AP;
345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if ((config->nDataSize == VC1_STRUCT_C_LEN)) {
34598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - VC1 Simple/Main profile struct C only");
346061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nPortIndex = config->nPortIndex;
346161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.nDataSize  = config->nDataSize;
346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vendor_config.pData = (OMX_U8*)malloc(config->nDataSize);
346361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy(m_vendor_config.pData,config->pData,config->nDataSize);
346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_vc1_profile = VC1_SP_MP_RCV;
346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
34668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_config - Error: Unknown VC1 profile");
346761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
346961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
347061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (configIndex == OMX_IndexConfigVideoNalSize) {
347161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
347361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_length = pNal->nNaluBytes;
347461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
34758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d",nal_length);
347661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
348361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
348461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetExtensionIndex
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
348661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
348761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX GetExtensionIndex method implementaion.  <TBD>
3488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
348961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
349261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
349361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
349761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_STRING      paramName,
349861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_INDEXTYPE* indexType)
3499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
350061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
35018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
3502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
350361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode",sizeof("OMX.QCOM.index.param.video.SyncFrameDecodingMode") - 1)) {
3504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName, "OMX.QCOM.index.param.IndexExtraData",sizeof("OMX.QCOM.index.param.IndexExtraData") - 1)) {
3506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
3507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
350961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (!strncmp(paramName,"OMX.google.android.index.enableAndroidNativeBuffers", sizeof("OMX.google.android.index.enableAndroidNativeBuffers") - 1)) {
3510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer2", sizeof("OMX.google.android.index.enableAndroidNativeBuffer2") - 1)) {
3512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.useAndroidNativeBuffer", sizeof("OMX.google.android.index.enableAndroidNativeBuffer") - 1)) {
35148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
3515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(paramName,"OMX.google.android.index.getAndroidNativeBufferUsage", sizeof("OMX.google.android.index.getAndroidNativeBufferUsage") - 1)) {
3517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
3518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
35218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
3522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
3523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
3525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetState
3530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
353261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the state information back to the caller.<TBD>
3533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
353561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
353761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
353861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if everything is successful.
353961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
354161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_STATETYPE* state)
3542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
354361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *state = m_state;
35448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
354561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
3546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
354961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
355061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentTunnelRequest
3551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Tunnel Request method implementation. <TBD>
3554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
355661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
3560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE                hComp,
356361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
356461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        peerComponent,
356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                    peerPort,
356661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
3567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
35688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
356961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
3570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
357361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseOutputBuffer
3575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
357661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for Use buffer in the input pin
3578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
357961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
3584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
35866eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata()
35876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
35886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
358961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.buffer_size) {
359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
359561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
35968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate extradata memory size %d", drv_ctx.extradata_info.size);
359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
359861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size, 4096,
359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.ion_alloc_data,
360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
360161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
36028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
360461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size,
360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED,
360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
360961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
36108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory");
361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
361261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
361461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(drv_ctx.extradata_info.uaddr, 0, drv_ctx.extradata_info.size);
361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
36196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata()
362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
36236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.uaddr) {
362561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&drv_ctx.extradata_info.ion);
362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
36306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
36316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
36326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
3633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_output_buffer(
363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
363861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
363961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
364161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
364261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
364361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PTR privateAppData = NULL;
364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    private_handle_t *handle = NULL;
364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buff = buffer;
364861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
36516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
365361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_output_headers();
365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
365861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
366361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
36646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
366761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i >= drv_ctx.op_buf.actualcount) {
36688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
367061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
36716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
367261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
367361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_use_android_native_buffers) {
367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
367761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)nBuf->handle;
367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = params->pAppPrivate;
368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
368161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)buff;
368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
368461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " expected %u, got %lu",
368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size, (OMX_U32)handle->size);
368961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
369061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
369161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
369261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.op_buf.buffer_size = (OMX_U32)handle->size;
369361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_use_android_native_buffers) {
369461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
369561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buff =  (OMX_U8*)mmap(0, handle->size,
369661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
369761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (buff == MAP_FAILED) {
369861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
369961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
370061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
37016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
37026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
37036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_)
370461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].nativehandle = handle;
370561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].privatehandle = handle;
37066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
370761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!handle) {
370861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
370961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
371061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
371161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
371261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].offset = 0;
371361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
371461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size =
371561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
371661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
3717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
371961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!ouput_egl_buffers && !m_use_output_pmem) {
3720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
37218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("allocate output buffer memory size %d", drv_ctx.op_buf.buffer_size);
372261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
372361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
372461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
372561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
372661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
37278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
372861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
372961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
373061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
373161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
3732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
373361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
373461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                      open (MEM_DEVICE,O_RDWR);
3735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
373661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
37378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
373861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
373961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
374161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
374261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
374361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
374461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                          open (MEM_DEVICE,O_RDWR);
374561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
37468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
374761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
374861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
374961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
375161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
375261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size,
375361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.alignment)) {
37548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
375561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
375661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
375761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
375961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
376061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
376161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
376261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                PROT_READ|PROT_WRITE, MAP_SHARED,
376361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
376461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
376561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
3766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
376761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
3768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
37698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
377061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
377161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
377261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
377361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
377461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
377561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
377661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
377761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Use_op_buf: out_pmem=%d",m_use_output_pmem);
377861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!appData || !bytes ) {
377961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && !buffer) {
37808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
378161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
378261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
378361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
378461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
378561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
378661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
378761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
378861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!pmem_list->entryList || !pmem_list->entryList->entry ||
378961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !pmem_list->nEntries ||
379061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
37918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
379261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
379361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
379461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
379561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_list->entryList->entry;
379661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%x",
379761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_info->pmem_fd);
379861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
379961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
380061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
380161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size =
380261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
380361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
3804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
380561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
380661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
380761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
380861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_out_mem_ptr + i );
380961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
381061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
381161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
381261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
381361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
381461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
381661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr,
381761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd );
381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
381961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
382161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
382261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = drv_ctx.op_buf.buffer_size;
382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
382761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = 0;
382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
382961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
383061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
383161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
383261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
383361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
383461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
383561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
383661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
383761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
38388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
3840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
384261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = drv_ctx.num_planes;
384361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
384661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
38478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
385361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enum v4l2_buf_type buf_type;
385461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
385561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
385661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
385761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
385861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = true;
38598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
386061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
386261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
386361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
386461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
386561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
386661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
386761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
386861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = buff;
386961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
387061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->pAppPrivate = privateAppData;
387161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_out_bm_count,i);
387261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
387361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
387761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
387861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::use_input_heap_buffers
3879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
388161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer Heap allocation method implementation.
3882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
388461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
388761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
389261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
389561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
389661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
38988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
389961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
390061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr)
390161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
390361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
390461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_phdr_pmem_ptr)
390561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
390761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficent memory");
391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input_use_buffer = true;
391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
391561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
391661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
391761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
392061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
39218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[m_in_alloc_cnt],
392361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
39248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
392561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
392661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_in_alloc_cnt++;
392861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
392961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
393061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
393161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
393261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
393661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
393761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseBuffer
3938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
394061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer method implementation.
3941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
394361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
394661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
3947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
395061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
395161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
395261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
395361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
395461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
395561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
3956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
395761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE error = OMX_ErrorNone;
395861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
395961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
396061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || bytes == 0) {
396161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && buffer == NULL) {
396261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("bad param 0x%p %ld 0x%p",bufferHdr, bytes, buffer);
396361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
396461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
396561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
396661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
39678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
396861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
396961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
397061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX)
397161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
397261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
397361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
397461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
39758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
397661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = OMX_ErrorBadPortIndex;
397761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
397861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", port, *bufferHdr, error);
397961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error == OMX_ErrorNone) {
398061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
398161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Send the callback now
398261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
398361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandStateSet,OMX_StateIdle,
398461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
398561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
398661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
398761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
398861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
398961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
399061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
399161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
399261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
399361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
399461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
399561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
399661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
399761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
399861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
399961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
400061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return error;
400161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
4002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
400461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
4005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
400661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
400761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr[bufferindex].pBuffer)
400861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free(m_inp_heap_ptr[bufferindex].pBuffer);
400961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
401061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
401161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_bufferHdr)
401261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_input_buffer(pmem_bufferHdr);
401361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
401861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
401961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
402061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
402161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
402361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_inp_mem_ptr;
40248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
402561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
402661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
40278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
402861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer[index].pmem_fd > 0) {
402961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_setbuffer_cmd setbuffers;
403061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
403161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
403261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sizeof (vdec_bufferpayload));
40338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
4034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].pmem_fd);
40358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("unmap the input buffer size=%d  address = %d",
4036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].mmaped_size,
4037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    drv_ctx.ptr_inputbuffer[index].bufferaddr);
403861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
403961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_inputbuffer[index].mmaped_size);
404061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
404161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
404261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
404361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_desc_buffer_ptr[index].buf_addr);
404461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].buf_addr = NULL;
404561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].desc_data_size = 0;
404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
404861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
4049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
405061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
405361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
4057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
405861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
4059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
406161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_out_mem_ptr;
40658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
4066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
406761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.op_buf.actualcount
406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && drv_ctx.ptr_outputbuffer) {
40698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %x", index,
407061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[index].bufferaddr);
4071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
407261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_setbuffer_cmd setbuffers;
407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
4076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
407761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
407861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
408061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[index].mmaped_size);
408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
4084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
408561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
40868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].pmem_fd);
40888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the ouput buffer size=%d  address = %d",
408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
409061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].bufferaddr);
409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
4095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
4097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
409861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
410261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
410361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_extradata();
410461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
41056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
4106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
410761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
4108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
411261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,
411361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              port,
411461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_PTR              appData,
411561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              bytes)
4116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
411761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
411861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Sanity Check*/
412361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL) {
412461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
412561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
412761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr == NULL) {
412861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
412961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
413061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 drv_ctx.ip_buf.actualcount);
413161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
413261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
413361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  drv_ctx.ip_buf.actualcount);
413461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
413561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr == NULL) {
41368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_inp_heap_ptr Allocation failed ");
413761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
413861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
413961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
414061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Find a Free index*/
414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
41448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
414961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
415261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buf_addr == NULL) {
415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
415461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
415561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
415661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_heap_ptr + i);
415761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_heap_inp_bm_count,i);
415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
416061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pBuffer           = (OMX_U8 *)buf_addr;
416161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
416261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
416361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
416461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
416561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
41668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
416761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
41688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
416961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Add the Buffers to freeq*/
417061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned)m_phdr_pmem_ptr[i],
417161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
41728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
417361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
417461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
417561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
417661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
417761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
417861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
417961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputBuffer
4187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
418961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for allocate buffer in the input pin
4190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
419261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
421061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
421161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int pmem_fd = -1;
4212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bytes != drv_ctx.ip_buf.buffer_size) {
42148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Requested Size is wrong %d epected is %d",
421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bytes, drv_ctx.ip_buf.buffer_size);
421661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
421961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_mem_ptr) {
42208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%d)",
422161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.actualcount,
422261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size);
4223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
422561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
4226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
422761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_mem_ptr == NULL) {
422861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
422961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
423261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
4233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
423461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer == NULL) {
423561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
423661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
423861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
423961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
4240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info == NULL) {
424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
424361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
4248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
4250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
425561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
42568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
426161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
426261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_buffer buf;
426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_plane plane;
426461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
42656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
42678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate input Buffer size %d", drv_ctx.ip_buf.buffer_size);
426861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
426961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
427061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
427161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ? ION_SECURE : 0);
427261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
427361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
427461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
427561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
4276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
42808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
42888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
428961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
429061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
429161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
429361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
429461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.alignment)) {
42958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
429661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
429761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
430161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_addr = (unsigned char *)mmap(NULL,
430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.buffer_size,
430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
4304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf_addr == MAP_FAILED) {
430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
4309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
43108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
431361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
431461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_mem_ptr + i);
431561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
431661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
431761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
432161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].offset = 0;
432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
432861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = 0;
432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
433161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[1] = 0;
433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = &plane;
433561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
433661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_inputbuffer[i]);
433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
433961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
434061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
434161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
43428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
434361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
434461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
4345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
434761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
434861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_inp_bm_count,i);
43498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
435061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
435161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer = (OMX_U8 *)drv_ctx.ptr_inputbuffer [i].pmem_fd;
435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
435361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            input->pBuffer           = (OMX_U8 *)buf_addr;
435461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
435661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
435761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
435861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
436061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.disable_dmx) {
436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_desc_buffer(i);
436361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
436461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
43658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
436761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
437461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputBuffer
4375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
437761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper fn for AllocateBuffer in the output pin
4378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
438061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
4381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
438361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went well.
4384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
438961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
439061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
439161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
4392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
439361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
439461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
439561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
439661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
439761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
4398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
439961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_device_fd =-1;
440061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_allocation_data ion_alloc_data;
440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_fd_data fd_ion_data;
4402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
44048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%d)",
440561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount,
440661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size);
440761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
440861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
440961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
441061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
441161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int pmem_fd = -1;
441261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
441361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
442061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
442261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
442661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
442761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
442961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
443361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
44348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
4436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
44378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("allocate outputBuffer size %d",drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount);
443861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
443961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.alignment,
444161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &ion_alloc_data, &fd_ion_data, secure_mode ? ION_SECURE : 0);
444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ion_device_fd < 0) {
444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = fd_ion_data.fd;
4446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
4448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
44508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.buffer_size);
445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
445561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
445661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
4457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
445861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
44598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
446161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
446261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.actualcount,
446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.alignment)) {
44688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
446961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
447461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (drv_ctx.op_buf.buffer_size *
447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     drv_ctx.op_buf.actualcount),
447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_baseaddress == MAP_FAILED) {
44798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("MMAP failed for Size %d",
448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size);
448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
4482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
4484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
449861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
4499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),
450261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          drv_ctx.op_buf.actualcount);
4503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
450761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[0].mmaped_size =
450861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.op_buf.buffer_size *
450961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 drv_ctx.op_buf.actualcount);
451061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
451161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
451261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
451361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
451461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
451561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
451661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
451761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
451861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
451961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
452261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
45238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
45248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
452761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
452861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
452961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = bytes;
453061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
453161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = appData;
453261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
453361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Platform specific PMEM Information
453461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform Entry
45358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
453661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
453761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
453861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
453961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
454061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
454161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
454261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
454361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOffset            = 0;
454461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
454561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
454661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
454761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
454861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
454961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
455061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_pmem_info[i].pmem_fd = pmem_fd;
4551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
455261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
455361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
455461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
4555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
4556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
456161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
456261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pmem_fd = %d offset = %d address = %p",
456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_fd, drv_ctx.ptr_outputbuffer[i].offset,
456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
457061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
45758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
457861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
458761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
459461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
45958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
459761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
460061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
460461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
46088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
461361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
461461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i < drv_ctx.op_buf.actualcount) {
461561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_buffer buf;
461661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_plane plane[VIDEO_MAX_PLANES];
461761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int rc;
461861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
462061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].buffer_len =
462161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size;
462261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (secure_mode) {
462561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
462961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.index = i;
463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
463161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.memory = V4L2_MEMORY_USERPTR;
463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].length = drv_ctx.op_buf.buffer_size;
463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
46356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
463661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
46376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
463861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
463961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].data_offset = 0;
464061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
464161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
464261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
464361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
4644b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION
464561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
4646b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif
464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].data_offset = 0;
464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (extra_idx >= VIDEO_MAX_PLANES) {
46508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
465161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
465261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
465361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.m.planes = plane;
465461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.length = drv_ctx.num_planes;
46558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %x", i, drv_ctx.ptr_outputbuffer[i]);
465661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
465761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
465861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
466261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enum v4l2_buf_type buf_type;
466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
466661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
466761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
466861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
466961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    streaming[CAPTURE_PORT] = true;
46708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("STREAMON Successful");
467161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
467261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
467361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
467461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
467561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pAppPrivate = appData;
467661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
467761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
46788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
467961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
468061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
4681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
4688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
468961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
469061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateBuffer
4691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
469261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
469361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
4694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
469561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
469661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
469961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
470461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
470561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                       bytes)
4707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
4709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
4710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
47138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
4714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
4715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
471761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
471861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
471961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
472061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
472161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
472261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
472361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
47246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
47256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                appData,bytes);
472661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
47278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
472861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
4729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
473161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
473261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done()) {
473361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
4734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
4735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
4736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
473761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
474061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
474161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
474261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
474361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,
4744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
4745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
474661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
4747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
474861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
474961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
475061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
4751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
475261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_CORE_OUTPUT_PORT_INDEX,
475361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
4754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
4755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
47578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
4758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
4762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
476361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
476461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FreeBuffer
4765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
476661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
4767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
476861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
476961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
477161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
477261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
4773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
477461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
477661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                 port,
477761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
47818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In for decoder free_buffer");
4782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
478361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateIdle &&
478461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
47858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
478661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
478761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
47888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d disabled", port);
478961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
479061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
479161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
479261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
47938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %d enable pending", port);
479461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
4796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
479761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
479861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
480161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state != OMX_StateInvalid) {
48028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
4803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
480461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
480561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
4806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
480861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
480961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if arbitrary bytes*/
481061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!arbitrary_bytes && !input_use_buffer)
481161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_mem_ptr;
481261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
481361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_heap_ptr;
4814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
481661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.ip_buf.actualcount) {
481761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Clear the bit associated with it.
481861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
481961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
482061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (input_use_buffer == true) {
482161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
48228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
482361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_phdr_pmem_ptr)
482461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
482561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
482661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (arbitrary_bytes) {
482761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_phdr_pmem_ptr)
482861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
482961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
483061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,NULL);
483161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
483261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(buffer);
4833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
483461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bPopulated = OMX_FALSE;
483561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Free the Buffer Header*/
483661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_input_done()) {
48378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
483861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer_header();
483961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
484061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
48418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
4842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
484561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
484661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_input_done()) {
48478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
4848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
4849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
485061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
485161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
485361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
4854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
48556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
485661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nPortIndex < drv_ctx.op_buf.actualcount) {
48578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
4858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
4859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
4860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
48616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            client_buffers.free_output_buffer (buffer);
4862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
486361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_output_done()) {
486461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_output_buffer_header();
4865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
486661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
48678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
4868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
4869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
487061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
487161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_output_done()) {
48728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
4873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
487561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
48766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
487761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_enable_android_native_buffers) {
487861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
487961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
488061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
48816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
4882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
488361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortDisable,
488461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
488561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
488761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
4888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
4889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
489061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eRet == OMX_ErrorNone) &&
489161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
489261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_done()) {
4893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
4894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
4895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
489661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
4897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
4898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
4899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
4900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
490461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
490561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::EmptyThisBuffer
4906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
490761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
490861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
490961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
4910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
491261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
4913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
491561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
4916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
491761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
491961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
4920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
492161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
492261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
4923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
49248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
49258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_config_flag = true;
49268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
49278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
492861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
49298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
493061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
493161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
49348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
493861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_bEnabled) {
49398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
494161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
494361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
49448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %lu", buffer->nInputPortIndex);
494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
494661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_
494961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_ERRORTYPE drmErr = iDivXDrmDecrypt->Decrypt(buffer);
495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drmErr != OMX_ErrorNone) {
495261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // this error can be ignored
49538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR:iDivXDrmDecrypt->Decrypt %d", drmErr);
495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
495561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif //_ANDROID_
495761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!latency) {
495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.stop();
496061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            latency = dec_time.processing_time_us();
496161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.start();
496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
496361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
496561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufferIndex = buffer - m_inp_heap_ptr;
496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
496861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_heap_ptr;
497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
497161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = &m_inp_mem_ptr[nBufferIndex];
497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %d",
497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, buffer->nFilledLen);
497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_mem_ptr;
497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nBufferIndex > drv_ctx.ip_buf.actualcount ) {
49828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
498461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
498561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,
499061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(buffer->nTimeStamp);
499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned)hComp,(unsigned)buffer,OMX_COMPONENT_GENERATE_ETB);
499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
499761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
499861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/* ======================================================================
500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::empty_this_buffer_proxy
500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
500661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
500961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
501461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE         hComp,
501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
501761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int push_cnt = 0,i=0;
501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
502061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_input_frameinfo frameinfo;
502161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
502261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_seqheader seq_header;
502361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool port_setting_changed = true;
502461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool not_coded_vop = false;
502561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
502661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Should we generate a Aync error event*/
502761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
50288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
502961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
503061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
503161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
503261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
503361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
503461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nPortIndex > drv_ctx.ip_buf.actualcount) {
50358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
503661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPortIndex);
503761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
503861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
503961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
504061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers++;
504161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
504261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
504361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
504461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
50458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer");
504661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
504761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
504861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
504961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
505261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec_type_parse == CODEC_TYPE_MPEG4 || codec_type_parse == CODEC_TYPE_DIVX) {
505361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4StreamType psBits;
505461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.data = (unsigned char *)(buffer->pBuffer + buffer->nOffset);
505561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psBits.numBytes = buffer->nFilledLen;
505661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mp4_headerparser.parseHeader(&psBits);
505761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        not_coded_vop = mp4_headerparser.is_notcodec_vop(
505861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
505961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (not_coded_vop) {
50608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Found Not coded vop len %lu frame number %u",
506161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer->nFilledLen,frame_count);
506261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
50638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Eos and Not coded Vop set len to zero");
506461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                not_coded_vop = false;
506561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer->nFilledLen = 0;
506661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
507061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_flush_progress == true
5071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
507261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            || not_coded_vop
5073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
507461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan       ) {
50758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush in progress return buffer ");
507661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
507761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
507861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
507961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
508061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
508261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
508361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_buffer -  drv_ctx.ptr_inputbuffer) > drv_ctx.ip_buf.actualcount) {
508461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
508561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
508661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
508861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*for use buffer we need to memcpy the data*/
508961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer->buffer_len = buffer->nFilledLen;
509061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
509161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (input_use_buffer) {
509261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
509361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (arbitrary_bytes) {
509461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
509561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
509661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
509761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen);
509861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
509961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
510061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
510161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
510261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
510361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
510461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
510561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.bufferaddr = temp_buffer->bufferaddr;
510661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.client_data = (void *) buffer;
510761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.datalen = temp_buffer->buffer_len;
510861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = 0;
510961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = buffer->nOffset;
511061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_fd = temp_buffer->pmem_fd;
511161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_offset = temp_buffer->offset;
511261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = buffer->nTimeStamp;
511361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
511461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: dmx enabled");
511561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_demux_entries == 0) {
511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extract_demux_addr_offsets(buffer);
511761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
511861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
511961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%d",m_demux_entries);
512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        handle_demux_data(buffer);
512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
512261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = NULL;
512561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = 0;
512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
512861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= buffer->nFlags;
5129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
513261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
51348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
513561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
513661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
51378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
513861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
514061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (inputBufferFile1) {
514561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite((const char *)temp_buffer->bufferaddr,
514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp_buffer->buffer_len,1,inputBufferFile1);
514761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
515161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
51568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils)
516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
516561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&plane, 0, sizeof(plane));
517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long  print_count;
517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
51778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
51788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
517961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
518161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
518361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.bytesused = temp_buffer->buffer_len;
518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.length = drv_ctx.ip_buf.buffer_size;
518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)temp_buffer->offset;
518861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = temp_buffer->pmem_fd;
518961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = temp_buffer->offset;
519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.data_offset = 0;
519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frameinfo.timestamp >= LLONG_MAX) {
519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //assumption is that timestamp is in milliseconds
519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
52038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver");
520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorHardware;
520561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
52068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    codec_config_flag = false;
52078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s: codec_config cleared", __FUNCTION__);
52088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
520961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret,r;
521261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
52148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
521661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!ret) {
52178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
522061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
52218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
522361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
522661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%d)",
522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frameinfo.bufferaddr, frameinfo.timestamp, frameinfo.datalen);
523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.insert_timestamp(buffer);
5231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
5233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
523661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
523761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FillThisBuffer
5238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
523961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
524061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
524161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
524361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
524461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
524661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
524761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
524961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
525161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
5252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5253f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    unsigned nPortIndex = buffer - client_buffers.get_il_buf_hdr();
5254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
52568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State");
525761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
525861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
525961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
526061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_bEnabled) {
52618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
526261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
526361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
526461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
526561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL ||
5266f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (nPortIndex >= drv_ctx.op_buf.actualcount)) {
5267f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index,  nPortIndex %u bufCount %u",
5268f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            nPortIndex, drv_ctx.op_buf.actualcount);
526961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
527061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
527161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
527261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
52738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %lu", buffer->nOutputPortIndex);
527461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
527561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
527661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
527761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
527861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_event((unsigned) hComp, (unsigned)buffer, m_fill_output_msg);
527961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
528261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
528361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::fill_this_buffer_proxy
5284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
528561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
528661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
528761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
5288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
528961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
529061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
529261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
529361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
529561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
529761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        hComp,
529861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
5299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
530061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
530161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
530261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
530361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
530461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
530561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
530661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
530761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
530861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5309f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) {
5310f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
5311f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            nPortIndex, drv_ctx.op_buf.actualcount);
531261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
5313f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
531461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
531661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufferAdd, bufferAdd->pBuffer);
531761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Return back the output buffer to client*/
531861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
53198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
532061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
532161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
532261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
532361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
532461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers++;
532561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
532661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
532761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer) {
532861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
532961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
533061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
533161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
533261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
533361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
533461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
533561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_output_buffers--;
533661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
533761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
533861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
533961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
534061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
534261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
534361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
534461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
534561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
534661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
534961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = buffer->nFilledLen;
535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].length = drv_ctx.op_buf.buffer_size;
535161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].m.userptr =
535261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
535561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = 0;
535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
535861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
536061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
53626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
536361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
53646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
536561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
536661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
536761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
53688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx);
536961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
537061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
537161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
537261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = drv_ctx.num_planes;
537361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
537461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
537561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
537661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
537761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
537861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
538261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
538361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetCallbacks
5384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
538661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Set the callbacks.
5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
538861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
538961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
539261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
539661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_CALLBACKTYPE* callbacks,
539761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR             appData)
5398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
540061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_cb       = *callbacks;
54018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
540261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EventHandler,m_cb.FillBufferDone);
540361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data =    appData;
540461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
5405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
540861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
540961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentDeInit
5410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
541161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
541261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destroys the component and release memory allocated to the heap.
5413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
541461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
541561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
541761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
541861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
542061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
542461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete iDivXDrmDecrypt;
5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        iDivXDrmDecrypt=NULL;
5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
5429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    unsigned i = 0;
543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_StateLoaded != m_state) {
54328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
543361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state);
54348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
543561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
54368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
5437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
544061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
54418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Output Memory");
544261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
544361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_output_buffer (&m_out_mem_ptr[i]);
5444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
544561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_
544661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
544761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
545161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr || m_inp_heap_ptr) {
54528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Input Memory");
545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
545461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_inp_mem_ptr)
545561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,&m_inp_mem_ptr[i]);
545661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
545761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer (i,NULL);
5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
546261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer) {
5463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
5464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
5465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
546761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_parser) {
5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
546961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_parser = NULL;
5470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
547261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
5473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
5474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
5475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
547661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_vendor_config.pData) {
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
5479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
5482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
5483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
5485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
5486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
5488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
548961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
549061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
5491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
5495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
549661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // NULL);
54978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Close the driver instance");
54986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
5499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
5500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (inputBufferFile1);
5501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
55036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    if (outputBufferFile1)
550461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fclose (outputBufferFile1);
5505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
5507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fclose (outputExtradataFile);
5508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec::component_deinit() complete");
551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
551461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
551561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseEGLImage
5516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use EGL Image method implementation <TBD>.
5519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
552161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
552361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
552461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Not Implemented error.
5525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
552661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE                hComp,
552861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
553061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
553161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN void*                      eglImage)
5532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
553361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
553461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
553561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
5536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
553861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
553961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    EGLint fd = -1, offset = 0,pmemPtr = 0;
5540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
554161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -1, offset = 0;
5542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
55438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("use EGL image support for decoder");
554461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("");
554661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
554861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_display_id == NULL) {
55498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
5550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
555361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eglGetProcAddress("eglQueryImageKHR");
555461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE_QCOM,&fd);
555561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET_QCOM,&offset);
555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR,&pmemPtr);
5557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
5558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
5559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
5560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
5561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
5562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
5563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
5564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
556561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_egl_id != NULL) {
5566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
5567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
5568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
55718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
5572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.pmem_fd = (OMX_U32) fd;
557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.offset = (OMX_U32) offset;
557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.entry = (void *) &pmem_info;
557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.entryList = &pmem_entry;
557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.nEntries = 1;
558061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = true;
558161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
558361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (OMX_U8 *)pmemPtr)) {
55848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
558561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
559161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
559261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentRoleEnum
5593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
559461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
559561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Role Enum method implementation.
5596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
559761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
559861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
560061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
560161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything is successful.
560261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
560461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_U8*        role,
560561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32        index)
5606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
560761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
5608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
560961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
561061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
561161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
56128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
561361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
561461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
561561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
56208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
56278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
562861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
563061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
563161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
563561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) ) {
563661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
563761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
56388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
563961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
564161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
564261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
564361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
564461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
564561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
56468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
565061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
565261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
56548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
565761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
565861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
566161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ) {
566261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
56648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
566961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
56728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
567361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
56748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
567561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
56788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
567961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
56806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
568161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateDone
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
569261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire buffer pool is allocated by IL Client or not.
569361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Need this to move to IDLE state.
5694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
569661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
5703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
570561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_In = false;
570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_Out = false;
5707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_In = allocate_input_done();
570961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_Out = allocate_output_done();
5710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bRet_In && bRet_Out) {
571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
571361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
571961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputDone
5720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
572261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if I/P buffer pool is allocated by IL Client or not.
5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
572561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
572761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
572861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
5732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
573361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0;
573561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr == NULL) {
573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr ) {
574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; i<drv_ctx.ip_buf.actualcount; i++) {
574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
574361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
574661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i == drv_ctx.ip_buf.actualcount) {
574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_bPopulated = OMX_TRUE;
575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputDone
5758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
575961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
576061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire O/P buffer pool is allocated by IL Client or not.
5761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
576361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
576661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
5767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
5770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned j=0;
577361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
577461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr == NULL) {
577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
577761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount; j++) {
578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
578261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
578561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (j == drv_ctx.op_buf.actualcount) {
578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_bEnabled)
579061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bPopulated = OMX_TRUE;
579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
579361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
579861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseDone
5799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
580161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
580461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
580761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
5811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
5813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (release_input_done()) {
581561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
581761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
581961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseOutputDone
5826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
582861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
583161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
583461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
584161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p",m_inp_mem_ptr);
584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
584461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount ; j++) {
584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
584761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
584961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j == drv_ctx.op_buf.actualcount) {
585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bm_count = 0;
585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_bm_count = 0;
585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
585661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
585761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
586061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
586161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseInputDone
5862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
586461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
5865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
5874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j<drv_ctx.ip_buf.actualcount; j++) {
588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j==drv_ctx.ip_buf.actualcount) {
588661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
588761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
588961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
5892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE * buffer)
5896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
589861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount) {
58998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
590061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (output_flush_progress) {
590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
590361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nTimeStamp = 0;
590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
590661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
591261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers --;
5913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
591461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
59158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Output EOS has been reached");
591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!output_flush_progress)
591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event((unsigned)NULL, (unsigned)NULL,
591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EOS_DONE);
5919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
592161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
592561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
592661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_free_q.insert_entry((unsigned) pdest_frame,(unsigned)NULL,
592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL);
592861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
593061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
59328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In fill Buffer done call address %p ",buffer);
593361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_BUFFER_LOG
593461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (outputBufferFile1 && buffer->nFilledLen) {
593561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int buf_index = buffer - m_out_mem_ptr;
593661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride = drv_ctx.video_resolution.stride;
593761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int scanlines = drv_ctx.video_resolution.scan_lines;
593861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
593961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int i;
594061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int bytes_written = 0;
594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
594261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride;
594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
594561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int stride_c = stride;
594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
594861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, outputBufferFile1);
594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp += stride_c;
595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* For use buffer we need to copy the data */
595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!output_flush_progress) {
595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.get_next_timestamp(buffer,
595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ?true:false);
595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_debug_timestamp) {
596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_TICKS expected_ts = 0;
596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_timestamp_list.pop_min_ts(expected_ts);
59638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nTimeStamp, expected_ts);
596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nTimeStamp != expected_ts) {
59678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
596961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
597261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_cb.FillBufferDone) {
597361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen > 0) {
597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            handle_extradata(buffer);
597561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep min timestamp interval to handle corrupted bit stream scenario
597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                set_frame_rate(buffer->nTimeStamp);
597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (arbitrary_bytes)
597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                adjust_timestamp(buffer->nTimeStamp);
598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (perf_flag) {
598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!proc_frms) {
598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.stop();
598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    latency = dec_time.processing_time_us() - latency;
598461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
598561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.start();
598661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.start();
598761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                proc_frms++;
598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_U64 proc_time = 0;
599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.stop();
599261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_time = fps_metrics.processing_time_us();
599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%lu) proc_time(%.2f)S fps(%.2f)",
599461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            proc_frms, (float)proc_time / 1e6,
599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (float)(1e6 * proc_frms) / proc_time);
599661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_frms = 0;
599761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
599861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
600061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
600161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (outputExtradataFile) {
600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                p_extra = (OMX_OTHER_EXTRADATATYPE *)
600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((unsigned)(buffer->pBuffer + buffer->nOffset +
600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen + 3)&(~3));
600761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                while (p_extra &&
600861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (OMX_U8*)p_extra < (buffer->pBuffer + buffer->nAllocLen) ) {
60098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%d",p_extra->nSize, p_extra->eType);
601061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
601161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p_extra->eType == OMX_ExtraDataNone) {
601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
601461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
601561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
601661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
601761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
601861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
601961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = LLONG_MAX;
602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rst_prev_ts = true;
602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
602361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
602661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             buffer->pPlatformPrivate)->entryList->entry;
60278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %d",pPMEMInfo->pmem_fd);
602861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *il_buffer;
602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        il_buffer = client_buffers.get_il_buf_hdr(buffer);
603061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (il_buffer)
603161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else {
603361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
603461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
603561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
60368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("After Fill Buffer Done callback %d",pPMEMInfo->pmem_fd);
603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
603861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
60396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
6040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
604561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE* buffer)
6046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
604861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || ((buffer - m_inp_mem_ptr) > drv_ctx.ip_buf.actualcount)) {
60498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
605061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
60538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p",
605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer, buffer->pBuffer);
6055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
6056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
605761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
605861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL && input_flush_progress == false) {
60598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
606061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = buffer;
606161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
606261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nTimeStamp = LLONG_MAX;
606361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            push_input_buffer (hComp);
606461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
60658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
606661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_input_free_q.insert_entry((unsigned)buffer,
606861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL, (unsigned)NULL)) {
60698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
607061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_cb.EmptyBufferDone) {
6073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
607461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
6075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
6076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
6078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
6083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
608461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = NULL;
608561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_msginfo *vdec_msg = NULL;
608661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
608761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer *v4l2_buf_ptr = NULL;
608861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo *output_respbuf = NULL;
608961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=1;
609061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (context == NULL || message == NULL) {
60918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
609261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
609361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
609461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vdec_msg = (struct vdec_msginfo *)message;
609561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(context);
609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (vdec_msg->msgcode) {
609961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_HW_ERROR:
610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
610261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
610361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
610461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
610561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_START_DONE:
610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_START_DONE);
610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_STOP_DONE:
611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_STOP_DONE);
611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_RESUME_DONE:
611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_RESUME_DONE);
611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
611961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
612061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_PAUSE_DONE:
612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
612961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
613061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_FLUSHED:
613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               vdec_msg->msgdata.input_frame_clientdata; */
613861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_inp_mem_ptr+v4l2_buf_ptr->index;
614161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr == NULL ||
614261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_inp_mem_ptr) > omx->drv_ctx.ip_buf.actualcount) ) {
614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr = NULL;
614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg->status_code = VDEC_S_EFATAL;
614561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned int)omxhdr,vdec_msg->status_code,
614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int64_t *timestamp;
615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            timestamp = (int64_t *) malloc(sizeof(int64_t));
615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (timestamp) {
615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)timestamp, vdec_msg->status_code,
615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
61578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        vdec_msg->msgdata.output_frame.time_stamp);
615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
616061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
616261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
616461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omxhdr=omx->m_out_mem_ptr+v4l2_buf_ptr->index;
616661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) Pic_type(%u)",
616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr, vdec_msg->msgdata.output_frame.time_stamp,
616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.pic_type);
616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr && omxhdr->pOutputPortPrivate &&
617161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((omxhdr - omx->m_out_mem_ptr) < omx->drv_ctx.op_buf.actualcount) &&
617261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      - omx->drv_ctx.ptr_respbuffer) < omx->drv_ctx.op_buf.actualcount)) {
617461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
617561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
617661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
617761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
617861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFlags = omx->m_out_mem_ptr[v4l2_buf_ptr->index].nFlags;
617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
618161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        //rc = -1;
618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
618761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.bufferaddr =
618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr->nFilledLen && (((unsigned)omx->rectangle.nLeft !=
619061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    vdec_msg->msgdata.output_frame.framesize.left)
619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || ((unsigned)omx->rectangle.nTop != vdec_msg->msgdata.output_frame.framesize.top)
619261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nWidth != vdec_msg->msgdata.output_frame.framesize.right)
619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                || (omx->rectangle.nHeight != vdec_msg->msgdata.output_frame.framesize.bottom))) {
619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nTop = vdec_msg->msgdata.output_frame.framesize.top;
619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->rectangle.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
61988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Crop information has changed");
619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexConfigCommonOutputCrop,
620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf = (struct vdec_output_frameinfo *)\
620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     omxhdr->pOutputPortPrivate;
620461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
620661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
620761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_I;
620861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
620961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_P;
621161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
621261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_B;
621461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
621561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omx->output_use_buffer)
621761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ( omxhdr->pBuffer, (void *)
621861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
621961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
622061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                vdec_msg->msgdata.output_frame.len);
622161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
622261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = 0;
622361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)omxhdr, vdec_msg->status_code,
622461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_FBD);
622561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS)
622661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
622761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EOS_DONE);
622861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else
622961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
623061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
623161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
623261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_CONFIG_CHANGED:
62338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Port settings changed");
623461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
623561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
623761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_CONFIG_CHANGED:
623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
62398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Port settings changed info");
624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // get_buffer_req and populate port defn structure
624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ERRORTYPE eRet = OMX_ErrorNone;
624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_format fmt;
624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                int ret;
624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.stride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->drv_ctx.video_resolution.scan_lines = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
624961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->m_port_def.nPortIndex = 1;
625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = omx->update_portdef(&(omx->m_port_def));
625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
625261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG);
625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
625561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
625661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
625761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
6259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
626261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_HANDLETYPE hComp,
626361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *buffer
626461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
62678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Empty this arbitrary");
626861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
627161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
62738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %d, timestamp %u",
627461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen, buffer->nFlags, (unsigned)buffer->nTimeStamp);
627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
627761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return buffer if input flush in progress */
627861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
62808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
628261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
628361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame == NULL) {
62868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %d",buffer,buffer->nTimeStamp);
628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = buffer;
62888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        push_input_buffer (hComp);
629061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
62918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
629261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_input_pending_q.insert_entry((unsigned)buffer, (unsigned)NULL,
629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL)) {
629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
629561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
629861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
6300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
6303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
630461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
630761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pdest_frame == NULL || psource_frame == NULL) {
630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL) {
63108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
631161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_free_q.m_size) {
631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.pop_entry(&address,&p2,&id);
631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen = 0;
631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = LLONG_MAX;
63168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
631961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
632161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame == NULL) {
63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a source buffer from the queue");
632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
63268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
63288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
633561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_type_parse) {
633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG4:
633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H263:
634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG2:
634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret =  push_input_sc_codec(hComp);
634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H264:
634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_h264(hComp);
634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_HEVC:
634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_hevc(hComp);
634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
634961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_VC1:
635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_vc1(hComp);
635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
635561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret != OMX_ErrorNone) {
63568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx_report_error ();
635861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
635961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
636261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
6363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
6366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
636761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
636861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
636961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
6370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
63718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %d",
637261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame,psource_frame->nTimeStamp);
637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_frame_parser.parse_sc_frame(psource_frame,
637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame,&partial_frame) == -1) {
63758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
63808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Frame size %d source %p frame count %d",
638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen,psource_frame,frame_count);
638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TimeStamp updated %d",pdest_frame->nTimeStamp);
638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*First Parsed buffer will have only header Hence skip*/
638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frame_count == 0) {
63878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
638861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
638961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
639061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    codec_type_parse == CODEC_TYPE_DIVX) {
639161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4StreamType psBits;
639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.numBytes = pdest_frame->nFilledLen;
639461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4_headerparser.parseHeader(&psBits);
639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
639761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_count++;
639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
640061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame->nFilledLen) {
640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
640361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
640561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_input_free_q.m_size) {
640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_input_free_q.pop_entry(&address,&p2,&id);
641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
641161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen = 0;
641261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
641361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
64148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.insert_entry((unsigned) pdest_frame, (unsigned)NULL,
641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL);
641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
641961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
64218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame %d",pdest_frame->nFilledLen);
642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
642361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame->nAllocLen ==
642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen + pdest_frame->nOffset) {
64258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
642761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
643061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame->nFilledLen == 0) {
643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
643261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags |= psource_frame->nFlags;
64348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
64368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
643961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
644061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
644161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
64458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (generate_ebd) {
64508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
645161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
645261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
645461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
64558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
645661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
645761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
64588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %d",psource_frame,
645961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
64608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %d length %d",
646161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nFlags,psource_frame->nFilledLen);
646261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
646461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
646561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
6469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
647361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
647461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
647561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
64768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
647761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
64798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %d "
648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "look_ahead_nal %d", h264_scratch.nFilledLen, look_ahead_nal);
64818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
648361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
648561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen) {
6486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
6487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
6488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
64898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
6490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            h264_scratch.nFilledLen = 0;
649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
64928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
6493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
649661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
64978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
649961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
65008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
6502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
65048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
65078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
6509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
65148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
651661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
651761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
651861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
65198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
652061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
652161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        NALU_TYPE_SPS);
6523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
652561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
652661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
652761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
652861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // If timeinfo is present frame info from SEI is already processed
652961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
653061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFlags = h264_last_au_flags;
653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef PANSCAN_HDLR
653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_parser->update_panscan_data(h264_last_au_ts);
654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = h264_scratch.nTimeStamp;
654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_flags = h264_scratch.nFlags;
654661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
654961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!VALID_TS(h264_last_au_ts))
655061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_last_au_ts = ts_in_sei;
655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = LLONG_MAX;
655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
65608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %d",
656161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen);
656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
65698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
657061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
657261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
65748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%d TimeStamp = %x",
657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
65768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %d number = %d",
657761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,frame_count++);
657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
65808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
658161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
658261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen) {
658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
658561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen = 0;
658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
65898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
659061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
659161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
659261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
659361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
65948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Reset the EOS Flag");
659561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*Push the frame to the Decoder*/
659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    //frame_count++;
660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
660461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
66068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %d",pdest_frame->nFilledLen);
661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
66198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
6621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
662261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
662461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
66258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
662861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
66298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
663361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
663461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
664061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
664161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%d TimeStamp = %x",
664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
66458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
664861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!VALID_TS(pdest_frame->nTimeStamp))
665061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = ts_in_sei;
665161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
6652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
665361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
665461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
665561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
665661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
665761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
665861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
665961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
66608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
666161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
666261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
666661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
666961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
66708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
667161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
66738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d src length %d",
667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen);
667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
667661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66806eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
6681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
66826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_ERRORTYPE rc = OMX_ErrorNone;
668361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
66846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        memcpy ((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
66858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pDst->nTimeStamp == LLONG_MAX) {
66866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pDst->nTimeStamp = pSrc->nTimeStamp;
66876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            DEBUG_PRINT_LOW("Assign Dst nTimeStamp=%lld", pDst->nTimeStamp);
6688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
66896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pDst->nFilledLen += pSrc->nFilledLen;
66906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        pSrc->nFilledLen = 0;
669161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
66928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
66936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = OMX_ErrorBadParameter;
6694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
66956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return rc;
6696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
66986eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_hevc (OMX_HANDLETYPE hComp)
6699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
670461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
670561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
670661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
67078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
670861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
67096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %d has look_ahead_nal %d pdest_frame nFilledLen %d nTimeStamp %lld",
671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen, look_ahead_nal, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // copy the lookahead buffer in the scratch
67196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        rc = copy_buffer(pdest_frame, &h264_scratch);
672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc != OMX_ErrorNone) {
672161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc;
672261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
672361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
672461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
672561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
67278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
67286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
67296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
67318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
67348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
67356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
673761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
673961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
67418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
674461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
674561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
67468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %d",h264_scratch.nFilledLen);
674761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
674861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mHEVCutils.isNewFrame(&h264_scratch, 0, isNewFrame);
674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
675061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
675161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
675261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
67538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %d nTimestamp %lld, pdest_frame nFilledLen %d nTimestamp %lld",
675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen, h264_scratch.nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
675561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
675661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone) {
675761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
675861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
675961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
676061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
676161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
67638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    rc = copy_buffer(pdest_frame, &h264_scratch);
676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( rc != OMX_ErrorNone ) {
676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
676861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
676961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
677161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("FrameDetecetd # %d pdest_frame nFilledLen %d nTimeStamp %lld, look_ahead_nal in h264_scratch nFilledLen %d nTimeStamp %lld",
677461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            frame_count++, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
677861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
677961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
678061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
67828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p",pdest_frame);
678361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
678861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
678961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
67918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %d nTimeStamp %lld, pdest_frame nFilledLen %d nTimeStamp %lld, h264_scratch nFilledLen %d nTimeStamp %lld",
679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame->nFilledLen, psource_frame->nTimeStamp, pdest_frame->nFilledLen, pdest_frame->nTimeStamp, h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
679561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
67978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
679861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
679961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
680061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
680161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
680261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
68038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
680461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
680561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
680661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
68078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
680961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( rc != OMX_ErrorNone ) {
681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return rc;
681161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
681461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%d TimeStamp = %lld",
681661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frame_count, pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
681761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
681861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
681961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
682061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
682161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
682261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
682361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
682461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %d",
682661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame,h264_scratch.nFilledLen);
682761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
682861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
682961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
683061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
683261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
683361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
683461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
683661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
68378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %d nFilledLen %d, nTimeStamp %lld",
683861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    psource_frame->nFlags,psource_frame->nFilledLen, psource_frame->nTimeStamp);
683961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
684061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
684161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
68426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68446eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::push_input_vc1 (OMX_HANDLETYPE hComp)
68456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
68466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U8 *buf, *pdest;
68476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 partial_frame = 1;
68486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    OMX_U32 buf_len, dest_len;
68496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
685061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (first_frame == 0) {
68516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        first_frame = 1;
68528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
685361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_vendor_config.pData) {
68548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
68556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf = psource_frame->pBuffer;
68566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            buf_len = psource_frame->nFilledLen;
68576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
685961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
68606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_SP_MP_RCV;
686161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
68626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                m_vc1_profile = VC1_AP;
686361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
68656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorStreamCorrupt;
68666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
68686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
68696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nOffset;
68706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
687161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nOffset);
68726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dest_len < m_vendor_config.nDataSize) {
68748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Destination buffer full");
68756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
68776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
68786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
68796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
68806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
68816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_vc1_profile) {
68846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_AP:
68858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
68878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
68886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                return OMX_ErrorBadParameter;
68896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
689061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
68916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
68926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        case VC1_SP_MP_RCV:
68936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        default:
68948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
68956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            return OMX_ErrorBadParameter;
68966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
68976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return OMX_ErrorNone;
68986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
68996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
690061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment)
690261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
690361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
690461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = buffer_size;
690561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
690661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align < 4096) {
690761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 4096;
690861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
690961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
69108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
691161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
691261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
691361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
691461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
69166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
69176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
691961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_fd_data *fd_data, int flag)
69206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
692161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -EINVAL;
692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = -EINVAL;
692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_dev_flag;
692461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_ion ion_buf_info;
692561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!alloc_data || buffer_size <= 0 || !fd_data) {
69268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -EINVAL;
692861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ion_dev_flag = O_RDONLY;
693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd = open (MEM_DEVICE, ion_dev_flag);
693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
69328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
693361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
693461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->flags = 0;
693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && (flag & ION_FLAG_CACHED)) {
693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_FLAG_CACHED;
693861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->len = buffer_size;
694061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->align = clip2(alignment);
694161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (alloc_data->align < 4096) {
694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->align = 4096;
694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((secure_mode) && (flag & ION_SECURE))
694561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->flags |= ION_SECURE;
694661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
694761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _HEVC_USE_ADSP_HEAP_
6948f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    alloc_data->heap_id_mask = ION_HEAP(ION_ADSP_HEAP_ID);
694961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
6950f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
695161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
695261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (secure_mode) {
6953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
695461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
695561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !alloc_data->handle) {
69578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
695861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->handle = NULL;
695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(fd);
696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
696261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd_data->handle = alloc_data->handle;
696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_MAP,fd_data);
696561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
69668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_alloc_data = *alloc_data;
696861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_device_fd = fd;
696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.fd_ion_data = *fd_data;
697061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&ion_buf_info);
697161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd_data->fd =-1;
697261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
6976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
697861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
6979dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buf_ion_info) {
69828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
698361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
698461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &buf_ion_info->ion_alloc_data.handle)) {
69878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free failed" );
698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(buf_ion_info->ion_device_fd);
699061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_device_fd = -1;
699161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_alloc_data.handle = NULL;
699261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->fd_ion_data.fd = -1;
6993dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
6994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
6996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
69978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer = false;
699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = false;
700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_out_mem_ptr);
700361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = NULL;
700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(m_platform_list);
700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_platform_list = NULL;
700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
701161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_respbuffer) {
701261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_respbuffer);
701361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = NULL;
701461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
701561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_outputbuffer) {
701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_outputbuffer);
701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = NULL;
701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
70218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free o/p ion context");
702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.op_buf_ion_info);
7023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
7024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
7029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
703161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
703261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
70338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free utils parser");
703461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            delete (m_frame_parser.mutils);
703561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils = NULL;
703661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
703761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
703861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr) {
70398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input Heap Pointer");
704061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_inp_heap_ptr);
704161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_heap_ptr = NULL;
704261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
704461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_phdr_pmem_ptr) {
70458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input pmem header Pointer");
704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_phdr_pmem_ptr);
704761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_phdr_pmem_ptr = NULL;
704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
704961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
70518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free input pmem Pointer area");
705261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_inp_mem_ptr);
705361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = NULL;
705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_inputbuffer) {
70568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Driver Context pointer");
705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_inputbuffer);
705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = NULL;
7059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
7061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
70628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ion context");
706361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.ip_buf_ion_info);
7064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
7065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
70686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
70696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port)
7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
707161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type btype;
707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_ports v4l2_port = OUTPUT_PORT;
707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = OUTPUT_PORT;
707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = CAPTURE_PORT;
708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_ALL) {
708261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc_input)
708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_input;
708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
708861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_output;
708961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[v4l2_port]) {
709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // already streamed off, warn and move on
709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " which is already streamed off", v4l2_port);
709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 0;
709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
709961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
710061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
71038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
710461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
710561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[v4l2_port] = false;
710661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
710761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
711161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
711261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
711461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
711561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret = 0;
711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 1;
712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
712361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
712961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet==OMX_ErrorNone) {
713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
713661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
713761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
714161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->actualcount = bufreq.count;
714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->mincount = bufreq.count;
71438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq: ActCnt(%d) Size(%d), BufType(%d)",
714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
715261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
715361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height);
715461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
71568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Buffer Size (plane[0].sizeimage) = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = buffer_prop->buffer_size;
716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
716961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
71708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Frame info extra data enabled!");
717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
717661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_INTERLACE_EXTRADATA) {
717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extradata & OMX_PORTDEF_EXTRADATA) {
718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
71828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    client_extra_data_size);
718461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (client_extra_data_size) {
718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
718761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_size = ((buf_size + 3)&(~3)); //Align extradata start address to 64Bit
718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * extra_data_size;
719061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
719161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.buffer_size = extra_data_size;
719261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size += client_extra_data_size;
719361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
719461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
719561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
719661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (in_reconfig) // BufReq will be set to driver when port is disabled
719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (buf_size != buffer_prop->buffer_size) {
719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = set_buffer_req(buffer_prop);
720161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("GetBufReq OUT: ActCnt(%d) Size(%d), BufType(%d)",
720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size, buffer_prop->buffer_type);
720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
720861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned buf_size = 0;
721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%d)",
721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->actualcount, buffer_prop->buffer_size);
721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_size != buffer_prop->buffer_size) {
721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%d) Required(%d)",
722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_prop->buffer_size, buf_size);
722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
722261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
722361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = output_capability;
722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = capture_capability;
723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = buffer_prop->actualcount;
724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
724761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
724861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
724961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
725061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
725161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet==OMX_ErrorNone) {
725461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
725761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
725861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
725961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
726061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (bufreq.count < buffer_prop->actualcount) {
726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer_prop->actualcount, bufreq.count);
726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
726661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!client_buffers.update_buffer_req()) {
726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
726961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
727161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
727261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
727361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!eRet && buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
727461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // need to update extradata buffers also
727561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * drv_ctx.extradata_info.buffer_size;
727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
727761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
7280dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
7281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
7282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
728461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
7288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
728961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
729061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!portDefn) {
729161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
729461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nSize = sizeof(portDefn);
729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->eDomain    = OMX_PortDomainVideo;
729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.frame_rate.fps_denominator > 0)
729861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.frame_rate.fps_denominator;
730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
73018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Divide by zero");
730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
7303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
730461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (0 == portDefn->nPortIndex) {
730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirInput;
730661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
730861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
730961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
731061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = eCompressionFormat;
731161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_inp_bEnabled;
731261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_inp_bPopulated;
731361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (1 == portDefn->nPortIndex) {
731461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int buf_size = 0;
731561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.update_buffer_req()) {
73168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
731761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
731861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
731961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_buffer_req(buf_size)) {
73208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("update buffer requirements");
732161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
732261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
732361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize = buf_size;
732461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirOutput;
732561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
732661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
732761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
732861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_out_bEnabled;
732961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_out_bPopulated;
733061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
73318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error in getting color format");
733261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
733361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
733461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
733561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir = OMX_DirMax;
733661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
733761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (int)portDefn->nPortIndex);
733861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
733961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
734061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
734161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
734261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
734361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
734461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("update_portdef Width = %lu Height = %lu Stride = %ld"
73458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            " SliceHeight = %lu", portDefn->format.video.nFrameWidth,
734661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameHeight,
734761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
734861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
734961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
7354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
735561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
735661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
735761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i= 0;
735861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
735961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
73608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
736161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
736261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
736361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
736461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
736561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
736661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
736761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
736861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
737361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
737761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
737861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
738061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %d PMEM %d PL %d",nBufHdrSize,
738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof(OMX_BUFFERHEADERTYPE),
738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
73858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize,
738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_bm_count);
738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   calloc (sizeof(struct vdec_bufferpayload),
739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount);
739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
739661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 calloc (sizeof (struct vdec_output_frameinfo),
739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         drv_ctx.op_buf.actualcount);
7398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
7401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
740961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
741061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
741161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
741361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
741461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
741661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
74188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
741961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr,pPlatformEntry);
74208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
742461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
742561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = 0;
742661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
742761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = NULL;
742861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
742961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
743061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
743161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
743461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
743561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
743661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  0;
743761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->pmem_fd = 0;
743861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
7440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        &drv_ctx.ptr_outputbuffer[i];
744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
745061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
74548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
745661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
745761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
746261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
74748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
747661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
7478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
748061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet =  OMX_ErrorInsufficientResources;
7483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
7488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p1;
749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned p2;
749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned ident;
749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_cmd_queue tmp_q, pending_bd_q;
749361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
749461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE FDB from ftb queue
749561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
749661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_FBD) {
749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
749961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to ftb queue
750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
750561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,ident);
750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
750861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE EDB from etb queue
750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
751061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_EBD) {
751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
751361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
751461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
751661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to etb queue
751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
752061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,ident);
752161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
752261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // process all pending buffer dones
752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (pending_bd_q.m_size) {
752561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_bd_q.pop_entry(&p1,&p2,&ident);
752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (ident) {
752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD:
752861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
75298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
753161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
753461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD:
753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
75368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
753761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
753861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
753961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
754061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
7545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
754661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_frame_interval = 0;
754761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
754861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && (((act_timestamp > prev_ts )? act_timestamp - prev_ts: prev_ts-act_timestamp)>2000)) {
754961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        new_frame_interval = (act_timestamp > prev_ts)?
755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp - prev_ts :
755161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts - act_timestamp;
755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (new_frame_interval < frm_int || frm_int == 0) {
755361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frm_int = new_frame_interval;
755461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (frm_int) {
755561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_numerator = 1e6;
755661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_denominator = frm_int;
755761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
755861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        frm_int, drv_ctx.frame_rate.fps_numerator /
755961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (float)drv_ctx.frame_rate.fps_denominator);
756061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
756161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
756361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts = act_timestamp;
7564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rst_prev_ts && VALID_TS(act_timestamp)) {
756961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = act_timestamp;
757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = false;
757161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (VALID_TS(prev_ts)) {
757261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool codec_cond = (drv_ctx.timestamp_adjust)?
757361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || (((act_timestamp > prev_ts)?
757461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (act_timestamp - prev_ts):(prev_ts - act_timestamp)) <= 2000)):
757561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!VALID_TS(act_timestamp) || act_timestamp == prev_ts);
757661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frm_int > 0 && codec_cond) {
757761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
757861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp = prev_ts + frm_int;
757961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
758061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = act_timestamp;
758161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
758261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(act_timestamp);
758361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (frm_int > 0)          // In this case the frame rate was set along
758461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    {                               // with the port definition, start ts with 0
758561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
758661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
7587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
759361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_conceal_MB = 0;
759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 frame_rate = 0;
759561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int consumed_len = 0;
759661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB_in_frame;
759761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 recovery_sei_flags = 1;
759861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int buf_index = p_buf_hdr - m_out_mem_ptr;
759961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
760061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
760161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_buf_hdr->nOffset;
760261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!drv_ctx.extradata_info.uaddr) {
760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
760461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
760561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_extra = (OMX_OTHER_EXTRADATATYPE *)
760661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
760861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
760961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_extra = NULL;
761061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
761161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (data) {
761261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
76138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
761461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((consumed_len + data->nSize) > drv_ctx.extradata_info.buffer_size) {
761561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Invalid extra data size");
761661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
761761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
761861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch ((unsigned long)data->eType) {
76198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_interlace_payload *payload;
762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    payload = (struct msm_vidc_interlace_payload *)data->data;
76228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (payload->format != MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
762361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        int enable = 1;
762461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_U32 mbaff = 0;
762561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
76268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        if ((payload->format == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
762861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        else
762961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
763061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (m_enable_android_native_buffers)
763161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
763261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    PP_PARAM_INTERLACED, (void*)&enable);
763361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
763461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && (client_extradata & OMX_INTERLACE_EXTRADATA)) {
763561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        append_interlace_extradata(p_extra, payload->format);
763661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
763761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
763861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_FRAME_RATE:
764061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_framerate_payload *frame_rate_payload;
764161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate_payload = (struct msm_vidc_framerate_payload *)data->data;
764261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate = frame_rate_payload->frame_rate;
764361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_TIMESTAMP:
764561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_ts_payload *time_stamp_payload;
764661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    time_stamp_payload = (struct msm_vidc_ts_payload *)data->data;
764761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp = time_stamp_payload->timestamp_lo;
764861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    p_buf_hdr->nTimeStamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
764961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
765261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)data->data;
765361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
765461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_ASPECT_RATIO:
765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)data->data;
766061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
766161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ((struct vdec_output_frameinfo *)
766361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
766661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
766761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)data->data;
766861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_flags = recovery_sei_payload->flags;
76698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
767061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
76718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("Extradata: OMX_BUFFERFLAG_DATACORRUPT Received");
767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
767361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
76748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload = (struct msm_vidc_panscan_window_payload *)data->data;
767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
767861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    goto unrecognized_extradata;
767961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            consumed_len += data->nSize;
768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
768261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode && (client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
768461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
768561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            append_frame_info_extradata(p_extra,
768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
768761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    panscan_payload,&((struct vdec_output_frameinfo *)
768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
768961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
76916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata:
769261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!secure_mode && client_extradata)
769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        append_terminator_extradata(p_extra);
769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
7695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76976eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
769861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_internal, bool enable)
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
770061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
770161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
770261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state != OMX_StateLoaded) {
770361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
770461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
770561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
77068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d",
770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata, requested_extradata, enable, is_internal);
770861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
770961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!is_internal) {
771061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enable)
771161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata |= requested_extradata;
771261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
771361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata = client_extradata & ~requested_extradata;
771461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
771861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
77228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " Quality of interlaced clips might be impacted.");
772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
772461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
772661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
773061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
773161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
773261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
773561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
773961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
774161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
774261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
774461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
774561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
77468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
774961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
775161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
77548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
775561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
775661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
775761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = get_buffer_req(&drv_ctx.op_buf);
775961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
7760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *data_ptr = extra->data, data = 0;
776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (byte_count < extra->nDataSize) {
776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data = *data_ptr;
776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (data) {
776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            num_MB += (data&0x01);
777061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data >>= 1;
777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
777261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data_ptr++;
777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        byte_count++;
777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
777561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
777661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
777761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
7778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_debug_extradata)
778361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
7784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "============== Extra Data ==============\n"
778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "           Size: %lu \n"
778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "        Version: %lu \n"
778961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "      PortIndex: %lu \n"
779061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "           Type: %x \n"
77918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "       DataSize: %lu",
779261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nSize, extra->nVersion.nVersion,
779361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra->nPortIndex, extra->eType, extra->nDataSize);
779461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
779561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
779661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)extra->data;
779761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
779861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "------ Interlace Format ------\n"
779961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "                Size: %lu \n"
780061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "             Version: %lu \n"
780161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           PortIndex: %lu \n"
780261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " Is Interlace Format: %d \n"
780361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "   Interlace Formats: %lu \n"
78048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "=========== End of Interlace ===========",
780561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->nSize, intfmt->nVersion.nVersion, intfmt->nPortIndex,
780661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                intfmt->bInterlaceFormat, intfmt->nInterlaceFormats);
780761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "-------- Frame Format --------\n"
781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "             Picture Type: %d \n"
781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Interlace Type: %d \n"
781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " Pan Scan Total Frame Num: %lu \n"
781561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "   Concealed Macro Blocks: %lu \n"
781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "               frame rate: %lu \n"
781761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "           Aspect Ratio X: %lu \n"
78188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Aspect Ratio Y: %lu",
781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->ePicType,
782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->interlaceType,
782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->panScan.numWindows,
782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nConcealedMacroblocks,
782361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->nFrameRate,
782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioX,
782561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->aspectRatio.aspectRatioY);
782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
782861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH(
782961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "------------------------------\n"
783061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "     Pan Scan Frame Num: %lu \n"
783161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "            Rectangle x: %ld \n"
783261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "            Rectangle y: %ld \n"
783361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "           Rectangle dx: %ld \n"
78348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "           Rectangle dy: %ld",
783561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    i, fminfo->panScan.window[i].x, fminfo->panScan.window[i].y,
783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fminfo->panScan.window[i].dx, fminfo->panScan.window[i].dy);
783761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
783961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == OMX_ExtraDataNone) {
784161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
784261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
784361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
784461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 interlaced_format_type)
7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STREAMINTERLACEFORMAT *interlace_format;
785161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mbaff = 0;
785261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
785361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
785661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
785961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format = (OMX_STREAMINTERLACEFORMAT *)extra->data;
786161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
786261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
78658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE)  && !mbaff) {
786661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_FALSE;
786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
786961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
787261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
787361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info(
787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_aspectratioinfo *aspect_ratio_info,
787961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
78806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata = frame_info;
788261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
788561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_extradata->aspectRatio.aspectRatioY);
78866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
78906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct msm_vidc_panscan_window_payload *panscan_payload,
78916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct vdec_aspectratioinfo *aspect_ratio_info)
7892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window *panscan_window;
789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
78966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return;
789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)extra->data;
790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (picture_type) {
790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_I:
790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_P:
790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_B:
791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
791361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
791461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
791761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
792061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
792361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nConcealedMacroblocks = num_conceal_mb;
792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nFrameRate = frame_rate;
792661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->panScan.numWindows = 0;
792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (panscan_payload) {
792861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
792961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        panscan_window = &panscan_payload->wnd[0];
793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
793261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
793561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            panscan_window++;
793661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
793761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
793861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
794461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
794961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)extra->data;
795161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *portDefn = m_port_def;
795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u stride = %u"
79538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "sliceheight = %u",portDefn->format.video.nFrameHeight,
795461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nFrameWidth,
795561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nStride,
795661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            portDefn->format.video.nSliceHeight);
7957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
7960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
796161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!client_extradata) {
796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
796461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = OMX_ExtraDataNone;
796761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = 0;
796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->data[0] = 0;
796961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
797061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
7971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
7974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= drv_ctx.ip_buf.actualcount) {
79778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
797961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
798061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
798161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr = (desc_buffer_hdr*) \
798261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            calloc( (sizeof(desc_buffer_hdr)),
798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    drv_ctx.ip_buf.actualcount);
798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_desc_buffer_ptr == NULL) {
79858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
798861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
799161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
79928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
799361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
799461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
799661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
8000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
800161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Inserting address offset (%d) at idx (%d)", address_offset,m_demux_entries);
800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_demux_entries < 8192) {
800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_offsets[m_demux_entries++] = address_offset;
800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
800561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
8006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
8009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 index = 0;
801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
801561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (index < bytes_to_parse) {
801761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
801861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 (buf[index+2] == 0x01)) ) {
802161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //Found start code, insert address offset
802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            insert_demux_addr_offset(index);
802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf[index+2] == 0x01) // 3 byte start code
802461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 3;
802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else                      //4 byte start code
802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 4;
802761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            index++;
8029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
803061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Extracted (%d) demux entry offsets",m_demux_entries);
803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
8035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //fix this, handle 3 byte start code, vc1 terminator entry
803761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *p_demux_data = NULL;
803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 desc_data = 0;
803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 start_addr = 0;
804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 nal_size = 0;
804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 suffix_byte = 0;
804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 demux_index = 0;
804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 buffer_index = 0;
804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
804961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
805161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_index > drv_ctx.ip_buf.actualcount) {
805261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%lu)", buffer_index);
805361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
805561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
805761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
805861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ( ((OMX_U8*)p_demux_data == NULL) ||
805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; demux_index < m_demux_entries; demux_index++) {
806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            start_addr = m_demux_offsets[demux_index];
806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
807161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (demux_index < (m_demux_entries - 1)) {
807261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
807361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Start_addr(%p), suffix_byte(0x%x),nal_size(%d),demux_index(%d)",
807761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    start_addr,
807861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    suffix_byte,
807961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    nal_size,
808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    demux_index);
808161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = (start_addr >> 3) << 1;
808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= (start_addr & 7) << 21;
808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= suffix_byte << 24;
808461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
808561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
808961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
809061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
809161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_type_parse == CODEC_TYPE_VC1) {
809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VC1 terminator entry");
809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0x82 << 24;
809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
810061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_demux_entries++;
810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //Add zero word to indicate end of descriptors
810461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(p_demux_data, 0, sizeof(OMX_U32));
810561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
810661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
810761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("desc table data size=%d", m_desc_buffer_ptr[buffer_index].desc_data_size);
810861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
810961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
811061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
811161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Demux table complete!");
811261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
81156eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::createDivxDrmContext()
8116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
811761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE err = OMX_ErrorNone;
811861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    iDivXDrmDecrypt = DivXDrmDecrypt::Create();
811961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (iDivXDrmDecrypt) {
812061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_ERRORTYPE err = iDivXDrmDecrypt->Init();
812161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (err!=OMX_ErrorNone) {
81228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR :iDivXDrmDecrypt->Init %d", err);
8123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            delete iDivXDrmDecrypt;
8124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            iDivXDrmDecrypt = NULL;
812561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
812661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
81278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Unable to Create DIVX DRM");
812861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        err = OMX_ErrorUndefined;
812961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
813061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return err;
8131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
81326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
81346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
813561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enabled = false;
813661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = NULL;
813761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    init_members();
813861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ColorFormat = OMX_COLOR_FormatMax;
81396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
81426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
814361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(client);
81446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
814661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members()
814761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
814861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count = 0;
814961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_size_req = 0;
815061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_alignment_req = 0;
815161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
815261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
815361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
815461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
81556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
815661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
81576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
815861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < MAX_COUNT; i++)
815961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd[i] = -1;
81606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
816261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
816361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
816461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.destroy();
81656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
81666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
81676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
81686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int src_size = 0, destination_size = 0;
817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
81738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
81778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("No color conversion required");
817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
817961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
818161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
818261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
81838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
818461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        goto fail_update_buf_req;
818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.close();
818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.video_resolution.frame_width,
819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            NV12_128m,YCbCr420P);
819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
819261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = c2d.get_buffer_size(C2D_INPUT,src_size);
819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (status)
819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !destination_size) {
81998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "driver size %d destination size %d",
820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    src_size,omx->drv_ctx.op_buf.buffer_size,destination_size);
820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
820361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.close();
820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = 0;
820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = destination_size;
820761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
820861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
820961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
82126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
82136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req:
821461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
821561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
82186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format(
821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_COLOR_FORMATTYPE dest_color_format)
82206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_color_format = (OMX_COLOR_FORMATTYPE)
823061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
823161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
82328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect color format");
82336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        status = false;
82346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status && (drv_color_format != dest_color_format)) {
82368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Enabling C2D");
823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (dest_color_format != OMX_COLOR_FormatYUV420Planar) {
82388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat = OMX_COLOR_FormatYUV420Planar;
824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (enabled)
824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                c2d.destroy();
824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enabled = false;
824561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!c2d.init()) {
82468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for c2d");
824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
824861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
824961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enabled = true;
825061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
825161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
825261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enabled)
825361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.destroy();
825461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enabled = false;
825561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
825661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
825761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
82586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
82606eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
82616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
826261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
826461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
826561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
826661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
826761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->m_out_mem_ptr;
826861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return m_out_mem_ptr_client;
82696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
82706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
827161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
827261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
82736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
827461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
82758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
827661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
827761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
827861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
827961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
828061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
828161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
828261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - omx->m_out_mem_ptr;
828361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
828461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
828561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
828661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool status;
828761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
828861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_lock(&omx->c_lock);
828961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
829061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer,pmem_fd[index],
829161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress[index], pmem_baseaddress[index]);
829261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_unlock(&omx->c_lock);
829361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = buffer_size_req;
829461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!status) {
82958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
829661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = 0;
829761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return &m_out_mem_ptr_client[index];
829861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
829961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
830061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = 0;
83016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return &m_out_mem_ptr_client[index];
830261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
83038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
830461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
83056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
83066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
830761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
830861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
83096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
831061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
83118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
831361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
831561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
831761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - m_out_mem_ptr_client;
831861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return &omx->m_out_mem_ptr[index];
832061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
83218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
83226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return NULL;
83236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
832461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
832561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size)
83266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
832761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
832861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
832961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
833061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
833161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
833261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
83338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Get buffer size failed");
833461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
833561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            goto fail_get_buffer_size;
833661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
833761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
833861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
83396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        buffer_size = omx->drv_ctx.op_buf.buffer_size;
834061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
834161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
83426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size:
834361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
834461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
83456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
83466eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
834761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *bufhdr)
834861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
834961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
835061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
835161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
835261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->free_output_buffer(bufhdr);
835361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure())
835461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
835561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count || !bufhdr) {
83568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
835761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
835861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufhdr - m_out_mem_ptr_client;
836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= omx->drv_ctx.op_buf.actualcount) {
83618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
836461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_fd[index] > 0) {
836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[index]);
836761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[index] = -1;
83696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx->free_ion_memory(&op_buf_ion_info[index]);
8371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[index].video_heap_ptr = NULL;
837361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count > 0)
837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count--;
837561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count = 0;
837761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count) {
837861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&omx->c_lock);
837961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2d.close();
838061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        init_members();
838161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&omx->c_lock);
838261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
838361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
83846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
83866eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
838761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
83886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
838961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
839061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
839161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure()) {
83958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->is_component_secure());
839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUnsupportedSetting;
839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
839961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
84008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
84018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("color_convert buffer_size_req %d bytes %lu",
840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req,bytes);
840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
84068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
840961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            port,appData,omx->drv_ctx.op_buf.buffer_size);
841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
84138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
841461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
841561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
841661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
841761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.op_buf.actualcount) {
84188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid header index %d",
841961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (temp_bufferHdr - omx->m_out_mem_ptr));
842061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUndefined;
842161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
842261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int i = allocated_count;
84236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req,buffer_alignment_req,
842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            0);
842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (op_buf_ion_info[i].ion_device_fd < 0) {
84308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
84378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[i]);
843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        omx->free_ion_memory(&op_buf_ion_info[i]);
844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
844161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
844261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
844361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
844461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
84456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].pmem_fd = (OMX_U32)m_heap_ptr[i].video_heap_ptr.get();
844761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].offset = 0;
844861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
844961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
845061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].nEntries = 1;
845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
845861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
845961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
846261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
84638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("IL client buffer header %p", *bufferHdr);
846461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count++;
846561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
84666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure()
84696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
847061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return secure_mode;
84716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
84726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
84736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
84746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
847561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
847661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
847761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
847861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format =  (OMX_COLOR_FORMATTYPE)
847961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
848061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
848161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
848261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
848361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ColorFormat != OMX_COLOR_FormatYUV420Planar) {
848461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
848561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
848661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_color_format = OMX_COLOR_FormatYUV420Planar;
848761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
848861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
84896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8490