1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
20c95c078771f637924fa7ae01b0d90df285dde64Ray EssickCopyright (c) 2010 - 2016, 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  This module contains the implementation of the OpenMAX core & component.
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//                             Include Files
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
41f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#define __STDC_FORMAT_MACROS
42f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#include <inttypes.h>
43f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h>
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h>
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include <stdlib.h>
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h>
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <errno.h>
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_vdec.h"
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <limits.h>
5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <stdlib.h>
54576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon#include <media/hardware/HardwareAPI.h>
556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <media/msm_media_info.h>
56e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/eventfd.h>
57240fc6e79b5c531171a420124ca6c78bff821a7bMathias Agopian#include <nativebase/nativebase.h>
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef _ANDROID_
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/mman.h>
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif //_ANDROID_
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <cutils/properties.h>
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#undef USE_EGL_IMAGE_GPU
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <qdMetaData.h>
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ANDROID_JELLYBEAN_MR2
728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#include "QComOMXMetadata.h"
738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/egl.h>
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <EGL/eglQCOM.h>
788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define EGL_BUFFER_HANDLE 0x4F00
798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define EGL_BUFFER_OFFSET 0x4F01
80073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava#endif
816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define BUFFER_LOG_LOC "/data/misc/media"
838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputExtradataFile;
86f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavanchar output_extradata_filename [] = "/data/misc/media/extradata";
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define DEFAULT_FPS 30
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MAX_SUPPORTED_FPS 120
918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_WIDTH_ALIGNMENT 128
928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define DEFAULT_HEIGHT_ALIGNMENT 32
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE        0xC5000000
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SP_MP_START_CODE_MASK   0xFF000000
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_AP_SEQ_START_CODE       0x0F010000
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_PROFILE_MASK   0xF0
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE          0
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_MAIN_PROFILE            1
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_ADVANCE_PROFILE         3
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_LEN            4
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_C_POS            8
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_A_POS            12
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_STRUCT_B_POS            24
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define VC1_SEQ_LAYER_SIZE          36
1096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 0x7fffffff
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MEM_DEVICE "/dev/ion"
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" {
11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include<utils/Log.h>
11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif//_ANDROID_
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_4K 0x1000
1206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define SZ_1M 0x100000
1216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
125f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1))
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
127da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_DISPLAY_INFO_EXTRADATA)
128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default
129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef ION_FLAG_CP_BITSTREAM
131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define ION_FLAG_CP_BITSTREAM 0
132115f87fd886c61972b220c6ed94fc74ca1911cf6Praveen Chavan#endif
133115f87fd886c61972b220c6ed94fc74ca1911cf6Praveen Chavan
134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef ION_FLAG_CP_PIXEL
135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define ION_FLAG_CP_PIXEL 0
136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
1378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef MASTER_SIDE_CP
139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MEM_HEAP_ID ION_SECURE_HEAP_ID
140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_ALIGN SZ_4K
141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_INPUT_BUFFER (ION_SECURE | ION_FLAG_CP_BITSTREAM)
142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_OUTPUT_BUFFER (ION_SECURE | ION_FLAG_CP_PIXEL)
143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else //SLAVE_SIDE_CP
144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_ALIGN SZ_1M
146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_INPUT_BUFFER ION_SECURE
147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE
148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
1498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_U32 maxSmoothStreamingWidth = 1920;
1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanstatic OMX_U32 maxSmoothStreamingHeight = 1088;
1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_message_thread (void *input)
154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer;
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct pollfd pfds[2];
15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event dqevent;
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pfds[1].events = POLLIN | POLLERR;
164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pfds[0].fd = omx->drv_ctx.video_driver_fd;
165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pfds[1].fd = omx->m_poll_efd;
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
1678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    while (!omx->async_thread_force_stop) {
170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rc = poll(pfds, 2, POLL_TIMEOUT);
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc) {
1728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Poll timedout");
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if (rc < 0 && errno != EINTR && errno != EAGAIN) {
175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno);
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) {
179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited");
180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) {
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
1848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset(&vdec_msg, 0, sizeof(vdec_msg));
18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = omx->drv_ctx.num_planes;
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (uint64_t)v4l2_buf.timestamp.tv_usec;
19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (vdec_msg.msgdata.output_frame.len) {
19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
202f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg.msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
203f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg.msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
20861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
20961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
21061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) {
21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_msginfo vdec_msg;
21361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
21461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
21561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = 1;
21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (pfds[0].revents & POLLPRI) {
228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent);
22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.status_code=VDEC_S_SUCCESS;
235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0];
236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1];
237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient");
238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (omx->async_message_process(input,&vdec_msg) < 0) {
239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_HIGH("async_message_thread Exited");
240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    break;
241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT ) {
243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                struct vdec_msginfo vdec_msg;
24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                omx->dpb_bit_depth = dqevent.u.data[0];
247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", dqevent.u.data[0]);
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 if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved");
25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
2638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved");
26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
268f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) {
269f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                struct vdec_msginfo vdec_msg;
270f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD;
271f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
272f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_ERROR("HW Overload received");
273f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
274f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
275f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    break;
276f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
277f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) {
278f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                struct vdec_msginfo vdec_msg;
279f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED;
280f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                vdec_msg.status_code=VDEC_S_SUCCESS;
281f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_ERROR("HW Unsupported received");
282f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
283f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
284f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    break;
285f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct vdec_msginfo vdec_msg;
288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR;
289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.status_code = VDEC_S_SUCCESS;
2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("SYS Error Recieved");
29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&vdec_msg) < 0) {
2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exited");
29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
295576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) {
2968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
2978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]);
299576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) {
3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
301576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                struct vdec_msginfo vdec_msg;
302576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
3038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]);
304576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
305576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
306576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                v4l2_buf.memory = V4L2_MEMORY_USERPTR;
307576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                v4l2_buf.length = omx->drv_ctx.num_planes;
308576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                v4l2_buf.m.planes = plane;
309576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                v4l2_buf.index = ptr[5];
310576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                v4l2_buf.flags = 0;
311576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                vdec_msg.status_code = VDEC_S_SUCCESS;
314576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf;
315576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                vdec_msg.msgdata.output_frame.len = 0;
3168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2];
3178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) +
318576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                    (uint64_t)ptr[4];
319576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                if (omx->async_message_process(input,&vdec_msg) < 0) {
3208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("async_message_thread Exitedn");
321576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                    break;
322576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                }
323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else {
3248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                continue;
32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
3298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* message_thread(void *input)
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char id;
33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int n;
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fd_set readFds;
340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int res = 0;
341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct timeval tv;
342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    while (!omx->message_thread_stop) {
346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        tv.tv_sec = 2;
348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        tv.tv_usec = 0;
349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        FD_ZERO(&readFds);
351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        FD_SET(omx->m_pipe_in, &readFds);
352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv);
354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (res < 0) {
355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno));
356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            continue;
357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if (res == 0 /*timeout*/ || omx->message_thread_stop) {
358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            continue;
359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        n = read(omx->m_pipe_in, &id, 1);
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (0 == n) {
36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (1 == n) {
36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->process_event_cb(omx, id);
36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((n < 0) && (errno != EINTR)) {
3728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid post_message(omx_vdec *omx, unsigned char id)
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret_value;
3838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret_value = write(omx->m_pipe_out, &id, 1);
385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ret_value <= 0) {
386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno));
387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else {
388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx_cmd_queue destructor
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::~omx_cmd_queue()
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Nothing to do
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue constructor
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue insert
4058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id)
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].id       = id;
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param1   = p1;
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_q[m_write].param2   = p2;
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_write++;
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_size ++;
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_write = 0;
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
4198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
42161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// omx cmd queue pop
4258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id)
426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_size > 0) {
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *id = m_q[m_read].id;
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p1 = m_q[m_read].param1;
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *p2 = m_q[m_read].param2;
43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Move the read pointer ahead
43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ++m_read;
43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        --m_size;
43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_read = 0;
43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Retrieve the first mesg type in the queue
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return m_q[m_read].id;
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::ts_arr_list()
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //initialize timestamps array
45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::ts_arr_list::~ts_arr_list()
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //free m_ts_arr_list?
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
46461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool duplicate_ts = false;
46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //insert at the first available empty location
46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_ts_arr_list[idx].valid) {
47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found invalid or empty entry, save timestamp
47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].valid = true;
47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_ts_arr_list[idx].timestamp = ts;
47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
47461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ts, idx);
47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int min_idx = -1;
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_TICKS min_ts = 0;
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_ts_arr_list[idx].valid) {
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //found valid entry, save index
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (min_idx < 0) {
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //first valid entry
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_ts = m_ts_arr_list[idx].timestamp;
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                min_idx = idx;
50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (min_idx < 0) {
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //no valid entries found
51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = 0;
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = false;
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ts = m_ts_arr_list[min_idx].timestamp;
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[min_idx].valid = false;
51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ts, min_idx);
51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
52161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::ts_arr_list::reset_ts_list()
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = true;
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int idx = 0;
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ts_arr_list[idx].valid = false;
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// factory function executed by the core to create instances
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid *get_omx_component_factory_fn(void)
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return (new omx_vdec);
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
548f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        ion_user_handle_t handle, int ionMapfd)
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
5508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) devicefd;
5518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) size;
5528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) base;
5538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) handle;
5548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) ionMapfd;
55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevVideoHeap::VideoHeap(int fd, size_t size, void* base)
559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // dup file descriptor, map once, use pmem
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    init(dup(fd), base, size, 0 , MEM_DEVICE);
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif // _ANDROID_
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::omx_vdec
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Constructor
571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
57561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::omx_vdec(): m_error_propogated(false),
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_state(OMX_StateInvalid),
58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data(NULL),
58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_mem_ptr(NULL),
58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr(NULL),
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress (false),
58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress (false),
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_use_buffer (false),
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer (false),
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers(false),
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_output_pmem(OMX_FALSE),
58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_region_smi(OMX_FALSE),
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_pvt_entry_pmem(OMX_FALSE),
59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers(0),
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers(0),
59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bm_count(0),
59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bm_count(0),
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bPopulated(OMX_FALSE),
59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bPopulated(OMX_FALSE),
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_flags(0),
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr(NULL),
600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_bEnabled(OMX_TRUE),
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_bEnabled(OMX_TRUE),
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_in_alloc_cnt(0),
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list(NULL),
60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry(NULL),
60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info(NULL),
6078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    h264_parser(NULL),
60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    arbitrary_bytes (true),
60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    psource_frame (NULL),
61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pdest_frame (NULL),
61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_inp_heap_ptr (NULL),
61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_phdr_pmem_ptr(NULL),
61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_inp_bm_count (0),
61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    codec_type_parse ((codec_type)0),
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_meta (true),
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_count (0),
61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_count (0),
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nal_length(0),
61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    look_ahead_nal (false),
62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame(0),
62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_buffer(NULL),
62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    first_frame_size (0),
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_device_file_ptr(NULL),
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vc1_profile((vc1_profile_type)0),
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_ts(LLONG_MAX),
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    h264_last_au_flags(0),
6278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_disp_hor_size(0),
6288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_disp_vert_size(0),
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts(LLONG_MAX),
630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    prev_ts_actual(LLONG_MAX),
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rst_prev_ts(true),
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frm_int(0),
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    in_reconfig(false),
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_display_id(NULL),
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_extradata(0),
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_reject_avc_1080p_mp (0),
637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_enable_android_native_buffers(OMX_FALSE),
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_use_android_native_buffers(OMX_FALSE),
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr(NULL),
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    secure_mode(false),
6434173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan    allocate_native_handle(false),
6448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_other_extradata(NULL),
6458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_profile(0),
646576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    client_set_fps(false),
6478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_last_rendered_TS(-1),
648f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    m_queued_codec_config_count(0),
649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL),
650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    secure_scaling_to_non_secure_opb(false),
6510c95c078771f637924fa7ae01b0d90df285dde64Ray Essick    m_force_compressed_for_dpb(false)
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_pipe_in = -1;
654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_pipe_out = -1;
655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_poll_efd = -1;
656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    drv_ctx.video_driver_fd = -1;
657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    drv_ctx.extradata_info.ion.fd_ion_data.fd = -1;
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Assumption is that , to begin with , we have all the frames with decoder */
659f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8);
6608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_debug,0,sizeof(m_debug));
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
6638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.debug.level", property_value, "1");
6648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    debug_level = atoi(property_value);
6658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
6678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
6688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.perf", property_value, "0");
67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    perf_flag = atoi(property_value);
67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.start();
67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        proc_frms = latency = 0;
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_n_filled_len = 0;
67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.ts", property_value, "0");
67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_timestamp = atoi(property_value);
68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.set_timestamp_reorder_mode(true);
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        time_stamp_dts.enable_debug_print(true);
68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.concealedmb", property_value, "0");
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_concealedmb = atoi(property_value);
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_value[0] = '\0';
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.profile.check", property_value, "0");
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_reject_avc_1080p_mp = atoi(property_value);
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
6978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.log.in", property_value, "0");
6988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.in_buffer_log = atoi(property_value);
6998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
7018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.log.out", property_value, "0");
7028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.out_buffer_log = atoi(property_value);
703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_value[0] = '\0';
706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_get("vidc.dec.meta.log.out", property_value, "0");
707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_debug.out_meta_buffer_log = atoi(property_value);
708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
7098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
7118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.log.loc", property_value, "");
7128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (*property_value)
7138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
7148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
7168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.120fps.enabled", property_value, "0");
7178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //if this feature is not enabled then reset this value -ve
7198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(atoi(property_value)) {
7208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("feature 120 FPS decode enabled");
7218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_last_rendered_TS = 0;
7228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
7258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.dec.debug.dyn.disabled", property_value, "0");
7268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_disable_dynamic_buf_mode = atoi(property_value);
7278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode);
7288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _UBWC_
730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_value[0] = '\0';
731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0");
732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_disable_ubwc_mode = atoi(property_value);
733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled");
734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#else
735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_disable_ubwc_mode = true;
736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cmp,0,sizeof(m_cmp));
73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_cb,0,sizeof(m_cb));
74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&drv_ctx,0,sizeof(drv_ctx));
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
744f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
745ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams));
746ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams));
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    msg_thread_id = 0;
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    async_thread_id = 0;
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    msg_thread_created = false;
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    async_thread_created = false;
752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    async_thread_force_stop = false;
753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    message_thread_stop = false;
7546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
7566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
7588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /* invalidate m_frame_pack_arrangement */
7608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
7618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_frame_pack_arrangement.cancel_flag = 1;
7628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.timestamp_adjust = false;
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_vendor_config.pData = NULL;
76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&m_lock, NULL);
76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&c_lock, NULL);
76797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    pthread_mutex_init(&buf_lock, NULL);
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_init(&m_cmd_lock,0,0);
7698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    sem_init(&m_safe_flush, 0, 0);
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] =
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[OUTPUT_PORT] = false;
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char extradata_value[PROPERTY_VALUE_MAX] = {0};
77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("vidc.dec.debug.extradata", extradata_value, "0");
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_debug_extradata = atoi(extradata_value);
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    client_buffers.set_vdec_client(this);
780576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    dynamic_buf_mode = false;
7818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    out_dynamic_list = NULL;
7828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    is_down_scalar_enabled = false;
783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_downscalar_width = 0;
784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_downscalar_height = 0;
785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_force_down_scalar = 0;
786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_reconfig_height = 0;
787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_reconfig_width = 0;
7888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_mode = false;
7898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_width = 0;
7908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_height = 0;
7917ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan    m_decode_order_mode = false;
7928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    is_q6_platform = false;
793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_perf_control.send_hint_to_mpctl(true);
794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_input_pass_buffer_fd = false;
795c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
796ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    m_client_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
797ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
798ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
799ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
800c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
801c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
802c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_internal_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
803c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
804c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
805c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
806c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams);
8076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
8096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = {
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT,
814576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE,
815576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER,
816f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR,
817f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    V4L2_EVENT_MSM_VIDC_HW_OVERLOAD,
818f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED
8196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal};
8206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
8216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd)
8226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
8288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
8378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < array_sz) {
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (--i; i >=0 ; i--) {
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(&sub, 0, sizeof(sub));
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sub.type = event_type[i];
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
8478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
8566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
8628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
8718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
8766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
8776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::~omx_vdec
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destructor
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_vdec::~omx_vdec()
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info = NULL;
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (msg_thread_created) {
896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread");
897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        message_thread_stop = true;
898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        post_message(this, OMX_COMPONENT_CLOSE_MSG);
899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pthread_join(msg_thread_id,NULL);
901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    close(m_pipe_in);
903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    close(m_pipe_out);
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_in = -1;
90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pipe_out = -1;
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if(eventfd_write(m_poll_efd, 1)) {
908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno);
909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         async_thread_force_stop = true;
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (async_thread_created)
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_join(async_thread_id,NULL);
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsubscribe_to_events(drv_ctx.video_driver_fd);
915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    close(m_poll_efd);
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(drv_ctx.video_driver_fd);
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&m_lock);
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&c_lock);
91997e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    pthread_mutex_destroy(&buf_lock);
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    sem_destroy(&m_cmd_lock);
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec_time.end();
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
9258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd);
926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_perf_control.send_hint_to_mpctl(false);
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = 0;
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
9388b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan    } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) {
9398b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
9408b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan        bufreq.count = 0;
9418b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
9428b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
9456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
9466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
947e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format)
948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int rc = 0;
950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_ext_control ctrl[2];
951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_ext_controls controls;
952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s",
954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         is_split_mode ? "split" : "combined",
955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc":
956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc":
957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb":
958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         "unknown",
959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         capture_capability == V4L2_PIX_FMT_NV12 ? "nv12":
960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc":
961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         "unknown");
962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE;
964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (is_split_mode) {
965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY;
966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else {
967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY;
968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT;
971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    ctrl[1].value = dpb_color_format;
972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    controls.count = 2;
974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    controls.controls = ctrl;
976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls);
978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc) {
979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc);
980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return OMX_ErrorUnsupportedSetting;
981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNone;
983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
986e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool force_split_mode)
987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE eRet = OMX_ErrorNone;
989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool cpu_access = capture_capability != V4L2_PIX_FMT_NV12_UBWC;
991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool is_res_above_1080p = (drv_ctx.video_resolution.frame_width > 1920 &&
993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.frame_height > 1088) ||
994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (drv_ctx.video_resolution.frame_height > 1088 &&
995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             drv_ctx.video_resolution.frame_width > 1920);
996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (cpu_access) {
998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((m_force_compressed_for_dpb || is_res_above_1080p) &&
1000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                !force_split_mode) {
1001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                //split DPB-OPB
1002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                //DPB -> UBWC , OPB -> Linear
1003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
1004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else if (force_split_mode) {
1005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        //DPB -> Linear, OPB -> Linear
1006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
1007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else {
1008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        //DPB-OPB combined linear
1009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
1010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           }
1011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
1012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //split DPB-OPB
1013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //DPB -> UBWC, OPB -> Linear
1014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else { //no cpu access
1017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
1018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (force_split_mode) {
1019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                //split DPB-OPB
1020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                //DPB -> UBWC, OPB -> UBWC
1021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
1022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else {
1023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                //DPB-OPB combined UBWC
1024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
1025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
1027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //split DPB-OPB
1028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //DPB -> UBWC, OPB -> UBWC
1029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (eRet) {
1033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet);
1034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return eRet;
1036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdec::enable_downscalar()
1039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int rc = 0;
1041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_control control;
1042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_format fmt;
1043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (is_down_scalar_enabled) {
1045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("%s: already enabled", __func__);
1046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return 0;
1047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_LOW("omx_vdec::enable_downscalar");
1050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = decide_dpb_buffer_mode(true);
1051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc) {
1052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__);
1053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return rc;
1054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    is_down_scalar_enabled = true;
1056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&control, 0x0, sizeof(struct v4l2_control));
1058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO;
1059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    control.value = 1;
1060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
1061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc) {
1062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__);
1063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return rc;
1064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return 0;
1067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdec::disable_downscalar()
1070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int rc = 0;
1072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_control control;
1073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!is_down_scalar_enabled) {
1075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled");
1076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return 0;
1077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = decide_dpb_buffer_mode(false);
1080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc < 0) {
1081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__);
1082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return rc;
1083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    is_down_scalar_enabled = false;
1085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return rc;
1087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_vdec::decide_downscalar()
1090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int rc = 0;
1092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_format fmt;
1093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    enum color_fmts color_format;
1094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if  (!m_downscalar_width || !m_downscalar_height) {
1096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("%s: downscalar not supported", __func__);
1097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return 0;
1098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_force_down_scalar) {
1101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar);
1102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return 0;
1103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&fmt, 0x0, sizeof(struct v4l2_format));
1106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fmt.fmt.pix_mp.pixelformat = capture_capability;
1108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc < 0) {
1110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
1111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       return rc;
1112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d", __func__,
1115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height);
1116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height > m_downscalar_width * m_downscalar_height) {
1118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rc = enable_downscalar();
1119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (rc < 0) {
1120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
1121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return rc;
1122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_U32 width = m_downscalar_width > fmt.fmt.pix_mp.width ?
1125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            fmt.fmt.pix_mp.width : m_downscalar_width;
1126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_U32 height = m_downscalar_height > fmt.fmt.pix_mp.height ?
1127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            fmt.fmt.pix_mp.height : m_downscalar_height;
1128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (capture_capability) {
1129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case V4L2_PIX_FMT_NV12:
1130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                color_format = COLOR_FMT_NV12;
1131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
1132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case V4L2_PIX_FMT_NV12_UBWC:
1133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                color_format = COLOR_FMT_NV12_UBWC;
1134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
1135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case V4L2_PIX_FMT_NV12_TP10_UBWC:
1136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                color_format = COLOR_FMT_NV12_BPP10_UBWC;
1137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
1138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            default:
1139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("Color format not recognized\n");
1140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                rc = OMX_ErrorUndefined;
1141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                return rc;
1142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rc = update_resolution(width, height,
1145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                VENUS_Y_STRIDE(color_format, width), VENUS_Y_SCANLINES(color_format, height));
1146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (rc < 0) {
1147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("%s: update_resolution WxH %dx%d failed \n", __func__, width, height);
1148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return rc;
1149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else {
1151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rc = disable_downscalar();
1153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (rc < 0) {
1154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
1155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return rc;
1156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rc = update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
1159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
1160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (rc < 0) {
1161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("%s: update_resolution WxH %dx%d failed\n", __func__, fmt.fmt.pix_mp.width,
1162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                fmt.fmt.pix_mp.height);
1163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return rc;
1164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&fmt, 0x0, sizeof(struct v4l2_format));
1168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    fmt.fmt.pix_mp.pixelformat = capture_capability;
1172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc) {
1174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
1175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return rc;
1176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = get_buffer_req(&drv_ctx.op_buf);
1179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc) {
1180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__);
1181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return rc;
1182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return rc;
1185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::OMXCntrlProcessMsgCb
1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL Client callbacks are generated through this routine. The decoder
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   provides the thread context for this routine.
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
119961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
120061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
120261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
120361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
120561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
12088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p1; // Parameter - 1
12098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p2; // Parameter - 2
12108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long ident;
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned qsize=0; // qsize
121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec *pThis = (omx_vdec *) ctxt;
121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!pThis) {
12158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Protect the shared queue data structure
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Read the message id's from the queue*/
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize) {
12268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pThis->m_cmd_q.pop_entry(&p1, &p2, &ident);
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_ftb_q.m_size;
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
12328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->m_ftb_q.pop_entry(&p1, &p2, &ident);
1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize = pThis->m_etb_q.m_size;
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (qsize) {
12398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pThis->m_etb_q.pop_entry(&p1, &p2, &ident);
1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*process message if we have one*/
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (qsize > 0) {
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id = ident;
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (id) {
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT:
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->m_cb.EventHandler) {
125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        switch (p1) {
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandStateSet:
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_state = (OMX_STATETYPE) p2;
12538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->m_state);
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL);
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_EventError:
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_StateInvalid) {
12618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_state = (OMX_STATETYPE) p2;
126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
12658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                } else if (p2 == (unsigned long)OMX_ErrorHardware) {
126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->omx_report_error();
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortDisable:
12748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2);
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (BITMASK_PRESENT(&pThis->m_flags,
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    break;
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
12848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    pThis->in_reconfig = false;
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet !=  OMX_ErrorNone) {
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_error();
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            case OMX_CommandPortEnable:
12978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2);
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            default:
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_EventCmdComplete, p1, p2, NULL );
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
13098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
13148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
13158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
1319f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                case OMX_COMPONENT_GENERATE_ETB: {
1320f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        OMX_ERRORTYPE iret;
1321f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2);
1322f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        if (iret == OMX_ErrorInsufficientResources) {
1323f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload");
1324f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            pThis->omx_report_hw_overload ();
1325f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        } else if (iret != OMX_ErrorNone) {
1326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
1327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            pThis->omx_report_error ();
1328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
1329f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    }
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FTB:
13338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\
13348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
13358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_COMMAND:
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (OMX_U32)p2,(OMX_PTR)NULL);
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EBD:
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
13488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pThis->omx_report_error ();
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->time_stamp_dts.remove_time_stamp(
13538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp,
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    ?true:false);
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
1357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
13598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) {
13608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pThis->omx_report_error ();
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
13668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            int64_t *timestamp = (int64_t *)(intptr_t)p1;
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (p1) {
136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->time_stamp_dts.remove_time_stamp(*timestamp,
136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        ?true:false);
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                free(timestamp);
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_FBD:
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (p2 != VDEC_S_SUCCESS) {
13778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->omx_report_error ();
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
13808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) {
13818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_ERROR("fill_buffer_done failure");
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->omx_report_error ();
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
13878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (!pThis->input_flush_progress) {
13898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->execute_input_flush();
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (pThis->m_cb.EventHandler) {
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                if (p2 != VDEC_S_SUCCESS) {
13948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->omx_report_error ();
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                } else {
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    /*Check if we need generate event for Flush done*/
1398a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                                                    pThis->notify_flush_done(ctxt);
1399a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    if (BITMASK_PRESENT(&pThis->m_flags,
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                OMX_COMPONENT_IDLE_PENDING)) {
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
14038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            pThis->omx_report_error ();
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        } else {
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            pThis->streaming[OUTPUT_PORT] = false;
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        }
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        if (!pThis->output_flush_progress) {
14098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                            DEBUG_PRINT_LOW("Input flush done hence issue stop");
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        }
141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    }
141461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                }
141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
14228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (!pThis->output_flush_progress) {
14248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->execute_output_flush();
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (pThis->m_cb.EventHandler) {
142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                if (p2 != VDEC_S_SUCCESS) {
14298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->omx_report_error ();
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                } else {
143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    /*Check if we need generate event for Flush done*/
1433a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                                                    pThis->notify_flush_done(ctxt);
1434a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    if (BITMASK_PRESENT(&pThis->m_flags,
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
14378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                        DEBUG_PRINT_LOW("Internal flush complete");
143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        BITMASK_CLEAR (&pThis->m_flags,
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        if (BITMASK_PRESENT(&pThis->m_flags,
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            pThis->post_event(OMX_CommandPortDisable,
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                    OMX_CORE_OUTPUT_PORT_INDEX,
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                    OMX_COMPONENT_GENERATE_EVENT);
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            BITMASK_CLEAR (&pThis->m_flags,
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
14478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                            BITMASK_CLEAR (&pThis->m_flags,
14488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                                    OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        }
145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    }
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
14558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            pThis->omx_report_error ();
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            break;
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        }
145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        pThis->streaming[CAPTURE_PORT] = false;
146061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        if (!pThis->input_flush_progress) {
14618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                            DEBUG_PRINT_LOW("Output flush done hence issue stop");
146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        }
146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    }
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                }
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_START_DONE:
14748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (pThis->m_cb.EventHandler) {
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (p2 != VDEC_S_SUCCESS) {
14788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->omx_report_error ();
148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
14818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
14838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_LOW("Move to executing");
148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    // Send the callback now
148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_state = OMX_StateExecuting;
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_StateExecuting, NULL);
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                } else if (BITMASK_PRESENT(&pThis->m_flags,
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_COMPONENT_PAUSE_PENDING)) {
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                          VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
14948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                        DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        pThis->omx_report_error ();
149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    }
149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                }
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
15008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_LOW("Event Handler callback is NULL");
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
15058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (pThis->m_cb.EventHandler) {
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (p2 != VDEC_S_SUCCESS) {
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->omx_report_error ();
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->complete_pending_buffer_done_cbs();
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
15138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    //Send the callback now
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_state = OMX_StatePause;
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_StatePause, NULL);
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                }
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_RESUME_DONE:
15298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (pThis->m_cb.EventHandler) {
153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (p2 != VDEC_S_SUCCESS) {
15328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->omx_report_error ();
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
15368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_LOW("Moving the decoder to execute state");
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    // Send the callback now
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_state = OMX_StateExecuting;
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_StateExecuting,NULL);
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                }
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_STOP_DONE:
15528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (pThis->m_cb.EventHandler) {
155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            if (p2 != VDEC_S_SUCCESS) {
15558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->omx_report_error ();
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                pThis->complete_pending_buffer_done_cbs();
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
15608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    // Send the callback now
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_state = OMX_StateIdle;
15648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                    DEBUG_PRINT_LOW("Move to Idle State");
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                            OMX_StateIdle,NULL);
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                }
156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (p2 == OMX_IndexParamPortDefinition) {
1578f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition");
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->in_reconfig = true;
1580f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        }  else if (p2 == OMX_IndexConfigCommonOutputCrop) {
1581f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop");
1582f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1583f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            /* Check if resolution is changed in smooth streaming mode */
1584f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            if (pThis->m_smoothstreaming_mode &&
1585f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                (pThis->framesize.nWidth !=
1586f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->drv_ctx.video_resolution.frame_width) ||
1587f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                (pThis->framesize.nHeight !=
1588f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->drv_ctx.video_resolution.frame_height)) {
1589f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1590f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d",
1591f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->framesize.nWidth,
1592f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->framesize.nHeight,
1593f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->drv_ctx.video_resolution.frame_width,
1594f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->drv_ctx.video_resolution.frame_height);
1595f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1596f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                /* Update new resolution */
1597f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                pThis->framesize.nWidth =
1598f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                       pThis->drv_ctx.video_resolution.frame_width;
1599f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                pThis->framesize.nHeight =
1600f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                       pThis->drv_ctx.video_resolution.frame_height;
1601f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1602f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                /* Update C2D with new resolution */
1603f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                if (!pThis->client_buffers.update_buffer_req()) {
1604f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed");
1605f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                }
1606f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            }
1607f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1608f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            /* Update new crop information */
1609f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left;
1610f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top;
1611f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right;
1612f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom;
1613f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1614f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            /* Validate the new crop information */
1615f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            if (pThis->rectangle.nLeft + pThis->rectangle.nWidth >
1616f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                pThis->drv_ctx.video_resolution.frame_width) {
1617f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1618f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]",
1619f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->rectangle.nLeft, pThis->rectangle.nWidth,
1620f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->drv_ctx.video_resolution.frame_width);
1621f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                pThis->rectangle.nLeft = 0;
1622f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1623f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                if (pThis->rectangle.nWidth >
1624f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->drv_ctx.video_resolution.frame_width) {
1625f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1626f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]",
1627f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                            pThis->rectangle.nWidth,
1628f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                            pThis->drv_ctx.video_resolution.frame_width);
1629f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->rectangle.nWidth =
1630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->drv_ctx.video_resolution.frame_width;
1631f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                }
1632f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            }
1633f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            if (pThis->rectangle.nTop + pThis->rectangle.nHeight >
1634f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                pThis->drv_ctx.video_resolution.frame_height) {
1635f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1636f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]",
1637f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->rectangle.nTop, pThis->rectangle.nHeight,
1638f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->drv_ctx.video_resolution.frame_height);
1639f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                pThis->rectangle.nTop = 0;
1640f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1641f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                if (pThis->rectangle.nHeight >
1642f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->drv_ctx.video_resolution.frame_height) {
1643f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
1644f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]",
1645f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->rectangle.nHeight,
1646f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->drv_ctx.video_resolution.frame_height);
1647f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->rectangle.nHeight =
1648f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                        pThis->drv_ctx.video_resolution.frame_height;
1649f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                }
1650f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            }
1651f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u",
1652f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->rectangle.nLeft, pThis->rectangle.nTop,
1653f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                    pThis->rectangle.nWidth, pThis->rectangle.nHeight);
1654ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                                        } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) {
1655ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects");
1656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        } else {
1657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2);
1658f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            break;
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
1660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        if (pThis->m_debug.outfile) {
1661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            fclose(pThis->m_debug.outfile);
1662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            pThis->m_debug.outfile = NULL;
1663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        }
1664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        if (pThis->m_debug.out_ymeta_file) {
1665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            fclose(pThis->m_debug.out_ymeta_file);
1666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            pThis->m_debug.out_ymeta_file = NULL;
1667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        }
1668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        if (pThis->m_debug.out_uvmeta_file) {
1669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            fclose(pThis->m_debug.out_uvmeta_file);
1670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            pThis->m_debug.out_uvmeta_file = NULL;
1671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        }
1672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1673bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch                                        if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) {
1674bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch                                            pThis->prefetchNewBuffers();
1675bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch                                        }
1676bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (pThis->m_cb.EventHandler) {
1678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            uint32_t frame_data[2];
1679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ?
1680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                pThis->m_reconfig_height : pThis->rectangle.nHeight;
1681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ?
1682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                pThis->m_reconfig_width : pThis->rectangle.nWidth;
168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
1684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                    OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data );
168561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_EOS_DONE:
16918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (pThis->m_cb.EventHandler) {
169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                    OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->prev_ts = LLONG_MAX;
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->rst_prev_ts = true;
170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
17038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
1704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        pThis->omx_report_error();
170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
17088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING");
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        pThis->omx_report_unsupported_setting();
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1712f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD:
1713f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD");
1714f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        pThis->omx_report_hw_overload();
1715f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        break;
1716f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
1719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&pThis->m_lock);
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qsize = pThis->m_cmd_q.m_size;
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pThis->m_state != OMX_StatePause)
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&pThis->m_lock);
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (qsize>0);
1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
17306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
17316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int format_changed = 0;
17338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((height != (int)drv_ctx.video_resolution.frame_height) ||
17348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (width != (int)drv_ctx.video_resolution.frame_width)) {
17358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)",
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                width, drv_ctx.video_resolution.frame_width,
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                height,drv_ctx.video_resolution.frame_height);
173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        format_changed = 1;
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
17406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_height = height;
17416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.frame_width = width;
17426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.scan_lines = scan_lines;
17436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    drv_ctx.video_resolution.stride = stride;
1744f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if(!is_down_scalar_enabled) {
1745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rectangle.nLeft = 0;
1746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rectangle.nTop = 0;
1747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rectangle.nWidth = drv_ctx.video_resolution.frame_width;
1748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        rectangle.nHeight = drv_ctx.video_resolution.frame_height;
1749f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return format_changed;
17516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1752dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
17536eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::is_video_session_supported()
17546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE) &&
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_decoder_capability.max_width = 1280;
175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_decoder_capability.max_height = 720;
176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((drv_ctx.video_resolution.frame_width *
176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.video_resolution.frame_height >
176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_decoder_capability.max_width *
176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_decoder_capability.max_height) ||
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (drv_ctx.video_resolution.frame_width*
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             drv_ctx.video_resolution.frame_height <
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             m_decoder_capability.min_width *
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             m_decoder_capability.min_height)) {
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR(
177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.video_resolution.frame_width,
177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.video_resolution.frame_height,
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_decoder_capability.min_width,
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_decoder_capability.min_height,
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_decoder_capability.max_width,
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_decoder_capability.max_height);
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUnsupportedSetting;
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
17818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("video session supported");
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
17836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
17858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len)
17868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
17878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.in_buffer_log && !m_debug.infile) {
17888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
1789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v",
17908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                   m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
1792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc,
1793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
1795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263",
17968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) ||
17988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
1799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264",
18008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
1802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265",
1803f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
1805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
18068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) {
1808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
18098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
1811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
18128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
1814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
1815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else {
1817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx",
1818f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1819f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
18208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = fopen (m_debug.infile_name, "ab");
18218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.infile) {
18228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
18238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.infile_name[0] = '\0';
18248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
18258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
1826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
1827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
18288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct ivf_file_header {
18298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U8 signature[4]; //='DKIF';
18308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U8 version         ; //= 0;
18318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U8 headersize      ; //= 32;
18328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 FourCC;
18338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U8 width;
18348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U8 height;
18358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 rate;
18368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 scale;
18378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 length;
18388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U8 unused[4];
18398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } file_header;
18408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            memset((void *)&file_header,0,sizeof(file_header));
18428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            file_header.signature[0] = 'D';
18438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            file_header.signature[1] = 'K';
18448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            file_header.signature[2] = 'I';
18458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            file_header.signature[3] = 'F';
18468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            file_header.version = 0;
18478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            file_header.headersize = 32;
1848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            switch (drv_ctx.decoder_format) {
1849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                case VDEC_CODECTYPE_VP8:
1850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    file_header.FourCC = 0x30385056;
1851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    break;
1852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                case VDEC_CODECTYPE_VP9:
1853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    file_header.FourCC = 0x30395056;
1854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    break;
1855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                default:
1856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("unsupported format for VP8/VP9");
1857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    break;
1858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
18598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fwrite((const char *)&file_header,
18608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    sizeof(file_header),1,m_debug.infile);
18618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan         }
18628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile && buffer_addr && buffer_len) {
1864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
1865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
1866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            struct vpx_ivf_frame_header {
18678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 framesize;
18688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 timestamp_lo;
18698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_U32 timestamp_hi;
1870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } vpx_frame_header;
1871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            vpx_frame_header.framesize = buffer_len;
18728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            /* Currently FW doesn't use timestamp values */
1873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            vpx_frame_header.timestamp_lo = 0;
1874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            vpx_frame_header.timestamp_hi = 0;
1875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            fwrite((const char *)&vpx_frame_header,
1876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    sizeof(vpx_frame_header),1,m_debug.infile);
18778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
18788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fwrite(buffer_addr, buffer_len, 1, m_debug.infile);
18798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
18808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
18818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
18828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
18838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) {
1884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int buf_index = 0;
1885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    char *temp = NULL;
1886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1887f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (m_debug.out_buffer_log && !m_debug.outfile && buffer->nFilledLen) {
1888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv",
18898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = fopen (m_debug.outfile_name, "ab");
18918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.outfile) {
18928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc);
18938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.outfile_name[0] = '\0';
18948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
18958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
18968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
1897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file
1899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        && buffer->nFilledLen) {
1900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta",
1901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta",
1903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
1904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab");
1905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab");
1906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) {
1907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc);
1908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_debug.out_ymetafile_name[0] = '\0';
1909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_debug.out_uvmetafile_name[0] = '\0';
1910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return -1;
1911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((!m_debug.outfile && !m_debug.out_ymeta_file) || !buffer || !buffer->nFilledLen)
1915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return 0;
1916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    buf_index = buffer - m_out_mem_ptr;
1918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
1919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
1921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)",
1922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.frame_width,
1923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.video_resolution.frame_height);
1924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_debug.outfile)
1926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile);
1927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) {
1929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            unsigned int width = 0, height = 0;
1930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            unsigned int y_plane, y_meta_plane;
1931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            int y_stride = 0, y_sclines = 0;
1932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0;
1933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            int color_fmt = COLOR_FMT_NV12_UBWC;
1934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            int i;
1935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            int bytes_written = 0;
1936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            width = drv_ctx.video_resolution.frame_width;
1938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            height = drv_ctx.video_resolution.frame_height;
1939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
1940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
1941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            y_stride = VENUS_Y_STRIDE(color_fmt, width);
1942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
1943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
1944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
1945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096);
1947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
1948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
1950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            for (i = 0; i < y_meta_scanlines; i++) {
1951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file);
1952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 temp += y_meta_stride;
1953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane;
1956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            for(i = 0; i < uv_meta_scanlines; i++) {
1957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file);
1958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                temp += uv_meta_stride;
1959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12 && m_debug.outfile) {
19628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int stride = drv_ctx.video_resolution.stride;
19638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int scanlines = drv_ctx.video_resolution.scan_lines;
19648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_smoothstreaming_mode) {
19658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            stride = drv_ctx.video_resolution.frame_width;
19668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            scanlines = drv_ctx.video_resolution.frame_height;
19678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
19688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
19698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned i;
19718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)",
19728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_resolution.frame_width,
19738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.video_resolution.frame_height, stride, scanlines);
19748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int bytes_written = 0;
19758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
19768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan             bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
19778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan             temp += stride;
19788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
19808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int stride_c = stride;
19818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
19828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
19838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            temp += stride_c;
19848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
19858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
19868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
19878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
19888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentInit
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Initialize the component.
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ctxt -- Context information related to the self.
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   id   -- Event identifier. This could be any of the following:
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   1. Command completion event
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   2. Buffer done callback event
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   3. Frame done callback event
2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_fmtdesc fdesc;
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_frmsizeenum frmsize;
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0;
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fds[2];
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r,ret=0;
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool codec_ambiguous = false;
2020f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    OMX_STRING device_name = (OMX_STRING)"/dev/video32";
20218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
2022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    FILE *soc_file = NULL;
2023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    char buffer[10];
202450ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan
20256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char platform_name[PROPERTY_VALUE_MAX];
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("ro.board.platform", platform_name, "0");
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(platform_name, "msm8610", 7)) {
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        device_name = (OMX_STRING)"/dev/video/q6_dec";
20308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        is_q6_platform = true;
20318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        maxSmoothStreamingWidth = 1280;
20328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        maxSmoothStreamingHeight = 720;
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
20346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
20356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
2036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    is_thulium_v1 = false;
2037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    soc_file = fopen("/sys/devices/soc0/soc_id", "r");
2038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (soc_file) {
2039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fread(buffer, 1, 4, soc_file);
2040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fclose(soc_file);
2041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (atoi(buffer) == 246) {
2042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            soc_file = fopen("/sys/devices/soc0/revision", "r");
2043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (soc_file) {
2044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                fread(buffer, 1, 4, soc_file);
2045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                fclose(soc_file);
2046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (atoi(buffer) == 1) {
2047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    is_thulium_v1 = true;
2048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE");
2049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
2050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
2051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
20548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _ANDROID_
20558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    /*
20568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan     * turn off frame parsing for Android by default.
20578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan     * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode
20588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan     */
20598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    arbitrary_bytes = false;
2060f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
2061f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (atoi(property_value)) {
2062f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command");
2063f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        arbitrary_bytes = true;
2064f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
20658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
20668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2067f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",
2068f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        secure_mode = true;
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        arbitrary_bytes = false;
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
20728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",
20738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
20748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        secure_mode = true;
20758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        arbitrary_bytes = false;
20768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2";
2077f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure",
2078f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
2079f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        secure_mode = true;
2080f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        arbitrary_bytes = false;
2081f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        role = (OMX_STRING)"OMX.qcom.video.decoder.hevc";
2082f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure",
2083f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
2084f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        secure_mode = true;
2085f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        arbitrary_bytes = false;
2086f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        role = (OMX_STRING)"OMX.qcom.video.decoder.vc1";
2087f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.secure",
2088f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
2089f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        secure_mode = true;
2090f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        arbitrary_bytes = false;
2091f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        role = (OMX_STRING)"OMX.qcom.video.decoder.wmv";
2092f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.secure",
2093f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
2094f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        secure_mode = true;
2095f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        arbitrary_bytes = false;
2096f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg4";
2097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.secure",
2098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_MAX_STRINGNAME_SIZE)) {
2099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        secure_mode = true;
2100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        arbitrary_bytes = false;
2101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        role = (OMX_STRING)"OMX.qcom.video.decoder.vp9";
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
21068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd);
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.video_driver_fd < 0) {
21098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    drv_ctx.frame_rate.fps_denominator = 1;
2114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_poll_efd = eventfd(0, 0);
2115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_poll_efd < 0) {
2116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno));
2117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return OMX_ErrorInsufficientResources;
2118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = subscribe_to_events(drv_ctx.video_driver_fd);
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!ret) {
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        async_thread_created = true;
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = pthread_create(&async_thread_id,0,async_message_thread,this);
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
21258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        async_thread_created = false;
212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
21318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    outputExtradataFile = fopen (output_extradata_filename, "ab");
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Copy the role information which provides the decoder kind
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    strlcpy(drv_ctx.kind,role,128);
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.timestamp_adjust = true;
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_MPEG4;
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG4*/
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG4;
2147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE);
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_MPEG2;
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Initialize Start Code for MPEG2*/
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_MPEG2;
2157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
21618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("H263 Decoder selected");
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingH263;
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_H263;
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H263;
2166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
21708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX_311;
217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
2175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
21808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
2186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
21918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_DIVX;
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_DIVX;
219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_ambiguous = true;
2197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability=V4L2_PIX_FMT_H264;
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingAVC;
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_H264;
2206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
2208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (is_thulium_v1) {
2209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            arbitrary_bytes = true;
2210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264");
2211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
22128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\
22138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
22148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
22158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_MVC;
22168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        output_capability = V4L2_PIX_FMT_H264_MVC;
22178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC;
22188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_type_parse = CODEC_TYPE_H264;
22198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.init_start_codes(codec_type_parse);
22208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
22218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
22228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
22238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
22248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
22258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        output_capability = V4L2_PIX_FMT_HEVC;
2226f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
22278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        codec_type_parse = CODEC_TYPE_HEVC;
22288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.init_start_codes(codec_type_parse);
22298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
2237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingWMV;
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VC1;
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
2245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_parser.init_start_codes(codec_type_parse);
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",    \
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_MAX_STRINGNAME_SIZE)) {
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
2249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        drv_ctx.decoder_format = VDEC_CODECTYPE_VP8;
2250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        output_capability = V4L2_PIX_FMT_VP8;
22515aa03230fef7a43a61e1ac5f19a2c5a71e5d6df7Praveen Chavan        eCompressionFormat = OMX_VIDEO_CodingVP8;
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_type_parse = CODEC_TYPE_VP8;
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        arbitrary_bytes = false;
2254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",    \
2255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_MAX_STRINGNAME_SIZE)) {
2256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
2257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        drv_ctx.decoder_format = VDEC_CODECTYPE_VP9;
2258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        output_capability = V4L2_PIX_FMT_VP9;
2259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        eCompressionFormat = OMX_VIDEO_CodingVP9;
2260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        codec_type_parse = CODEC_TYPE_VP9;
2261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        arbitrary_bytes = false;
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
22638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
22688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_COLOR_FORMATTYPE dest_color_format;
2269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_disable_ubwc_mode) {
2270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
2271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else {
2272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC;
2273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
22748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC)
22758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dest_color_format = (OMX_COLOR_FORMATTYPE)
22768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
22778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
22788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dest_color_format = (OMX_COLOR_FORMATTYPE)
2279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
22806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        if (!client_buffers.set_color_format(dest_color_format)) {
22818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Setting color format failed");
22826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            eRet = OMX_ErrorInsufficientResources;
22836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        }
2284dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8;
2286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_disable_ubwc_mode) {
2288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            capture_capability = V4L2_PIX_FMT_NV12;
2289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else {
2290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            capture_capability = V4L2_PIX_FMT_NV12_UBWC;
2291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_capability cap;
229461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
22968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to query capabilities");
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
2299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
2300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                " version = %d, capabilities = %x", cap.driver, cap.card,
2301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                cap.bus_info, cap.version, cap.capabilities);
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=0;
230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
23078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
231261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index=0;
231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
23158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fdesc.pixelformat, fdesc.flags);
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fdesc.index++;
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
23196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        update_resolution(320, 240, 320, 240);
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
23278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on output port");
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
23308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_ambiguous) {
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (output_capability == V4L2_PIX_FMT_DIVX) {
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_control divx_ctrl;
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ret) {
23468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Failed to set divx version");
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
23538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR);
23548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_conceal_color= atoi(property_value);
23558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color);
23568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR;
23578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        control.value = m_conceal_color;
23588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
23598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ret) {
23608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret);
23618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
23628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //Get the hardware capabilities
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset((void *)&frmsize,0,sizeof(frmsize));
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frmsize.index = 0;
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frmsize.pixel_format = output_capability;
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                VIDIOC_ENUM_FRAMESIZES, &frmsize);
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
23708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to get framesizes");
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_decoder_capability.min_width = frmsize.stepwise.min_width;
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_decoder_capability.max_width = frmsize.stepwise.max_width;
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_decoder_capability.min_height = frmsize.stepwise.min_height;
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_decoder_capability.max_height = frmsize.stepwise.max_height;
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2381f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        memset(&fmt, 0x0, sizeof(struct v4l2_format));
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
23898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set format on capture port");
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2391f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE));
2392f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        framesize.nWidth = drv_ctx.video_resolution.frame_width;
2393f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        framesize.nHeight = drv_ctx.video_resolution.frame_height;
2394f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
2395f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE));
2396f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        rectangle.nWidth = drv_ctx.video_resolution.frame_width;
2397f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        rectangle.nHeight = drv_ctx.video_resolution.frame_height;
2398f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
23998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set Format was successful");
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = 1;
24038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
24048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
24058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (ret) {
24068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
24078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                return OMX_ErrorInsufficientResources;
24088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
24098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
24108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (output_capability == V4L2_PIX_FMT_H264_MVC) {
24118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT;
24128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM;
2413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ret) {
24158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed to set MVC buffer layout");
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
24196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
2420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (is_thulium_v1) {
2421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            eRet = enable_smoothstreaming();
2422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (eRet != OMX_ErrorNone) {
2423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver");
2424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               return eRet;
2425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
2426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Get the Buffer requirements for input and output ports*/
242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
2431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode) {
2433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.op_buf.alignment = SECURE_ALIGN;
2434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.ip_buf.alignment = SECURE_ALIGN;
243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
2436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.op_buf.alignment = SZ_4K;
2437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.ip_buf.alignment = SZ_4K;
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata = 0;
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.idr_only_decoding = 0;
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef _ANDROID_
2449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        property_get("vidc.dec.downscalar_width",property_value,"0");
2450f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (atoi(property_value)) {
2451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_downscalar_width = atoi(property_value);
2452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        property_get("vidc.dec.downscalar_height",property_value,"0");
2454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (atoi(property_value)) {
2455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_downscalar_height = atoi(property_value);
2456f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
2457f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
2458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_downscalar_width < m_decoder_capability.min_width ||
2459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_downscalar_height < m_decoder_capability.min_height) {
2460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_downscalar_width = 0;
2461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_downscalar_height = 0;
2462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n",
2465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_downscalar_width, m_downscalar_height);
2466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
24676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        m_state = OMX_StateLoaded;
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef DEFAULT_EXTRADATA
2469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",
2470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_MAX_STRINGNAME_SIZE) &&
2471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",
2472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_MAX_STRINGNAME_SIZE)) &&
2473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (eRet == OMX_ErrorNone))
247469e702b93a3836f881c0dbc70f0813f87607cbb6Arun Menon                enable_extradata(DEFAULT_EXTRADATA, true, true);
2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
2476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        eRet = get_buffer_req(&drv_ctx.ip_buf);
2477f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size);
24786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        get_buffer_req(&drv_ctx.op_buf);
24798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
24808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC ||
24818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nOffset = 0;
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (h264_scratch.pBuffer == NULL) {
24888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
24918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
24928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
24938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
24948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_frame_parser.mutils == NULL) {
24958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_frame_parser.mutils = new H264_Utils();
24968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (m_frame_parser.mutils == NULL) {
24978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
24988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorInsufficientResources;
24998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->initialize_frame_checking_environment();
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_parser = new h264_stream_parser();
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!h264_parser) {
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pipe(fds)) {
25138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("pipe creation failed");
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_in = fds[0];
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pipe_out = fds[1];
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            msg_thread_created = true;
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            r = pthread_create(&msg_thread_id,0,message_thread,this);
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (r < 0) {
25228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("component_init(): message_thread creation failed");
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                msg_thread_created = false;
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25297ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan    {
25307ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        VendorExtensionStore *extStore = const_cast<VendorExtensionStore *>(&mVendorExtensionStore);
25317ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        init_vendor_extensions(*extStore);
25327ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        mVendorExtensionStore.dumpExtensions((const char *)role);
25337ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan    }
25347ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone) {
25368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Component Init Failed");
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
25388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d",
25398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.video_driver_fd);
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetComponentVersion
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the component version.
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   TBD.
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX_ErrorNone.
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_component_version
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_IN OMX_HANDLETYPE hComp,
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_STRING componentName,
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* componentVersion,
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_VERSIONTYPE* specVersion,
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan OMX_OUT OMX_UUIDTYPE* componentUUID
256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan )
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
25688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
25698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) componentName;
25708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) componentVersion;
25718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) componentUUID;
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
25738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* TBD -- Return the proper version */
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (specVersion) {
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        specVersion->nVersion = OMX_SPEC_VERSION;
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
26028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
26038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) cmdData;
26048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
26068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
26118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
26128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "to invalid port: %u", (unsigned int)param1);
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
26158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sem_wait(&m_cmd_lock);
26188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command: Command Processed");
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommand
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_COMMANDTYPE cmd,
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32 param1,
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR cmdData
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
26428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
26438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) cmdData;
264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int bFlag = 1,sem_posted = 0,ret=0;
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
26488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
26498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_state, eState);
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (cmd == OMX_CommandStateSet) {
26538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
26548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Loaded */
265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_state == OMX_StateLoaded) {
265961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
266061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //if all buffers are allocated or all ports disabled
266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (allocate_done() ||
266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
26638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
26658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
266761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
267061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
267161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Loaded */
267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
26738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to WaitForResources */
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
26828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
268361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Executing */
268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
26868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Pause */
269261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
26938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
269861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Loaded to Invalid */
269961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
27008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
27048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        eState);
270661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is IDLE */
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateIdle) {
271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (release_done()) {
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       Since error is None , we will post an event at the end
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       of this function definition
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     */
27208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
27228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // Skip the event notification
272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Executing */
272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
27308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
27338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state=OMX_StateExecuting;
27358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Idle */
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
27398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to WaitForResources */
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
27468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Pause */
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*To pause the Video core we need to start the driver*/
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      NULL) < */0) {
27568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eRet = OMX_ErrorHardware;
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
27618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    bFlag = 0;
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Idle to Invalid */
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
27678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
27718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Executing */
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /******************************/
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateExecuting) {
27808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Idle */
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateIdle) {
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 */
27868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Paused */
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
27978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("PAUSE Command Issued");
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StatePause;
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Loaded */
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
28038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to WaitForResources */
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
28108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Executing */
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
28178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Executing to Invalid */
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
28248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
28288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is Pause  */
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StatePause) {
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Executing */
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateExecuting) {
28388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Executing");
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state = OMX_StateExecuting;
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 1;
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Idle */
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateIdle) {
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
28468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pause --> Idle");
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!sem_posted) {
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_posted = 1;
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sem_post (&m_cmd_lock);
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_ALL);
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to loaded */
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateLoaded) {
28578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> loaded");
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to WaitForResources */
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
28648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Pause */
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
28718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Pause");
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,\
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from Pause to Invalid */
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
28788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Pause --> Invalid");
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
28828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorBadParameter;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* Current State is WaitForResources  */
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /***************************/
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (m_state == OMX_StateWaitForResources) {
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded */
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (eState == OMX_StateLoaded) {
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* Since error is None , we will post an event
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                   at the end of this function definition */
28948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to WaitForResources */
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateWaitForResources) {
28988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorSameState,
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorSameState;
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Executing */
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateExecuting) {
29058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Pause */
291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StatePause) {
29128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorIncorrectStateTransition;
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Invalid */
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else if (eState == OMX_StateInvalid) {
29198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInvalidState;
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Requesting transition from WaitForResources to Loaded -
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               is NOT tested by Khronos TS */
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
29278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /********************************/
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Current State is Invalid */
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*******************************/
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (m_state == OMX_StateInvalid) {
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* State Transition from Inavlid to any state */
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StateIdle || OMX_StateExecuting
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || OMX_StatePause || OMX_StateInvalid)) {
29398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_EventError,OMX_ErrorInvalidState,\
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInvalidState;
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandFlush) {
29458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
29468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "with param1: %u", (unsigned int)param1);
29478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _MSM8974_
2948a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        send_codec_config();
29498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
2950f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX ||
2951f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    param1 == OMX_ALL)) {
2952f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (android_atomic_add(0, &m_queued_codec_config_count) > 0) {
2953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               struct timespec ts;
2954f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
2955f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               clock_gettime(CLOCK_REALTIME, &ts);
2956f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               ts.tv_sec += 2;
2957f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ",
2958f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                       m_queued_codec_config_count);
2959f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED);
2960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               if (sem_timedwait(&m_safe_flush, &ts)) {
2961f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                   DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers");
2962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               }
2963f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED);
2964f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
2965f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
2966f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!sem_posted) {
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_posted = 1;
29758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Semaphore");
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sem_post (&m_cmd_lock);
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            execute_omx_flush(param1);
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bFlag = 0;
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( cmd == OMX_CommandPortEnable) {
29818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
29828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "with param1: %u", (unsigned int)param1);
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_TRUE;
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || allocate_input_done()) {
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
29928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
29998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Enable output Port command recieved");
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_TRUE;
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( (m_state == OMX_StateLoaded &&
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    || (allocate_output_done())) {
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
30098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
301161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
3013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                /* enable/disable downscaling if required */
3014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                ret = decide_downscalar();
3015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (ret) {
3016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_LOW("decide_downscalar failed\n");
3017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (cmd == OMX_CommandPortDisable) {
30218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
30228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "with param1: %u", (unsigned int)param1);
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
3024a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan            codec_config_flag = false;
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bEnabled = OMX_FALSE;
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_input_done()) {
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
3029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
3039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bEnabled = OMX_FALSE;
30468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Disable output Port command recieved");
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    && release_output_done()) {
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
3050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!sem_posted) {
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_posted = 1;
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        sem_post (&m_cmd_lock);
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Skip the event notification
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bFlag = 0;
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
30678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone && bFlag) {
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!sem_posted) {
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sem_post(&m_cmd_lock);
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ExecuteOmxFlush
3083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Executes the OMX flush.
3086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   flushtype - input flush(1)/output flush(0)/ both.
3089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
3092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
3095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_decoder_cmd dec;
31008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType);
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_flush_progress = true;
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* XXX: The driver/hardware does not support flushing of individual ports
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan         * in all states. So we pretty much need to flush both ports internally,
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan         * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan         * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan         * we automatically omit sending the FLUSH done for the "opposite" port. */
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input_flush_progress = true;
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        output_flush_progress = true;
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
3118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        request_perf_level(VIDC_TURBO);
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
31228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType);
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = false;
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
3127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
3129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_output_flush
3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
313261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at OUTPUT PORT.
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
313561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
3139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
3140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_output_flush()
3141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
31428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p1 = 0; // Parameter - 1
31438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p2 = 0; // Parameter - 2
31448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long ident = 0;
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate FBD for all Buffers in the FTBq*/
314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
31498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Output Flush");
31508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
31518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    //reset last render TS
31528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if(m_last_rendered_TS > 0) {
31538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_last_rendered_TS = 0;
31548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
31558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
31578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d",
315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_ftb_q.m_size,pending_output_buffers);
315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
31608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2);
316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == m_fill_output_msg ) {
31628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2);
316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
31648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1);
316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
3166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_flush_progress = false;
316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
31748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*=========================================================================
3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION : execute_input_flush
3179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
318161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanExecutes the OMX flush at INPUT PORT.
3182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
318461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNone.
3185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavantrue/false
3188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev==========================================================================*/
3189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::execute_input_flush()
3190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned       i =0;
31928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p1 = 0; // Parameter - 1
31938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p2 = 0; // Parameter - 2
31948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long ident = 0;
319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = true;
319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Generate EBD for all Buffers in the ETBq*/
31988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Initiate Input Flush");
319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
32018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Check if the Queue is empty");
320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
320461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
32068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_input_buffers++;
32108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
32148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_BUFFERHEADERTYPE *)p1);
321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    time_stamp_dts.flush_timestamp();
322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Check if Heap Buffers are to be flushed*/
322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes && !(codec_config_flag)) {
32228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Reset all the variables before flusing");
322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
32318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Initialize parser");
323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils) {
323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
3235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (m_input_pending_q.m_size) {
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&p1,&p2,&ident);
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
3240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
3245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
32488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL,
324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned int)NULL);
325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (codec_config_flag) {
325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "is not sent to the driver yet");
325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    input_flush_progress = false;
325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = LLONG_MAX;
326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
3263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
32688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
3270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3272a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka/*=========================================================================
3273a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaFUNCTION : notify_flush_done
3274a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaDESCRIPTION
3275a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaNotifies flush done to the OMX Client.
3276a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaPARAMETERS
3277a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lankactxt -- Context information related to the self..
3278a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaRETURN VALUE
3279a61df3d5c4abd639448faae4e77c1b291938f53aMahesh LankaNONE
3280a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka==========================================================================*/
3281a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lankavoid omx_vdec::notify_flush_done(void *ctxt) {
3282a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka    omx_vdec *pThis = (omx_vdec *) ctxt;
3283a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka    if (!pThis->input_flush_progress && !pThis->output_flush_progress) {
3284a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka        if (BITMASK_PRESENT(&pThis->m_flags,
3285a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
3286a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka            DEBUG_PRINT_LOW("Notify Output Flush done");
3287a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka            BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
3288a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
3289a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                OMX_EventCmdComplete,OMX_CommandFlush,
3290a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                OMX_CORE_OUTPUT_PORT_INDEX,NULL );
3291a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka        }
3292a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka
3293a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka        if (BITMASK_PRESENT(&pThis->m_flags,
3294a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
3295a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka            BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
3296a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka            DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
3297a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
3298a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                    OMX_EventCmdComplete,OMX_CommandFlush,
3299a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka                    OMX_CORE_INPUT_PORT_INDEX,NULL );
3300a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka        }
3301a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka    }
3302a61df3d5c4abd639448faae4e77c1b291938f53aMahesh Lanka}
3303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SendCommandEvent
3307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Send the event to decoder pipe.  This is needed to generate the callbacks
331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   in decoder thread context.
3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
331261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
3314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
3317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
33198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool omx_vdec::post_event(unsigned long p1,
33208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long p2,
33218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long id)
3322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
33238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bool bRet = false;
332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3325f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    /* Just drop messages typically generated by hardware (w/o client request),
3326f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     * if we've reported an error to client. */
3327f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (m_error_propogated) {
3328f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        switch (id) {
3329f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
3330f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
3331f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_ERROR("Dropping message %lx "
3332f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        "since client expected to be in error state", id);
3333f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                return false;
3334f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            default:
3335f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                /* whatever */
3336f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                break;
3337f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
3338f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (id == m_fill_output_msg ||
3343f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            id == OMX_COMPONENT_GENERATE_FBD ||
3344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            id == OMX_COMPONENT_GENERATE_PORT_RECONFIG ||
3345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) {
334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,id);
334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            id == OMX_COMPONENT_GENERATE_EBD ||
3349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY ||
3350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) {
335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,id);
335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cmd_q.insert_entry(p1,p2,id);
335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet = true;
33578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    post_message(this, id);
335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
3363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3365a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen ChavanOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
3366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
336861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!profileLevelType)
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
3370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profileLevelType->nPortIndex == 0) {
337261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
3375a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
3379a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 2) {
338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
3382a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_AVCLevel51;
338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
33848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
33858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)profileLevelType->nProfileIndex);
33868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorNoMore;
33878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
33888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
33898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
33908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh;
33918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                profileLevelType->eLevel   = QOMX_VIDEO_MVCLevel51;
33928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
33938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
33948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (unsigned int)profileLevelType->nProfileIndex);
339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
33978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
3398f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (profileLevelType->nProfileIndex == 0) {
3399f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain;
3400f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
3401bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            } else if (profileLevelType->nProfileIndex == 1) {
3402bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10;
3403bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
3404f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            } else {
34058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
34068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)profileLevelType->nProfileIndex);
34078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorNoMore;
3408f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
341261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
34148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
34158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (unsigned int)profileLevelType->nProfileIndex);
341661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
342061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
342161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
342261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
342361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
34268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
34278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (unsigned int)profileLevelType->nProfileIndex);
342861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
342961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
3431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (profileLevelType->nProfileIndex == 0) {
343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (profileLevelType->nProfileIndex == 1) {
343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
34418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
34428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (unsigned int)profileLevelType->nProfileIndex);
344361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorNoMore;
344461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
344561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
34468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind);
344761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
344861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
344961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
34508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u",
34518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                          (unsigned int)profileLevelType->nPortIndex);
345261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
34536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
345461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
345861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
345961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetParameter
3460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
346161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
346261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Parameter method implementation
3463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
346461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
346561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
346761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
346861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if successful.
3469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
347061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
347261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
347361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     paramData)
3474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
34758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
3476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
34788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter:");
347961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
34808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid State");
3481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
3482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
348361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
34848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
3485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
3486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
348761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
348861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition: {
348916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
349061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
349161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
34928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
3493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               decide_dpb_buffer_mode(is_down_scalar_enabled);
349461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               eRet = update_portdef(portDefn);
349561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               if (eRet == OMX_ErrorNone)
349661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   m_port_def = *portDefn;
349761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               break;
349861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
349961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoInit: {
350016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
350161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              OMX_PORT_PARAM_TYPE *portParamType =
350261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  (OMX_PORT_PARAM_TYPE *) paramData;
35038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
350461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
350561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
350616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                              portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
350761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              portParamType->nPorts           = 2;
350861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              portParamType->nStartPortNumber = 0;
350961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              break;
351061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
351161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat: {
351216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
351361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
351461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
35158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
351661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
351761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
351816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                portFmt->nSize             = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE);
351961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
352061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (0 == portFmt->nPortIndex) {
352161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (0 == portFmt->nIndex) {
352261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
352361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        portFmt->eCompressionFormat = eCompressionFormat;
352461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
352561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
35268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                " NoMore compression formats");
352761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        eRet =  OMX_ErrorNoMore;
352861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
352961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else if (1 == portFmt->nPortIndex) {
353061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
3531f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
3532f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    // Distinguish non-surface mode from normal playback use-case based on
3533f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2"
3534f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    // For non-android, use the default list
3535f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    // Also use default format-list if FLEXIBLE YUV is supported,
3536f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    // as the client negotiates the standard color-format if it needs to
3537f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    bool useNonSurfaceMode = false;
3538f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED)
3539f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE);
3540f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
3541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    if (is_thulium_v1) {
3542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex);
3543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    } else {
3544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        portFmt->eColorFormat = useNonSurfaceMode ?
3545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) :
3546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            getPreferredColorFormatDefaultMode(portFmt->nIndex);
3547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    }
35488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
35498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) {
35508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        eRet = OMX_ErrorNoMore;
355161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
35528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                " NoMore Color formats");
355361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
35548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat);
355561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
35568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
355761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            (int)portFmt->nPortIndex);
355861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    eRet = OMX_ErrorBadPortIndex;
355961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
356061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
356161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
356261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            /*Component should support this port definition*/
356361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamAudioInit: {
356416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
356561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              OMX_PORT_PARAM_TYPE *audioPortParamType =
356661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  (OMX_PORT_PARAM_TYPE *) paramData;
35678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
356861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
356916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                              audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
357061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              audioPortParamType->nPorts           = 0;
357161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              audioPortParamType->nStartPortNumber = 0;
357261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              break;
357361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
357461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          /*Component should support this port definition*/
357561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamImageInit: {
357616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
357761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              OMX_PORT_PARAM_TYPE *imagePortParamType =
357861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  (OMX_PORT_PARAM_TYPE *) paramData;
35798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
358061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
358116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                              imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
358261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              imagePortParamType->nPorts           = 0;
358361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              imagePortParamType->nStartPortNumber = 0;
358461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              break;
358561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
358661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
358761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          /*Component should support this port definition*/
358861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamOtherInit: {
35898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
359061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      paramIndex);
359161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              eRet =OMX_ErrorUnsupportedIndex;
359261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              break;
359361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
359461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole: {
359516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
359661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
359761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
359861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
359961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  comp_role->nSize = sizeof(*comp_role);
360061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
36018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                  DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
360261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          paramIndex);
360361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
360461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          OMX_MAX_STRINGNAME_SIZE);
360561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  break;
360661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              }
360761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              /* Added for parameter test */
360861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt: {
360916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
361061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             OMX_PRIORITYMGMTTYPE *priorityMgmType =
361161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 (OMX_PRIORITYMGMTTYPE *) paramData;
36128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
361361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
361416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                             priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE);
361561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
361661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             break;
361761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         }
361861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         /* Added for parameter test */
361961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier: {
362016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
362161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
362261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
36238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
362461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
362516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                   bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE);
362661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
362761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if (0 == bufferSupplierType->nPortIndex)
362861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
362961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   else if (1 == bufferSupplierType->nPortIndex)
363061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
363161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   else
363261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       eRet = OMX_ErrorBadPortIndex;
363361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
363461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
363561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   break;
363661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               }
363761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc: {
36388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
36398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     paramIndex);
36408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             break;
36418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                         }
36428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
36438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x",
364461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     paramIndex);
364561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             break;
364661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         }
364761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263: {
36488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
364961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      paramIndex);
365061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              break;
365161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
365261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4: {
36538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
365461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       paramIndex);
365561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               break;
365661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
365761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2: {
36588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
365961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       paramIndex);
366061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               break;
366161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
366261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelQuerySupported: {
366316ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                        VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
36648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
366561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
366661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
3667a268cdfcbfaec07af3e3b8df50a4027e55653a8aPraveen Chavan                                        eRet = get_supported_profile_level(profileLevelType);
366861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        break;
366961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
3670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
367161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
367216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                        VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams);
36738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
367461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
367561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
367661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3677f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                            if (secure_mode && !secure_scaling_to_non_secure_opb) {
367861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
367961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                        GRALLOC_USAGE_PRIVATE_UNCACHED);
368061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            } else {
3681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
368261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            }
368361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
36848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
368561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            eRet = OMX_ErrorBadParameter;
368661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
368761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
368861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    break;
3689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3690f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
3691f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef FLEXYUV_SUPPORTED
3692709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        case OMX_QcomIndexFlexibleYUVDescription: {
3693709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan                DEBUG_PRINT_LOW("get_parameter: describeColorFormat");
369416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams);
3695f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                eRet = describeColorFormat(paramData);
3696709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan                break;
3697709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            }
3698f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
3699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_IndexParamVideoProfileLevelCurrent: {
370016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan             VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
3701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
3702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             struct v4l2_control profile_control, level_control;
3703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             switch (drv_ctx.decoder_format) {
3705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 case VDEC_CODECTYPE_H264:
3706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
3707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
3708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     break;
3709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 default:
3710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264");
3711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     eRet = OMX_ErrorNotImplemented;
3712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     break;
3713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             }
3714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) {
3716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) {
3717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
3718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
3719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eProfile = OMX_VIDEO_AVCProfileBaseline;
3720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
3722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eProfile = OMX_VIDEO_AVCProfileMain;
3723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
3725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eProfile = OMX_VIDEO_AVCProfileExtended;
3726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
3728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh;
3729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
3731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh10;
3732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
3734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh422;
3735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
3737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA:
3738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA:
3739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA:
3740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA:
3741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE:
3742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH:
3743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA:
3744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH:
3745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH:
3746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH:
3747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        eRet = OMX_ErrorUnsupportedIndex;
3748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
3750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             } else {
3751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 eRet = OMX_ErrorUnsupportedIndex;
3752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             }
3753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) {
3756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                switch ((enum v4l2_mpeg_video_h264_level)level_control.value) {
3757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
3758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel1;
3759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
3761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel1b;
3762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
3764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel11;
3765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
3767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel12;
3768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
3770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel13;
3771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
3773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel2;
3774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
3776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel21;
3777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
3779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel22;
3780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
3782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel3;
3783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
3785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel31;
3786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
3788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel32;
3789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
3791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel4;
3792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
3794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel41;
3795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
3797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel42;
3798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
3800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel5;
3801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
3803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel51;
3804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_2:
3805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        pParam->eLevel = OMX_VIDEO_AVCLevel52;
3806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
3807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
3808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             } else {
3809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 eRet = OMX_ErrorUnsupportedIndex;
3810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             }
3811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             break;
3813f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
3814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         }
381561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default: {
38168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                 DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
381761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 eRet =OMX_ErrorUnsupportedIndex;
381861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             }
3819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
382061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
3821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
38228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
382361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_width,
382461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.frame_height,
382561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.stride,
382661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.video_resolution.scan_lines);
3827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
382861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
3829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
3832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
3833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
3835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
3836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
3837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
383861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((params == NULL) ||
383961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer == NULL) ||
384061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (params->nativeBuffer->handle == NULL) ||
384161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !m_enable_android_native_buffers)
3842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
3843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_use_android_native_buffers = OMX_TRUE;
3844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
3845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    private_handle_t *handle = (private_handle_t *)nBuf->handle;
384661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
3847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        OMX_U8 *buffer = NULL;
384861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
384961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = (OMX_U8*)mmap(0, handle->size,
3850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
385161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer == MAP_FAILED) {
385261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
385361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
3854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
3855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
3856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
3857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    } else {
3858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadParameter;
3859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
3860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
3861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
38638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
38648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() {
38658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_control control;
38668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct v4l2_format fmt;
38678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
38688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    control.value = 1;
38698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
38708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (rc < 0) {
38718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
38728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorHardware;
38738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
38748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_smoothstreaming_mode = true;
38758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
38768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
38778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
387961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
388061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::Setparameter
3881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
388361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Parameter method implementation.
3884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
388661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
3887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
388861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
388961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
3890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
389161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
3892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
389361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE paramIndex,
389461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        paramData)
3895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
38976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    int ret=0;
38986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    struct v4l2_format fmt;
3899f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef _ANDROID_
3900f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
3901f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
390261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
39038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
3904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
3905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
390661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (paramData == NULL) {
39078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
390861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
390961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
391061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((m_state != OMX_StateLoaded) &&
391161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
391261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_TRUE) &&
391361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
391461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_inp_bEnabled == OMX_TRUE)) {
39158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Set Param in Invalid State");
3916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
3917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
391861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)paramIndex) {
391961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition: {
392016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
392161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
392261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
392361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
392461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               //been called.
39258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
392661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       (int)portDefn->format.video.nFrameHeight,
392761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       (int)portDefn->format.video.nFrameWidth);
3928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3929ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                               if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
3930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d",
3931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                          portDefn->nBufferCountActual);
3932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   eRet = OMX_ErrorBadParameter;
3933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   break;
3934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               }
393561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               if (OMX_DirOutput == portDefn->eDir) {
39368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
3937f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   bool port_format_changed = false;
393861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   m_display_id = portDefn->format.video.pNativeWindow;
393961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   unsigned int buffer_size;
39408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   /* update output port resolution with client supplied dimensions
39418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      in case scaling is enabled, else it follows input resolution set
39428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   */
3943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   decide_dpb_buffer_mode(is_down_scalar_enabled);
39448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   if (is_down_scalar_enabled) {
39458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)",
39468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)portDefn->format.video.nFrameWidth,
39478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)portDefn->format.video.nFrameHeight);
39488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       if (portDefn->format.video.nFrameHeight != 0x0 &&
39498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               portDefn->format.video.nFrameWidth != 0x0) {
3950f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
3951f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3952f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
3953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
3954f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           if (ret) {
3955f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               DEBUG_PRINT_ERROR("Get Resolution failed");
3956f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               eRet = OMX_ErrorHardware;
3957f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               break;
3958f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           }
3959f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) ||
3960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) {
3961f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   port_format_changed = true;
3962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           }
39638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           update_resolution(portDefn->format.video.nFrameWidth,
39648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   portDefn->format.video.nFrameHeight,
39658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   portDefn->format.video.nFrameWidth,
39668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   portDefn->format.video.nFrameHeight);
3967f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
3968f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           /* set crop info */
3969f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           rectangle.nLeft = 0;
3970f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           rectangle.nTop = 0;
3971f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           rectangle.nWidth = portDefn->format.video.nFrameWidth;
3972f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           rectangle.nHeight = portDefn->format.video.nFrameHeight;
3973f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
39748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           eRet = is_video_session_supported();
39758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           if (eRet)
39768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               break;
3977f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
39788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
39798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
39808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
39818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
39828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
39838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width);
39848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
39858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           if (ret) {
39868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               DEBUG_PRINT_ERROR("Set Resolution failed");
39878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               eRet = OMX_ErrorUnsupportedSetting;
39888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           } else
39898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               eRet = get_buffer_req(&drv_ctx.op_buf);
39908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       }
3991f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
3992f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       if (eRet) {
3993f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           break;
3994f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       }
3995f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
3996f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       if (secure_mode) {
3997f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           struct v4l2_control control;
3998f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD;
3999f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
4000f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id);
4001f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               eRet = OMX_ErrorHardware;
4002f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           } else {
4003f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               /* This is a workaround for a bug in fw which uses stride
4004f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                * and slice instead of width and height to check against
4005f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                * the threshold.
4006f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                */
4007f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               OMX_U32 stride, slice;
4008f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
4009f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth);
4010f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight);
4011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
4012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth);
4013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight);
4014f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               } else {
4015f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   stride = portDefn->format.video.nFrameWidth;
4016f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   slice = portDefn->format.video.nFrameHeight;
4017f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               }
4018f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
4019f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice);
4020f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               DEBUG_PRINT_LOW("Threshold value is %d\n", control.value);
4021f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
4022f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               if (stride * slice <= (OMX_U32)control.value) {
4023f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   secure_scaling_to_non_secure_opb = true;
4024f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ");
4025f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2;
4026f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   control.value = 1;
4027f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) {
4028f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                       DEBUG_PRINT_ERROR("Enabling non-secure output2 failed");
4029f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                       eRet = OMX_ErrorUnsupportedSetting;
4030f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   }
4031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               }
4032f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           }
4033f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       }
4034f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   }
4035f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
4036f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   if (eRet) {
4037f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       break;
4038f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   }
4039f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
4040fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
4041fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)",
4042fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
4043fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       eRet = OMX_ErrorBadParameter;
4044fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                   } else if (!client_buffers.get_buffer_req(buffer_size)) {
40458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_ERROR("Error in getting buffer requirements");
404661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       eRet = OMX_ErrorBadParameter;
4047f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   } else if (!port_format_changed) {
4048fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan
4049ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                       // Buffer count can change only when port is unallocated
4050ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                       if (m_out_mem_ptr &&
4051ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount ||
4052ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) {
4053ee06e61ff49357884de5c6714828c263966895eePraveen Chavan
4054fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                           DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !");
4055fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                           eRet = OMX_ErrorInvalidState;
4056fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                           break;
4057fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       }
4058fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan
405961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       if ( portDefn->nBufferCountActual >= drv_ctx.op_buf.mincount &&
406061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               portDefn->nBufferSize >=  drv_ctx.op_buf.buffer_size ) {
406161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.actualcount = portDefn->nBufferCountActual;
406261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.op_buf.buffer_size = portDefn->nBufferSize;
406361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.extradata_info.count = drv_ctx.op_buf.actualcount;
406461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.extradata_info.size = drv_ctx.extradata_info.count *
406561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               drv_ctx.extradata_info.buffer_size;
406661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           eRet = set_buffer_req(&drv_ctx.op_buf);
406761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (eRet == OMX_ErrorNone)
406861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               m_port_def = *portDefn;
406961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       } else {
40708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)",
4071f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size,
40728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
407361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           eRet = OMX_ErrorBadParameter;
407461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       }
407561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
407661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               } else if (OMX_DirInput == portDefn->eDir) {
40778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
407861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   bool port_format_changed = false;
407961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if ((portDefn->format.video.xFramerate >> 16) > 0 &&
408061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
408161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       // Frame rate only should be set if this is a "known value" or to
408261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       // activate ts prediction logic (arbitrary mode only) sending input
408361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       // timestamps with max value (LLONG_MAX).
40848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u",
40858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)portDefn->format.video.xFramerate >> 16);
408661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
408761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               drv_ctx.frame_rate.fps_denominator);
408861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       if (!drv_ctx.frame_rate.fps_numerator) {
408961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
409061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.frame_rate.fps_numerator = 30;
409161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       }
409261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       if (drv_ctx.frame_rate.fps_denominator)
409361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.frame_rate.fps_numerator = (int)
409461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
409561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       drv_ctx.frame_rate.fps_denominator = 1;
409661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
409761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.frame_rate.fps_numerator;
40988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
40998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
410061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               (float)drv_ctx.frame_rate.fps_denominator);
41018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
41028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       struct v4l2_outputparm oparm;
41038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       /*XXX: we're providing timing info as seconds per frame rather than frames
41048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        * per second.*/
41058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
41068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
41078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
41088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       struct v4l2_streamparm sparm;
41098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
41108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       sparm.parm.output = oparm;
41118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
41128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected");
41138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           eRet = OMX_ErrorHardware;
41148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           break;
4115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       }
4116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       m_perf_control.request_cores(frm_int);
41178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   }
41188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
411961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if (drv_ctx.video_resolution.frame_height !=
412061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           portDefn->format.video.nFrameHeight ||
412161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           drv_ctx.video_resolution.frame_width  !=
412261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           portDefn->format.video.nFrameWidth) {
41238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)",
41248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)portDefn->format.video.nFrameWidth,
41258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)portDefn->format.video.nFrameHeight);
412661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       port_format_changed = true;
41278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_U32 frameWidth = portDefn->format.video.nFrameWidth;
41288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       OMX_U32 frameHeight = portDefn->format.video.nFrameHeight;
41298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       if (frameHeight != 0x0 && frameWidth != 0x0) {
41308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           if (m_smoothstreaming_mode &&
41318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   ((frameWidth * frameHeight) <
41328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   (m_smoothstreaming_width * m_smoothstreaming_height))) {
41338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               frameWidth = m_smoothstreaming_width;
41348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               frameHeight = m_smoothstreaming_height;
41358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u "
41368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                       "for adaptive-playback/smooth-streaming",
41378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                       (unsigned int)frameWidth, (unsigned int)frameHeight);
41388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           }
41398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           update_resolution(frameWidth, frameHeight,
41408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                   frameWidth, frameHeight);
414161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           eRet = is_video_session_supported();
414261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (eRet)
414361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               break;
4144f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
414561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
414661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
414761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
414861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           fmt.fmt.pix_mp.pixelformat = output_capability;
41498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen 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);
415061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
415161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (ret) {
41528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               DEBUG_PRINT_ERROR("Set Resolution failed");
415361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               eRet = OMX_ErrorUnsupportedSetting;
4154f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           } else {
4155f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               if (!is_down_scalar_enabled)
4156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                   eRet = get_buffer_req(&drv_ctx.op_buf);
4157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           }
415861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       }
415961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
4160f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   if (m_custom_buffersize.input_buffersize
4161f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) {
4162f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d",
4163f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               m_custom_buffersize.input_buffersize, portDefn->nBufferSize);
4164f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       eRet = OMX_ErrorBadParameter;
4165f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                       break;
4166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                   }
4167fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
4168fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)",
4169fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
4170fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       eRet = OMX_ErrorBadParameter;
4171fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       break;
4172fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                   }
4173ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                   // Buffer count can change only when port is unallocated
4174ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                   if (m_inp_mem_ptr &&
4175ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                            (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount ||
4176ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                            portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) {
4177fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !");
4178fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       eRet = OMX_ErrorInvalidState;
4179fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                       break;
4180fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                                   }
4181fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan
418261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
418361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
418461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       port_format_changed = true;
418561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
418661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
418761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
418861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (~(buffer_prop->alignment - 1));
418961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       eRet = set_buffer_req(buffer_prop);
419061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
419161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if (false == port_format_changed) {
41928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)",
4193f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size,
41948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
419561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       eRet = OMX_ErrorBadParameter;
419661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
419761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               } else if (portDefn->eDir ==  OMX_DirMax) {
419861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
419961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           (int)portDefn->nPortIndex);
420061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   eRet = OMX_ErrorBadPortIndex;
420161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               }
420261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
420361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           break;
420461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat: {
420516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
420661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
420761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
420861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                int ret=0;
420961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                struct v4l2_format fmt;
42108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u",
42118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex);
421261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4213f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                memset(&fmt, 0x0, sizeof(struct v4l2_format));
421461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (1 == portFmt->nPortIndex) {
421561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
421661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
421761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
421861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    enum vdec_output_fromat op_format;
42198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
42208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m ||
42218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
42228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView ||
42238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar ||
4224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
422561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
4226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
4227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
4228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC;
4229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    } else
423061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        eRet = OMX_ErrorBadParameter;
423161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
4233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
4234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC;
4235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    } else {
4236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12;
4237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    }
4238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
423961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet == OMX_ErrorNone) {
424061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        drv_ctx.output_format = op_format;
424161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
424261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (ret) {
42438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_ERROR("Set output format failed");
424461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            eRet = OMX_ErrorUnsupportedSetting;
424561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            /*TODO: How to handle this case */
424661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        } else {
424761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            eRet = get_buffer_req(&drv_ctx.op_buf);
424861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
424961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
425061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (eRet == OMX_ErrorNone) {
425161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
42528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            DEBUG_PRINT_ERROR("Set color format failed");
425361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            eRet = OMX_ErrorBadParameter;
425461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        }
425561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
425661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
425761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
425861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            break;
425961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
426061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPortDefn: {
426116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
426261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
426361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
42648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u",
42658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    (unsigned int)portFmt->nFramePackingFormat);
426661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
426761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            /* Input port */
426861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (portFmt->nPortIndex == 0) {
4269ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                // arbitrary_bytes mode cannot be changed arbitrarily since this controls how:
4270ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                //   - headers are allocated and
4271ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                //   - headers-indices are derived
4272ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                // Avoid changing arbitrary_bytes when the port is already allocated
4273ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                if (m_inp_mem_ptr) {
4274ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                    DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!");
4275ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                    return OMX_ErrorUnsupportedSetting;
4276ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                }
427761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
4278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    if (secure_mode || m_input_pass_buffer_fd) {
427961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        arbitrary_bytes = false;
4280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode");
428161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        eRet = OMX_ErrorUnsupportedSetting;
428261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
428361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        arbitrary_bytes = true;
428461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
428561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else if (portFmt->nFramePackingFormat ==
428661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
428761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    arbitrary_bytes = false;
4288f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef _ANDROID_
4289f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
4290f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    if (atoi(property_value)) {
4291f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command");
4292f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        arbitrary_bytes = true;
4293f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    }
4294f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
429561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
42968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u",
42978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                            (unsigned int)portFmt->nFramePackingFormat);
429861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    eRet = OMX_ErrorUnsupportedSetting;
429961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
430061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
43018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
430261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
430361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
430461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
430561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    m_out_mem_region_smi = OMX_TRUE;
430661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
43078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
430861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        m_use_output_pmem = OMX_TRUE;
430961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
431061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
431161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
431261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
4313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
4314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    OMX_MAX_STRINGNAME_SIZE)) {
4315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            arbitrary_bytes = true;
4316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264");
4317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
431861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
431961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamStandardComponentRole: {
432116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
432261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
432361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
43248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                  DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
432561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          comp_role->cRole);
432661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
432761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  if ((m_state == OMX_StateLoaded)&&
4328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) {
432961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      DEBUG_PRINT_LOW("Set Parameter called in valid state");
433061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  } else {
43318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
433261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      return OMX_ErrorIncorrectStateOperation;
433361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  }
433461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
4336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
4337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE);
433861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
43398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
43408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          eRet =OMX_ErrorUnsupportedSetting;
43418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      }
43428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
43438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
43448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
43458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      } else {
43468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
4347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          eRet = OMX_ErrorUnsupportedSetting;
434861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
4349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
4350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
4351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE);
435261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
43538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
435461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          eRet = OMX_ErrorUnsupportedSetting;
435561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
4356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
4357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
4358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE);
435961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
43608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
436161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          eRet =OMX_ErrorUnsupportedSetting;
436261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
4363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
4364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
4365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE);
436661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
43678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
436861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          eRet = OMX_ErrorUnsupportedSetting;
436961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
4370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) ||
43718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) ||
43728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE))
437361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        ) {
4374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) {
4375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE);
437661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
43778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
437861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          eRet =OMX_ErrorUnsupportedSetting;
437961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
4380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) ||
4381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE))
438261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        ) {
4383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
4384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE);
438561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
43868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
438761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          eRet =OMX_ErrorUnsupportedSetting;
438861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
4389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
4390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
4391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
4392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE);
4393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      } else {
4394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
4395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          eRet = OMX_ErrorUnsupportedSetting;
4396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      }
4397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
4398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) ||
4399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
4400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE);
440161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      } else {
44028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
440361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          eRet = OMX_ErrorUnsupportedSetting;
440461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
44058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
44068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
44078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
4408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      } else {
44098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
44108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                          eRet = OMX_ErrorUnsupportedSetting;
44118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      }
44128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                  } else {
44138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
441461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      eRet = OMX_ErrorInvalidComponentName;
441561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  }
441661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  break;
441761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              }
441861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
441961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPriorityMgmt: {
442016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
442161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             if (m_state != OMX_StateLoaded) {
44228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
442361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 return OMX_ErrorIncorrectStateOperation;
442461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             }
442561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
44268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
44278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     (unsigned int)priorityMgmtype->nGroupID);
442861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
44308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     (unsigned int)priorityMgmtype->nGroupPriority);
443161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
443261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
443361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
443461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
443561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             break;
443661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         }
443761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
443861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamCompBufferSupplier: {
443916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
444061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
44418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
444261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           bufferSupplierType->eBufferSupplier);
444361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
444461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
444561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
444661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   else
444761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
444861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       eRet = OMX_ErrorBadPortIndex;
444961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
445061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   break;
445161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
445261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               }
445361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc: {
44548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
44558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     paramIndex);
44568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             break;
44578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                         }
44588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
44598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d",
446061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     paramIndex);
446161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             break;
4462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
446361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263: {
44648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
446561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      paramIndex);
446661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              break;
446761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
446861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4: {
44698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
447061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       paramIndex);
447161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               break;
447261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
447361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg2: {
44748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
447561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       paramIndex);
447661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               break;
447761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
447861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDecoderPictureOrder: {
447916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                     VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER);
448061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
448161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
448261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     struct v4l2_control control;
448361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     int pic_order,rc=0;
44848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                     DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
448561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                             pictureOrder->eOutputPictureOrder);
448661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
448761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
448861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
448961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
449061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         time_stamp_dts.set_timestamp_reorder_mode(false);
449161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     } else
449261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         eRet = OMX_ErrorBadParameter;
449361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     if (eRet == OMX_ErrorNone) {
449461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
449561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         control.value = pic_order;
449661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
449761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         if (rc) {
44988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                             DEBUG_PRINT_ERROR("Set picture order failed");
449961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                             eRet = OMX_ErrorUnsupportedSetting;
450061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         }
450161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     }
45027ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan                                     m_decode_order_mode =
45037ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan                                            pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER;
450461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     break;
450561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 }
450661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamConcealMBMapExtraData:
450716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
4509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
4510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               break;
45118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamFrameInfoExtraData:
451216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
4514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
4515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               break;
45168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_ExtraDataFrameDimension:
451716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
45188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false,
45198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
45208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               break;
452161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamInterlaceExtraData:
452216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
4524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
452561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               break;
452661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamH264TimeInfo:
452716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
4529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
45308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               break;
45318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamVideoFramePackingExtradata:
453216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
45338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
45348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
45358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               break;
45368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamVideoQPExtraData:
453716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
45388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               eRet = enable_extradata(OMX_QP_EXTRADATA, false,
45398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
45408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               break;
45418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamVideoInputBitsInfoExtraData:
454216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
45438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
45448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
45458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               break;
45468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexEnableExtnUserData:
454716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
45488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
45498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
4550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                break;
4551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QTIIndexParamVQZipSEIExtraData:
455216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
4554f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
4555f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                break;
455661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoDivx: {
455761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
455861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          }
455961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          break;
456061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexPlatformPvt: {
456116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN);
45628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
456361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
456461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
456561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
456661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   eRet = OMX_ErrorUnsupportedSetting;
456761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               } else {
456861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   m_out_pvt_entry_pmem = OMX_TRUE;
456961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
45708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
457161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       m_use_output_pmem = OMX_TRUE;
457261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
457361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               }
457461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
457561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           }
457661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                           break;
457761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
457861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
457961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
458061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       struct v4l2_control control;
458161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       int rc;
458261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       drv_ctx.idr_only_decoding = 1;
458361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
458461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
458561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
458661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       if (rc) {
45878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                           DEBUG_PRINT_ERROR("Set picture order failed");
458861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           eRet = OMX_ErrorUnsupportedSetting;
458961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       } else {
459061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
459161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
459261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
459361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (rc) {
45948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               DEBUG_PRINT_ERROR("Sync frame setting failed");
459561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               eRet = OMX_ErrorUnsupportedSetting;
459661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           }
459761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           /*Setting sync frame decoding on driver might change buffer
459861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            * requirements so update them here*/
459961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (get_buffer_req(&drv_ctx.ip_buf)) {
46008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements");
460161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               eRet = OMX_ErrorUnsupportedSetting;
460261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           }
460361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (get_buffer_req(&drv_ctx.op_buf)) {
46048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
460561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               eRet = OMX_ErrorUnsupportedSetting;
460661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           }
460761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       }
460861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
460961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   break;
461061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
461161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamIndexExtraDataType: {
461216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                    VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
4613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
4614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
4615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            (extradataIndexType->bEnabled == OMX_TRUE) &&
4616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            (extradataIndexType->nPortIndex == 1)) {
46178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
4618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
461961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    }
4621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                }
4622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                break;
462361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableSmoothStreaming: {
462461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef SMOOTH_STREAMING_DISABLED
46258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      eRet = enable_smoothstreaming();
462661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#else
462761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      eRet = OMX_ErrorUnsupportedSetting;
462861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
462961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  }
463061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  break;
4631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
463261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  /* Need to allow following two set_parameters even in Idle
463361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   * state. This is ANDROID architecture which is not in sync
463461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   * with openmax standard. */
463561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
463616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                           VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams);
463761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
4638ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                           if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
4639ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!");
4640ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                eRet = OMX_ErrorUnsupportedSetting;
4641ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                break;
4642ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                           } else if (m_out_mem_ptr) {
4643ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !");
4644ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                eRet = OMX_ErrorInvalidState;
4645ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                                break;
4646ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                                           }
464761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (enableNativeBuffers) {
464861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               m_enable_android_native_buffers = enableNativeBuffers->enable;
464961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           }
4650f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#if !defined(FLEXYUV_SUPPORTED)
4651f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           if (m_enable_android_native_buffers) {
4652f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               // Use the most-preferred-native-color-format as surface-mode is hinted here
4653f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) {
4654f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   DEBUG_PRINT_ERROR("Failed to set native color format!");
4655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                                   eRet = OMX_ErrorUnsupportedSetting;
4656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                               }
4657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                           }
4658f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
465961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       }
466061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       break;
466161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
466216ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                       VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams);
466361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       eRet = use_android_native_buffer(hComp, paramData);
466461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
466561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   break;
46664173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan        case OMX_GoogleAndroidIndexAllocateNativeHandle: {
4667e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick
46684173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData;
4669e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams);
4670e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick
4671e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
4672e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!");
4673e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                    eRet = OMX_ErrorUnsupportedSetting;
4674e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                    break;
4675e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                } else if (m_inp_mem_ptr) {
4676e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !");
4677e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                    eRet = OMX_ErrorInvalidState;
4678e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                    break;
4679e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick                }
4680e6587c9dca65ca18161b74dfe87ef64fc9c22a1eRay Essick
46814173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                if (allocateNativeHandleParams != NULL) {
46824173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                    allocate_native_handle = allocateNativeHandleParams->enable;
46834173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                }
46844173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            }
46854173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            break;
4686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
468761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamEnableTimeStampReorder: {
468816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                       VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER);
468961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
469061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
469161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (reorder->bEnable == OMX_TRUE) {
469261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               frm_int =0;
469361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               time_stamp_dts.set_timestamp_reorder_mode(true);
469461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           } else
469561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               time_stamp_dts.set_timestamp_reorder_mode(false);
469661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       } else {
469761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           time_stamp_dts.set_timestamp_reorder_mode(false);
469861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           if (reorder->bEnable == OMX_TRUE) {
469961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                               eRet = OMX_ErrorUnsupportedSetting;
470061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                           }
470161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                       }
470261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   }
470361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                   break;
470461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelCurrent: {
470516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                     VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
470661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
470761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
470861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     if (pParam) {
470961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         m_profile_lvl.eProfile = pParam->eProfile;
471061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         m_profile_lvl.eLevel = pParam->eLevel;
471161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     }
471261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     break;
471361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
471461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 }
471524bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon        case OMX_QcomIndexParamVideoMetaBufferMode:
471624bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon        {
471716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
471824bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon            StoreMetaDataInBuffersParams *metabuffer =
471924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                (StoreMetaDataInBuffersParams *)paramData;
472024bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon            if (!metabuffer) {
472124bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer);
472224bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                eRet = OMX_ErrorBadParameter;
472324bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                break;
472424bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon            }
47258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (m_disable_dynamic_buf_mode) {
4726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled");
47278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorUnsupportedSetting;
47288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
47298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
47308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
4731ee06e61ff49357884de5c6714828c263966895eePraveen Chavan
4732ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                    if (m_out_mem_ptr) {
4733ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                        DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !");
4734ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                        eRet = OMX_ErrorInvalidState;
4735ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                        break;
4736ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                    }
473724bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    //set property dynamic buffer mode to driver.
473824bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    struct v4l2_control control;
473924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    struct v4l2_format fmt;
474024bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT;
47418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (metabuffer->bStoreMetaData == true) {
4742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC;
47438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    } else {
47448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        control.value = V4L2_MPEG_VIDC_VIDEO_STATIC;
47458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
474624bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
47478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (!rc) {
47488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("%s buffer mode",
47498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
4750073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava                    } else {
47518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to %s buffer mode",
47528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic");
475324bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    }
4754c8e6a3cc21c2fa657b143f4e06734eebab7e00b8Santhosh Behara                    dynamic_buf_mode = metabuffer->bStoreMetaData;
475524bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                } else {
47568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR(
47578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                       "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u",
47588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                       (unsigned int)metabuffer->nPortIndex);
475924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                    eRet = OMX_ErrorUnsupportedSetting;
476024bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                }
476124bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon                break;
476224bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon        }
47638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamVideoDownScalar:
47648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
476516ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR);
47668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData;
47678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct v4l2_control control;
47688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            int rc;
4769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable);
4770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (pParam && pParam->bEnable) {
4772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                rc = enable_downscalar();
4773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (rc < 0) {
4774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
4775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    return OMX_ErrorUnsupportedSetting;
47768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
4777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_force_down_scalar = pParam->bEnable;
4778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else {
4779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                rc = disable_downscalar();
4780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (rc < 0) {
4781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
4782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    return OMX_ErrorUnsupportedSetting;
4783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
4784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_force_down_scalar = pParam->bEnable;
47858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
47868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
47878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
47888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
47898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
47908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        {
479116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams);
47928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback");
47938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            PrepareForAdaptivePlaybackParams* pParams =
47948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (PrepareForAdaptivePlaybackParams *) paramData;
47958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
47968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (!pParams->bEnable) {
47978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorNone;
47988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
47998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth
48008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) {
48018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR(
48028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]",
48038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight,
48048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                             (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight);
48058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    eRet = OMX_ErrorBadParameter;
48068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
4807f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight);
4808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
48098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
48108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR(
48118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        "Prepare for adaptive playback supported only on output port");
48128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                eRet = OMX_ErrorBadParameter;
48138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
48148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            break;
48158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
48168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
4817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QTIIndexParamVideoPreferAdaptivePlayback:
4818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
481916ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback");
4821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable;
4822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_disable_dynamic_buf_mode) {
4823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set");
4824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
4826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
48278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
4828f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        case OMX_QcomIndexParamVideoCustomBufferSize:
4829f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        {
483016ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE);
4831f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize");
4832f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData;
4833f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
4834f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                struct v4l2_control control;
4835f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT;
4836f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                control.value = pParam->nBufferSize;
4837f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
4838f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_ERROR("Failed to set input buffer size");
4839f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    eRet = OMX_ErrorUnsupportedSetting;
4840f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                } else {
4841f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    eRet = get_buffer_req(&drv_ctx.ip_buf);
4842f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    if (eRet == OMX_ErrorNone) {
4843f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size;
4844f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d",
4845f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            m_custom_buffersize.input_buffersize);
4846f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    } else {
4847f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        DEBUG_PRINT_ERROR("Failed to get buffer requirement");
4848f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    }
4849f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
4850f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            } else {
4851f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port");
4852f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                eRet = OMX_ErrorBadParameter;
4853f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
4854f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            break;
4855f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
4856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QTIIndexParamVQZIPSEIType:
4857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
485816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE);
4859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType");
4860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam =
4861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData;
4862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable);
4863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
4864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                ((QOMX_ENABLETYPE *)paramData)->bEnable);
4865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (eRet != OMX_ErrorNone) {
4866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata");
4867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorBadParameter;
4868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
4869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else {
4870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = enable_extradata(OMX_QP_EXTRADATA, false,
4871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
4872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (eRet != OMX_ErrorNone) {
4873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata");
4874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    eRet = OMX_ErrorBadParameter;
4875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
4876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    client_extradata = client_extradata & ~OMX_QP_EXTRADATA;
4877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
4878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
4880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QTIIndexParamPassInputBufferFd:
4883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
488416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
4885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (arbitrary_bytes) {
4886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode");
4887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorUnsupportedSetting;
4888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable;
4892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_input_pass_buffer_fd)
4893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_LOW("Enable passing input buffer FD");
4894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
4895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QTIIndexParamForceCompressedForDPB:
4897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
489816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE);
4899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB");
4900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam =
4901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData;
4902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_disable_ubwc_mode) {
4903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled");
4904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorUnsupportedSetting;
4905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (!paramData) {
4908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL");
4909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               eRet = OMX_ErrorBadParameter;
4910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               break;
4911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_force_compressed_for_dpb = pParam->bEnable;
4914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
4915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QTIIndexParamForceUnCompressedForOPB:
4917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
491816ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE);
4919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB");
4920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam =
4921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData;
4922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (!paramData) {
4923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL");
4924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorBadParameter;
4925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_disable_ubwc_mode = pParam->bEnable;
4928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled");
4929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
4930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
493361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default: {
49348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                 DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
493561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 eRet = OMX_ErrorUnsupportedIndex;
493661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             }
4937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
49388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (eRet != OMX_ErrorNone)
49398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex);
494061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
4942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
494461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
494561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetConfig
4946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
494761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
494861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Get Config Method implementation.
4949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
495061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
495161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
4952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
495361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
495461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
4955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
495661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
4957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
495861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
495961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_PTR     configData)
4960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
49618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
496261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
4963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
496461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
49658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
496661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
496761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
4968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
496961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch ((unsigned long)configIndex) {
497061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigInterlaced: {
497116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE);
497261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
497361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
497461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                if (configFmt->nPortIndex == 1) {
497561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    if (configFmt->nIndex == 0) {
497661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
497761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else if (configFmt->nIndex == 1) {
497861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        configFmt->eInterlaceType =
497961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
498061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else if (configFmt->nIndex == 2) {
498161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        configFmt->eInterlaceType =
498261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
498361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    } else {
498461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
49858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                " NoMore Interlaced formats");
498661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                        eRet = OMX_ErrorNoMore;
498761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    }
498861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
498961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                } else {
49908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
499161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                            (int)configFmt->nPortIndex);
499261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    eRet = OMX_ErrorBadPortIndex;
499361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                }
499461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                break;
499561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
499661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
499716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                     VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES);
499861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
499961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                         (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
500061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     decoderinstances->nNumOfInstances = 16;
500161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     /*TODO: How to handle this case */
500261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                     break;
500361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 }
500461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexConfigVideoFramePackingArrangement: {
500561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
500616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                              VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
500761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                              OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
500861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                                  (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
50098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                              memcpy(configFmt, &m_frame_pack_arrangement,
50108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                                  sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
501161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          } else {
501261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                              DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
501361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          }
501461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          break;
501561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      }
501661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonOutputCrop: {
501716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                                  VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE);
501861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
501961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                  memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
5020f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                  DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u",
5021f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        rectangle.nLeft, rectangle.nTop,
5022f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                        rectangle.nWidth, rectangle.nHeight);
5023f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                  break;
5024f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                              }
5025f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        case OMX_QcomIndexConfigPerfLevel: {
502616ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL);
5027f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                struct v4l2_control control;
5028f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
5029f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
5030f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5031f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
5032f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
5033f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno);
5034f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    eRet = OMX_ErrorHardware;
5035f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
5036f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5037f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (eRet == OMX_ErrorNone) {
5038f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    switch (control.value) {
5039f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO:
5040f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo;
5041f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            break;
5042f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        default:
5043f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value);
5044f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            /* Fall through */
5045f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL:
5046f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            perf->ePerfLevel = OMX_QCOM_PerfLevelNominal;
5047f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            break;
5048f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    }
5049f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
5050f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
5052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexConfigH264EntropyCodingCabac: {
505416ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan            VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE);
5055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData;
5056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            struct v4l2_control control;
5057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) {
5059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264");
5060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorNotImplemented;
5061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
5062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
5065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) {
5066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                coding->bCabac = (OMX_BOOL)
5067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC);
5068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                /* We can't query driver at the moment for the cabac mode, so
5069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 * just use 0xff...f as a place holder for future improvement */
5070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                coding->nCabacInitIdc = ~0;
5071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            } else {
5072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                eRet = OMX_ErrorUnsupportedIndex;
5073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5077ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case OMX_QTIIndexConfigDescribeColorAspects:
5078ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        {
5079c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5080ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5081c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
5082c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client");
5083c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal");
5084c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
5085c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            if (params->bRequestingDataSpace) {
5086c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                DEBUG_PRINT_ERROR("Does not handle dataspace request");
5087c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                return OMX_ErrorUnsupportedSetting;
5088c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            }
5089c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) {
5090c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                DEBUG_PRINT_LOW("Updating Client's color aspects with internal");
5091c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                memcpy(&(m_client_color_space.sAspects),
5092c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                        &(m_internal_color_space.sAspects), sizeof(ColorAspects));
5093c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                m_internal_color_space.bDataSpaceChanged = OMX_FALSE;
5094c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            }
5095c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects));
5096c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
5097ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
5098ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        }
50997ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        case OMX_IndexConfigAndroidVendorExtension:
51007ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        {
51017ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan            VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE);
51027ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan
51037ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan            OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext =
51047ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan                reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData);
51057ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan            VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext);
51067ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan            return get_vendor_extension_config(ext);
51077ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        }
51087ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        default:
51097ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        {
51107ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan            DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
51117ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan            eRet = OMX_ErrorBadParameter;
51127ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        }
5113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
511661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
512061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
512161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetConfig
5122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
512361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
512461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Set Config method implementation
5125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
512661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
512761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
512961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
513061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if successful.
513161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
513361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_INDEXTYPE configIndex,
513461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR        configData)
5135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
51368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
513761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
51388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Config in Invalid State");
513961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
5140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
514161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
514261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
514361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_VIDEO_CONFIG_NALSIZE *pNal;
514461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
51458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Set Config Called");
514661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5147ff8f9f29b46df8de6dba9bda31eab4beb67146b8Praveen Chavan    if (configIndex == OMX_IndexConfigVideoNalSize) {
514861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control temp;
514961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
515061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
515116ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan        VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE);
515261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
515361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (pNal->nNaluBytes) {
515461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case 0:
515561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
515661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
515761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case 2:
515861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
515961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
516061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case 4:
516161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
516261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
516361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
516461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorUnsupportedSetting;
5165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
516661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
516761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!arbitrary_bytes) {
516861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* In arbitrary bytes mode, the assembler strips out nal size and replaces
516961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             * with start code, so only need to notify driver in frame by frame mode */
517061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
517161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
517261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorHardware;
517361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
517461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
517561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
517661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_length = pNal->nNaluBytes;
517761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.init_nal_length(nal_length);
517861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
51798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
518061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
51818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) {
518261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
51838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps);
518461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
518561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
518661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (config->bEnabled) {
518761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ((config->nFps >> 16) > 0) {
51888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u",
51898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (unsigned int)config->nFps >> 16);
519061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
519161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_denominator);
519261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
519361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!drv_ctx.frame_rate.fps_numerator) {
519461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
519561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_numerator = 30;
519661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
519761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
519861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.frame_rate.fps_denominator) {
519961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_numerator = (int)
520061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
520161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
520261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
520361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.frame_rate.fps_denominator = 1;
520461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
520561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.frame_rate.fps_numerator;
520661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
520761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct v4l2_outputparm oparm;
520861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*XXX: we're providing timing info as seconds per frame rather than frames
520961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     * per second.*/
521061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
521161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
521261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
521361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct v4l2_streamparm sparm;
521461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
521561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sparm.parm.output = oparm;
521661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
521761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
521861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                performance might be affected");
521961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ret = OMX_ErrorHardware;
522061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
522161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    client_set_fps = true;
522261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
522361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Frame rate not supported.");
522461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ret = OMX_ErrorUnsupportedSetting;
522561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
522661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
522761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
522861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                client_set_fps = false;
522961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
523061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
523161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
523261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (int)config->nPortIndex);
523361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret = OMX_ErrorBadPortIndex;
5234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
523561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
523661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ret;
5237f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) {
5238f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
5239f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
5240f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        struct v4l2_control control;
5241f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5242f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel);
5243f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5244f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
5245f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5246f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        switch (perf->ePerfLevel) {
5247f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            case OMX_QCOM_PerfLevelNominal:
5248f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
5249f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                break;
5250f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            case OMX_QCOM_PerfLevelTurbo:
5251f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
5252f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                break;
5253f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            default:
5254f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                ret = OMX_ErrorUnsupportedSetting;
5255f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                break;
5256f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
5257f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5258f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (ret == OMX_ErrorNone) {
5259f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
5260f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
5261f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
5262f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5263f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        return ret;
5264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) {
5265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config =
5266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData;
5267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct v4l2_control control;
5268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType);
5269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE;
5270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (config->eDecodeType) {
5272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case OMX_QCOM_PictypeDecode_I:
5273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON;
5274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
5275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case OMX_QCOM_PictypeDecode_IPB:
5276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            default:
5277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF;
5278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
5279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
5282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
5283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (ret)
5284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("Failed to set picture type decode");
5285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return ret;
5287eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan    } else if ((int)configIndex == (int)OMX_IndexConfigPriority) {
5288eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData;
5289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32);
5290eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan
5291eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        struct v4l2_control control;
5292eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan
5293eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY;
5294eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        if (priority->nU32 == 0)
5295eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE;
5296eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        else
5297eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE;
5298eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan
5299eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
5300eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan            DEBUG_PRINT_ERROR("Failed to set Priority");
5301eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan            ret = OMX_ErrorUnsupportedSetting;
5302eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        }
5303eb0227e4c228b54e9b56d3753054a8b3cc8f49aePraveen Chavan        return ret;
5304dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan    } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) {
5305dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData;
5306dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16);
5307dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan
5308dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        struct v4l2_control control;
5309dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan
5310dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE;
5311dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        control.value = rate->nU32;
5312dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan
5313dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
5314dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan            ret = errno == -EBUSY ? OMX_ErrorInsufficientResources :
5315dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan                    OMX_ErrorUnsupportedSetting;
5316dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan            DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)",
5317dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan                    rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno));
5318dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        }
5319dce0acfcb3cdf6eceef84f22def392cc6d4557abPraveen Chavan        return ret;
5320ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
5321ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) {
5322ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5323ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5324c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) {
5325c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true);
5326c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        }
5327ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
5328c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        print_debug_color_aspects(&(params->sAspects), "Set Config");
5329ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams));
5330ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        return ret;
53317ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan    } else if ((int)configIndex == (int)OMX_IndexConfigAndroidVendorExtension) {
53327ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE);
53337ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan
53347ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext =
53357ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan                reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData);
53367ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext);
53377ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan
53387ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan        return set_vendor_extension_config(ext);
5339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
534161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
5342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5344c9770704a9bb7c26205cf0e5bca05d4397aab1c3Praveen Chavan#define extn_equals(param, extn) (!strcmp(param, extn))
53458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
5346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
534761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
534861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetExtensionIndex
5349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
535161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX GetExtensionIndex method implementaion.  <TBD>
5352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
535461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
535761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
535961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
536161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_STRING      paramName,
536261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_INDEXTYPE* indexType)
5363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
53648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
536561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
53668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
5367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
53688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) {
5369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
53708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) {
5371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
53728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) {
53738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata;
53748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) {
53758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement;
53768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) {
53778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData;
53788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) {
53798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData;
53808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) {
53818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData;
5382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
53848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) {
5385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
53868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) {
5387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
53888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) {
53898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
5390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
53918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) {
5392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
53934173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan    } else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) {
53944173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle;
5395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
53978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) {
539824bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode;
539924bee822a91320d24cb33e0c799870adcf9d1ca2Arun Menon    }
5400f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
54018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) {
54028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
5403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) {
5404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback;
54058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
54068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
5407f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef FLEXYUV_SUPPORTED
5408709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) {
5409709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription;
5410709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    }
5411f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
5412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) {
5413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd;
5414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) {
5415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB;
5416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) {
5417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB;
5418ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) {
5419ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects;
5420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else {
54218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
5422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorNotImplemented;
5423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
5425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
542861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
542961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::GetState
5430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
543161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
543261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns the state information back to the caller.<TBD>
5433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
543461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
543561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
543761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
543861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Error None if everything is successful.
543961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
544161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_STATETYPE* state)
5442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
54438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
544461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *state = m_state;
54458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
544661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
545061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
545161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentTunnelRequest
5452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
545361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
545461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Tunnel Request method implementation. <TBD>
5455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
545661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
545761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
545961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
546061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
5461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
546261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
54638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE  hComp,
546461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
546561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        peerComponent,
546661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                    peerPort,
546761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
5468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
54698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
54708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) port;
54718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) peerComponent;
54728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) peerPort;
54738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) tunnelSetup;
54748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
547561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
5476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
547961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
548061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseOutputBuffer
5481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
548361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for Use buffer in the input pin
5484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
548661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
5487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
548961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
5490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
549161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
54926eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_extradata()
54936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
54946eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
549561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.buffer_size) {
549661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
549761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
549861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
549961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
550061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
550161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
550261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
550361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size, 4096,
550461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.ion_alloc_data,
550561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
550661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
55078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
550861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
550961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
551061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
551161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.size,
551261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED,
551361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
551461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
55158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory");
551661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
551761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.extradata_info.ion);
551861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
551961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
552061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
55216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
55228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_other_extradata) {
55238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size);
55248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_other_extradata) {
55258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc memory\n");
55268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorInsufficientResources;
55278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
55288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
552961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
55306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
55316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
553261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_extradata()
553361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
55346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
553561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.extradata_info.uaddr) {
553661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
553761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
553861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&drv_ctx.extradata_info.ion);
553961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
554061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
55416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
55428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_other_extradata) {
55438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        free(m_other_extradata);
55448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_other_extradata = NULL;
55458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
55466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
55476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
55486eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE  omx_vdec::use_output_buffer(
554961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
555061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
555161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
555261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
555361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
555461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
5555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
555661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
555761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
555861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
555961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
556061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PTR privateAppData = NULL;
556161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    private_handle_t *handle = NULL;
556261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buff = buffer;
556361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
556461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
556561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
55668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
55678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) port;
55686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
556961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
557061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
557161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_output_headers();
557261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
557361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
557461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
557561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
557661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
557761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
557861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
557961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
558061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5581dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
558261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
55836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
558461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i >= drv_ctx.op_buf.actualcount) {
55858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
558661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
558761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
558861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5589f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (eRet != OMX_ErrorNone)
5590f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan       return eRet;
5591f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5592576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    if (dynamic_buf_mode) {
5593576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        *bufferHdr = (m_out_mem_ptr + i );
5594576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        (*bufferHdr)->pBuffer = NULL;
5595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) {
5596576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            enum v4l2_buf_type buf_type;
5597576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            int rr = 0;
5598576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
5599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) {
5600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr);
5601576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                return OMX_ErrorInsufficientResources;
5602576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            } else {
5603576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                streaming[CAPTURE_PORT] = true;
56048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
5605576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            }
5606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("Enabling Turbo mode");
5608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            request_perf_level(VIDC_TURBO);
5609576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        }
5610576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        BITMASK_SET(&m_out_bm_count,i);
5611576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        (*bufferHdr)->pAppPrivate = appData;
5612576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        (*bufferHdr)->pBuffer = buffer;
5613576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
5614576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        return eRet;
5615576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    }
5616576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
561761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
561861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
561961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
562061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_use_android_native_buffers) {
562161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
562261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
562361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)nBuf->handle;
562461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = params->pAppPrivate;
562561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
562661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                handle = (private_handle_t *)buff;
562761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
562861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5629f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (!handle) {
5630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_ERROR("handle is invalid");
5631f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                return OMX_ErrorBadParameter;
5632f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
563361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
563461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
5635f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (secure_mode && secure_scaling_to_non_secure_opb) {
5636f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it",
5637f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
5638f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                } else {
5639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
5640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            " expected %u, got %u",
5641f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
5642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    return OMX_ErrorBadParameter;
5643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
5644f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
5645f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
5646f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            drv_ctx.op_buf.buffer_size = handle->size;
564761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
564861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_use_android_native_buffers) {
564961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
565061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buff =  (OMX_U8*)mmap(0, handle->size,
565161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
565261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (buff == MAP_FAILED) {
565361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
565461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
565561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
56566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                }
56576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            }
56586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#if defined(_ANDROID_ICS_)
565961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].nativehandle = handle;
566061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            native_buffer[i].privatehandle = handle;
56616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
566261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!handle) {
566361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
566461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
566561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
566661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
566761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].offset = 0;
566861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
5669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
567061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
567161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
5672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
567461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!ouput_egl_buffers && !m_use_output_pmem) {
5675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
567661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
567761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
567861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
5679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        &drv_ctx.op_buf_ion_info[i].fd_ion_data,
5680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0);
568161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
56828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
568361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
568461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
568561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
568661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
5687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
568861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
568961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                      open (MEM_DEVICE,O_RDWR);
5690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
56928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
569361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
569461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
5695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
569661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
569761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
569861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
569961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                          open (MEM_DEVICE,O_RDWR);
570061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
57018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
570261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
570361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
570461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
5705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
570661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
570761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.buffer_size,
570861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.op_buf.alignment)) {
57098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
571061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
571161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
571261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
5713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
571461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
571561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
571661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
571761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                PROT_READ|PROT_WRITE, MAP_SHARED,
571861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
571961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
572061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
5721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
572261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
5723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
57248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
572561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorInsufficientResources;
572661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
572761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
572861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = 0;
572961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
573061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
573161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
573261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
573361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!appData || !bytes ) {
573461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!secure_mode && !buffer) {
57358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
573661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
573761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
573861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
573961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
574061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
574161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
574261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
5743f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry ||
574461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !pmem_list->nEntries ||
574561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
57468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
574761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
574861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
574961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
575061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_list->entryList->entry;
575161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
575261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pmem_info->pmem_fd);
575361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
575461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
575561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
575661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].mmaped_size =
575761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
575861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                privateAppData = appData;
5759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
576061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
576161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
57628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
57638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
57648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
576561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
576661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_out_mem_ptr + i );
576761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
576861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
576961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
577061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
577161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
577261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
57738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
577461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr,
577561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd );
577661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
577761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
577861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
577961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
578061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = drv_ctx.op_buf.buffer_size;
578161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
578261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
578361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
578461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
578561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = 0;
578661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
578761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
578861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
578961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
579061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
579161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
579261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
579361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
579461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
579561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
57968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
579761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
579861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
579961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
580061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = drv_ctx.num_planes;
580161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
580261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
58038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
580461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
580561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
5806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
580861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
580961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enum v4l2_buf_type buf_type;
581061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
581161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
581261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
581361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
581461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = true;
58158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("STREAMON Successful");
581661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
5817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_HIGH("Enabling Turbo mode");
5819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            request_perf_level(VIDC_TURBO);
5820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
5821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
582361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_enable_android_native_buffers) {
582461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
582561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
582661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
582761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = buff;
5828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
582961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (*bufferHdr)->pAppPrivate = privateAppData;
583061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_out_bm_count,i);
583161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
583261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
583661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
583761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::use_input_heap_buffers
5838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
583961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
584061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer Heap allocation method implementation.
5841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
584261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
584361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
584561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
584661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
5847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
584861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
585061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
585161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
585261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
585361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
585461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
585561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
5856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
58578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
585861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
58597b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
58607b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (secure_mode) {
58617b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode");
58627b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        return OMX_ErrorUndefined;
58637b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    }
58647b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
586561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr)
586661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
586761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
586861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
586961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_phdr_pmem_ptr)
587061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
587161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
587261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.actualcount);
587361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
587461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficent memory");
587561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
587661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
587761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input_use_buffer = true;
587861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
587961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
588061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
588161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
588261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
588361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
588461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
588561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
58868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
58878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt],
588861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
58898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
589061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
589161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
589261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_in_alloc_cnt++;
589361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
589461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
589561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
589661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
589761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
5898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
590161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
590261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseBuffer
5903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
590461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
590561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use Buffer method implementation.
5906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
590761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
590861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
5909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
591061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
591161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None , if everything successful.
5912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
591361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
5914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::use_buffer(
591561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
591661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
591761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
591861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
591961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes,
592061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U8*                   buffer)
5921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
592261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE error = OMX_ErrorNone;
592361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
592461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5925f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) {
59268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer);
592761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
5928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
592961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
59308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
593161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
5932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
5933ee06e61ff49357884de5c6714828c263966895eePraveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
5934ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
5935ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        // ensure that use-buffer was called for previous allocation.
5936ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        // Mix-and-match of useBuffer and allocateBuffer is not allowed
5937ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        if (m_inp_mem_ptr && !input_use_buffer) {
5938ee06e61ff49357884de5c6714828c263966895eePraveen Chavan            DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !");
5939ee06e61ff49357884de5c6714828c263966895eePraveen Chavan            return OMX_ErrorUndefined;
5940ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        }
594161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
5942ee06e61ff49357884de5c6714828c263966895eePraveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
594361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
594461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
59458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
594661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error = OMX_ErrorBadPortIndex;
594761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
59488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error);
594961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error == OMX_ErrorNone) {
595061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
595161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Send the callback now
595261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
595361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandStateSet,OMX_StateIdle,
595461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
595561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
595661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
595761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
595861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
595961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
596061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
596161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
596261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
596361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
596461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
596561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortEnable,
596661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
596761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
596861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
5969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
597061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return error;
5971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
597461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
5975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
597661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
597761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr[bufferindex].pBuffer)
597861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free(m_inp_heap_ptr[bufferindex].pBuffer);
597961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
598061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
598161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_bufferHdr)
598261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_input_buffer(pmem_bufferHdr);
598361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
5985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
5986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
5987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
598861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
598961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
599061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
599161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
599361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_inp_mem_ptr;
59948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
599561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
59960c95c078771f637924fa7ae01b0d90df285dde64Ray Essick    auto_lock l(buf_lock);
599797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    bufferHdr->pInputPortPrivate = NULL;
599897e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan
599961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
60008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
6001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) {
600261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct vdec_setbuffer_cmd setbuffers;
600361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
600461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
600561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    sizeof (vdec_bufferpayload));
600661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!secure_mode) {
60078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
60086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
6009f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_LOW("unmap the input buffer size=%u  address = %p",
6010f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size,
601161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
601261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
601361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_inputbuffer[index].mmaped_size);
60144173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                close (drv_ctx.ptr_inputbuffer[index].pmem_fd);
60154173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            } else if (allocate_native_handle){
60164173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer;
60174173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                native_handle_close(nh);
60184173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan                native_handle_delete(nh);
601961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
602061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
602161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
602261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_desc_buffer_ptr[index].buf_addr);
602361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].buf_addr = NULL;
602461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_desc_buffer_ptr[index].desc_data_size = 0;
602561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
602761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
6028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
602961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
603261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
6036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
603761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
6038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
603961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
604061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
604161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
604361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufferHdr - m_out_mem_ptr;
60448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
6045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
604661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < drv_ctx.op_buf.actualcount
604761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && drv_ctx.ptr_outputbuffer) {
60488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index,
604961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[index].bufferaddr);
6050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
605161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_setbuffer_cmd setbuffers;
605261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
605361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
605461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sizeof (vdec_bufferpayload));
6055a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan
6056a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan        if (!dynamic_buf_mode) {
6057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (streaming[CAPTURE_PORT] &&
6058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) {
6059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
6060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("STREAMOFF Failed");
6061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                } else {
6062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_LOW("STREAMOFF Successful");
6063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
6064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
6065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6066a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan            if (m_enable_android_native_buffers) {
606761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!secure_mode) {
6068a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
6069a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                        munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
6070a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                                drv_ctx.ptr_outputbuffer[index].mmaped_size);
6071a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    }
607261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
6073a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
6074a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan            } else {
6075a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan#endif
6076a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
6077a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    if (!secure_mode) {
60788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
6079a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                                drv_ctx.ptr_outputbuffer[0].pmem_fd);
6080f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        DEBUG_PRINT_LOW("unmap the ouput buffer size=%u  address = %p",
6081f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                (unsigned int)drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
6082a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                                drv_ctx.ptr_outputbuffer[0].bufferaddr);
6083a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                        munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
6084a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                                drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
6085a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    }
6086a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
6087a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
6088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
6089a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                    free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
6090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6091a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                }
6092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
6093a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan            }
6094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6095a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan        } //!dynamic_buf_mode
609661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
609761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_extradata();
609861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
60996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
6100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
610161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
6102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
610661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,
610761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              port,
610861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_PTR              appData,
610961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32              bytes)
6110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
611161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
611261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
611361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
611461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
611561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
611661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Sanity Check*/
611761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufferHdr == NULL) {
611861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
612161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_heap_ptr == NULL) {
612261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
612361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
612461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                         drv_ctx.ip_buf.actualcount);
612561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
612661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                  calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
612761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                          drv_ctx.ip_buf.actualcount);
612861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6129f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) {
6130f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed ");
613161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
613261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
613361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
613461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
613561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Find a Free index*/
613661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
613761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
61388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
613961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
614061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
614361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
614461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
6145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
614661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buf_addr == NULL) {
614761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
614861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
614961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
615061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_heap_ptr + i);
615161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
615261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_heap_inp_bm_count,i);
615361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
615461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pBuffer           = (OMX_U8 *)buf_addr;
615561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
615661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
615761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
615861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
615961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
61608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
616161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
61628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
616361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Add the Buffers to freeq*/
61648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i],
616561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL, (unsigned)NULL)) {
61668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
616761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
616861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
616961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
617061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
617361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
617961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
618061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputBuffer
6181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
618261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
618361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper function for allocate buffer in the input pin
6184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
618561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
618661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
6187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
618861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
618961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
6190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
619161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
6192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
619361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
619461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
619561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
619661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
619761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
6198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
619961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
620061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
620161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *input = NULL;
620261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned   i = 0;
620361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned char *buf_addr = NULL;
620417322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara    int pmem_fd = -1, ret = 0;
620561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
62068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
62078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) port;
62088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
62098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
621061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bytes != drv_ctx.ip_buf.buffer_size) {
6211f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u",
6212f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size);
621361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
6214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
621661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_mem_ptr) {
621717322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        struct v4l2_requestbuffers bufreq;
621817322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        bufreq.memory = V4L2_MEMORY_USERPTR;
621917322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
622017322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        bufreq.count = drv_ctx.ip_buf.actualcount;
622117322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
622217322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        if (ret) {
622317322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %s", strerror(errno));
622417322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara            /*TODO: How to handle this case */
622517322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara            eRet = OMX_ErrorInsufficientResources;
622617322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        } else if (bufreq.count != drv_ctx.ip_buf.actualcount) {
622717322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara            DEBUG_PRINT_ERROR("%s Count(%d) is not expected to change to %d",
622817322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara                __FUNCTION__, drv_ctx.ip_buf.actualcount, bufreq.count);
622917322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara            eRet = OMX_ErrorInsufficientResources;
623017322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara        }
623117322c984e566ce2c11f8e07dbdfe7ea9d7d474cSanthosh Behara
6232f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)",
623361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ip_buf.actualcount,
6234f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (unsigned int)drv_ctx.ip_buf.buffer_size);
6235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
623661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
623761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
623861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
623961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_mem_ptr == NULL) {
624061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
624161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
624261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
624361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
624461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
624561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
624661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ptr_inputbuffer == NULL) {
624761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
624861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
625061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
625161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
6252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
625361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info == NULL) {
625461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
625561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
625861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
625961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
6260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
626161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
6262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
626361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
626661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
626761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
62688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
626961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
627061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
627361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < drv_ctx.ip_buf.actualcount) {
627461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_buffer buf;
627561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_plane plane;
627661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
62778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Allocate input Buffer");
6278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
627961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
62800c95c078771f637924fa7ae01b0d90df285dde64Ray Essick                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
628161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
6282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ?
6283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED);
628461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
628561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
628661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
628761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
6288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
628961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
6290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
629161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
62928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
629361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
629461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
629661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd == 0) {
629761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_fd = open (MEM_DEVICE,O_RDWR);
6298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
629961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_fd < 0) {
63008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
630161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
630261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
630361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
630561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
630661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.alignment)) {
63078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
630861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
630961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
631061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
631261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
631361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf_addr = (unsigned char *)mmap(NULL,
631461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.ip_buf.buffer_size,
631561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
6316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
631761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf_addr == MAP_FAILED) {
631861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
6319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
632061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
6321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
63228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
632361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
632461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
632561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
632661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *bufferHdr = (m_inp_mem_ptr + i);
632761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (secure_mode)
632861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
632961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
633061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
633161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
633261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
633361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
633461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer [i].offset = 0;
633561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
633761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = i;
633861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
633961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
634061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = 0;
634161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
634261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
634361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
634461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.reserved[1] = 0;
634561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
634661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = &plane;
634761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
634861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i,
635061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_inputbuffer[i].bufferaddr);
635161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
635361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
635461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
63558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to prepare bufs");
635661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
635761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
6358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
636061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input = *bufferHdr;
636161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        BITMASK_SET(&m_inp_bm_count,i);
63628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
63634173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan        if (allocate_native_handle) {
63644173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/);
63654173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd;
63664173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            input->pBuffer = (OMX_U8 *)nh;
63674173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan        } else if (secure_mode || m_input_pass_buffer_fd) {
63684173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            /*Legacy method, pass ion fd stashed directly in pBuffer*/
6369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd;
63704173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan        } else {
63714173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan            input->pBuffer           = (OMX_U8 *)buf_addr;
63724173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan        }
637361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
637461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nVersion.nVersion = OMX_SPEC_VERSION;
637561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
637661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pAppPrivate       = appData;
637761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
637861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
637961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
638061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (drv_ctx.disable_dmx) {
638161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_desc_buffer(i);
638261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
638361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
63848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
638561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
638661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
638761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
639261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
639361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputBuffer
6394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
639561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
639661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Helper fn for AllocateBuffer in the output pin
6397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
639861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
639961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
6400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
640161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
640261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went well.
6403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
640461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
6405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
640661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE            hComp,
640761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
640861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   port,
640961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                   appData,
641061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                   bytes)
6411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
64128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void)hComp;
64138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void)port;
641461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
641561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
641661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned                         i= 0; // Temporary counter
641761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_setbuffer_cmd setbuffers;
641861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int extra_idx = 0;
6419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
642061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_device_fd =-1;
642161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_allocation_data ion_alloc_data;
642261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ion_fd_data fd_ion_data;
6423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
642461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
6425f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)",
642661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount,
6427f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (unsigned int)drv_ctx.op_buf.buffer_size);
642861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
642961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
643061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
643161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
643261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int pmem_fd = -1;
643361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned char *pmem_baseaddress = NULL;
643461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
643561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
643661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
643761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
643861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
64398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
644061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
644161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
644261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
644361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
644461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
644561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
644661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
644761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
644861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
644961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
645061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6451f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
6452f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
645361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
645461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
64558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
645661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
6457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
6458f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        // Allocate output buffers as cached to improve performance of software-reading
6459f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        // of the YUVs. Output buffers are cache-invalidated in driver.
6460f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        // If color-conversion is involved, Only the C2D output buffers are cached, no
6461f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        // need to cache the decoder's output buffers
6462f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED;
646361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_device_fd = alloc_map_ion_memory(
646461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
6465f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment,
6466f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                &ion_alloc_data, &fd_ion_data,
6467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (secure_mode && !secure_scaling_to_non_secure_opb) ?
6468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SECURE_FLAGS_OUTPUT_BUFFER : cache_flag);
646961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ion_device_fd < 0) {
647061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
647161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
647261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = fd_ion_data.fd;
6473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
647461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = open (MEM_DEVICE,O_RDWR);
6475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
647661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_fd < 0) {
64778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
647861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.buffer_size);
647961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
648061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
648261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
648361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.actualcount,
648461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    drv_ctx.op_buf.alignment)) {
64858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
648661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(pmem_fd);
648761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
648861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
649061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!secure_mode) {
649161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pmem_baseaddress = (unsigned char *)mmap(NULL,
649261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (drv_ctx.op_buf.buffer_size *
649361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     drv_ctx.op_buf.actualcount),
649461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
649561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pmem_baseaddress == MAP_FAILED) {
6496f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_ERROR("MMAP failed for Size %u",
6497f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        (unsigned int)drv_ctx.op_buf.buffer_size);
649861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                close(pmem_fd);
6499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
650061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
6501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
650261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
650361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
650461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
650561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
650661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
650761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
650861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
650961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
651061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
651161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       calloc (sizeof(struct vdec_bufferpayload),
651261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               drv_ctx.op_buf.actualcount);
651361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
651461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     calloc (sizeof (struct vdec_output_frameinfo),
651561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             drv_ctx.op_buf.actualcount);
6516f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
6517f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer ");
6518f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            return OMX_ErrorInsufficientResources;
6519f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
6520f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
6521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
652261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
652361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      calloc (sizeof(struct vdec_ion),
652461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                              drv_ctx.op_buf.actualcount);
6525f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (!drv_ctx.op_buf_ion_info) {
6526f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
6527f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            return OMX_ErrorInsufficientResources;
6528f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
6529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
653161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
653261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
653361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[0].mmaped_size =
653461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (drv_ctx.op_buf.buffer_size *
653561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 drv_ctx.op_buf.actualcount);
653661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
653761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
653861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
653961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
654061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
654161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
654261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
654361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
654461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
654561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
65468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
654761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
654861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
65498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
65508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
655161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
655261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
655361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
655461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
655561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = bytes;
655661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
655761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = appData;
655861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
655961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Platform specific PMEM Information
656061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform Entry
65618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
656261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
656361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
656461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
656561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
656661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
656761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
656861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
656961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOffset            = 0;
657061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
657161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
6572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                pPMEMInfo->pmem_fd = -1;
657361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
657461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
657561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
657661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_pmem_info[i].pmem_fd = pmem_fd;
6577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
657861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
657961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
658061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
6581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
6582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
658361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
658461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
658561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
658661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    &drv_ctx.ptr_outputbuffer[i];
658761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
658861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
658961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
65908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
65918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
65928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
659361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6594f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p",
6595f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        pmem_fd, (unsigned int)drv_ctx.ptr_outputbuffer[i].offset,
659661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
659761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
659861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
659961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
660061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
660161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
660261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
660361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
66048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
660561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
660661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
660761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
660861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
660961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
661061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
661161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
661261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
661361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
661461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
661561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
661661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
661761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
661861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
661961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
662061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
662161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
662361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
66248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
662561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
662661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
662761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
662961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
663061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
663161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet == OMX_ErrorNone)
663261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_extradata();
6633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
663561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
663661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
66378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
663861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
663961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
664261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
664361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i < drv_ctx.op_buf.actualcount) {
664461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_buffer buf;
664561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct v4l2_plane plane[VIDEO_MAX_PLANES];
664661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int rc;
664761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
664861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
664961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].buffer_len =
665061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.buffer_size;
665161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
665261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *bufferHdr = (m_out_mem_ptr + i );
665361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (secure_mode) {
6654f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef USE_ION
6655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr =
6656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
6657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#else
665861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
6659f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
666061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
666161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
666261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
666361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.index = i;
666461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
666561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.memory = V4L2_MEMORY_USERPTR;
666661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].length = drv_ctx.op_buf.buffer_size;
666761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
666861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
6669b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#ifdef USE_ION
667061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
6671b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand#endif
667261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
667361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[0].data_offset = 0;
667461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
667561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
667661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
667761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
66786eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
667961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
66806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
668161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
668261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                plane[extra_idx].data_offset = 0;
668361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (extra_idx >= VIDEO_MAX_PLANES) {
66848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
668561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorBadParameter;
668661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
668761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.m.planes = plane;
668861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buf.length = drv_ctx.num_planes;
66898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
669061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
669161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
669261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*TODO: How to handle this case */
669361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return OMX_ErrorInsufficientResources;
669461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
669561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
669661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
669761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enum v4l2_buf_type buf_type;
669861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
669961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
670061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (rc) {
670161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorInsufficientResources;
670261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
670361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    streaming[CAPTURE_PORT] = true;
67048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("STREAMON Successful");
670561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
6706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
6707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Enabling Turbo mode");
6708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                request_perf_level(VIDC_TURBO);
670961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
671061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
671161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
671261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (*bufferHdr)->pAppPrivate = appData;
671361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_SET(&m_out_bm_count,i);
671461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
67158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
671661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
671761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
6718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
672061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
6721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// AllocateBuffer  -- API Call
6725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
672661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
672761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateBuffer
6728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
672961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
673061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Returns zero if all the buffers released..
6731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
673261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
673361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
6734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
673561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
673661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
6737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
673861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
6739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
674061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
674161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
674261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
674361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                       bytes)
6744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned i = 0;
6746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
6747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
67488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
674961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateInvalid) {
67508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
6751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInvalidState;
6752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
675461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
6755ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
6756ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        // ensure that use-buffer was never called.
6757ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        // Mix-and-match of useBuffer and allocateBuffer is not allowed
6758ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        if (m_inp_mem_ptr && input_use_buffer) {
6759ee06e61ff49357884de5c6714828c263966895eePraveen Chavan            DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !");
6760ee06e61ff49357884de5c6714828c263966895eePraveen Chavan            return OMX_ErrorUndefined;
6761ee06e61ff49357884de5c6714828c263966895eePraveen Chavan        }
676261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
676361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
676461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
676561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
676661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
676761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
67686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
67696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal                appData,bytes);
677061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
67718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
677261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
6773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
677561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet == OMX_ErrorNone) {
677661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (allocate_done()) {
677761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
6778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                // Send the callback now
6779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
6780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandStateSet,OMX_StateIdle,
678161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
6782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
6783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
678461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
678561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
678661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
678761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                post_event(OMX_CommandPortEnable,
6788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_CORE_INPUT_PORT_INDEX,
6789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_COMPONENT_GENERATE_EVENT);
679061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
6791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
679261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
679361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
679461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
6795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                post_event(OMX_CommandPortEnable,
679661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_CORE_OUTPUT_PORT_INDEX,
679761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EVENT);
6798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
6799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
68018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
6802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
6803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev// Free Buffer - API call
6806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
680761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
680861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FreeBuffer
6809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
681061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
6811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
681261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
681361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
6814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
681561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
681661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
6817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
681861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
6819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
682061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                 port,
682161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
6822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
6823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_ERRORTYPE eRet = OMX_ErrorNone;
6824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned int nPortIndex;
68258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
68268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("In for decoder free_buffer");
6827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
682861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state == OMX_StateIdle &&
682961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
68308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
683161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
683261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
68338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port);
683461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
683561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
683661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
683761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
68388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port);
683961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
68408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
6841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
684261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
684361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
68440c95c078771f637924fa7ae01b0d90df285dde64Ray Essick
6845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorIncorrectStateOperation;
684661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_state != OMX_StateInvalid) {
68478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
6848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        post_event(OMX_EventError,
684961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_ErrorPortUnpopulated,
685061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EVENT);
6851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
685361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
685461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if arbitrary bytes*/
685561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!arbitrary_bytes && !input_use_buffer)
685661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_mem_ptr;
685761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
685861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPortIndex = buffer - m_inp_heap_ptr;
6859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
68608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
6861fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan        if (nPortIndex < drv_ctx.ip_buf.actualcount &&
6862fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) {
686361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Clear the bit associated with it.
686461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
686561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
686661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (input_use_buffer == true) {
686761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
686961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_phdr_pmem_ptr)
687061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
687161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
687261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (arbitrary_bytes) {
687361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_phdr_pmem_ptr)
687461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
687561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else
687661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        free_input_buffer(nPortIndex,NULL);
687761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
687861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    free_input_buffer(buffer);
6879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
688061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_bPopulated = OMX_FALSE;
68818b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan            if(release_input_done())
68828b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan                release_buffers(this, VDEC_BUFFER_TYPE_INPUT);
688361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*Free the Buffer Header*/
688461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_input_done()) {
68858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
688661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_input_buffer_header();
688761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
688861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
68898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
6890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
6891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
689361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
689461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_input_done()) {
68958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
6896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
6897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandPortDisable,
689861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_INPUT_PORT_INDEX,
689961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
6900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
690161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
6902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // check if the buffer is valid
69036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
6904fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan        if (nPortIndex < drv_ctx.op_buf.actualcount &&
6905fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) {
69068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
6907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Clear the bit associated with it.
6908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
6909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_out_bPopulated = OMX_FALSE;
69106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal            client_buffers.free_output_buffer (buffer);
6911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
69128b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan            if(release_output_done()) {
69138b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan                release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT);
69148b173d647d30b0cebf73b966a620b14cc3429b41Praveen Chavan            }
691561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (release_output_done()) {
691661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free_output_buffer_header();
6917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
691861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
69198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
6920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            eRet = OMX_ErrorBadPortIndex;
6921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
692261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
692361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && release_output_done()) {
69248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
6925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
69268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
692761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
69286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef _ANDROID_ICS_
692961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_enable_android_native_buffers) {
693061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
693161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
693261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
69336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
6934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
693561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_CommandPortDisable,
693661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_CORE_OUTPUT_PORT_INDEX,
693761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
6938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
693961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
6940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorBadPortIndex;
6941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
694261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eRet == OMX_ErrorNone) &&
694361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
694461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_done()) {
6945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            // Send the callback now
6946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
6947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            post_event(OMX_CommandStateSet, OMX_StateLoaded,
694861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT);
6949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
6950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
6951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return eRet;
6952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
6953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
6955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
695661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
695761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::EmptyThisBuffer
6958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
695961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
696061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
696161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
6962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
696361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
696461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
6965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
696661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
696761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
6968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
696961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
6970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
697161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
6972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
697361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
697461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
697561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
697697e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    if (m_state != OMX_StateExecuting &&
697797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan            m_state != OMX_StatePause &&
697897e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan            m_state != OMX_StateIdle) {
69798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
698061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInvalidState;
698161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
698361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
69848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
698561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
698661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
698761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
698861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_inp_bEnabled) {
69898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
699061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
699161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
699261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
699361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
69948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex);
699561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
699661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
6997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
699861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (perf_flag) {
699961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!latency) {
700061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.stop();
700161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            latency = dec_time.processing_time_us();
700261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dec_time.start();
700361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
700461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
700561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
700661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
700761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufferIndex = buffer - m_inp_heap_ptr;
700861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
700961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
701061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_heap_ptr;
7011ee06e61ff49357884de5c6714828c263966895eePraveen Chavan            if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
7012ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode");
7013ee06e61ff49357884de5c6714828c263966895eePraveen Chavan                return OMX_ErrorBadParameter;
7014ee06e61ff49357884de5c6714828c263966895eePraveen Chavan            }
701561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
701661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
701761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
701861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer = &m_inp_mem_ptr[nBufferIndex];
70198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u",
70208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen);
702161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
702261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nBufferIndex = buffer - m_inp_mem_ptr;
702361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
702461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
702561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
7026ee06e61ff49357884de5c6714828c263966895eePraveen Chavan    if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
70278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
702861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
702961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
703061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
7031a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
7032a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        codec_config_flag = true;
7033a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
7034a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    }
7035a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan
7036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    /* The client should not set this when codec is in arbitrary bytes mode */
7037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_input_pass_buffer_fd) {
7038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr;
7039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
7040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
70418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)",
70428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen);
704361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
70448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event ((unsigned long)hComp,(unsigned long)buffer,
7045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
704661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
70478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB);
704861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7049f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    time_stamp_dts.insert_timestamp(buffer);
705061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
7051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
705461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
705561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::empty_this_buffer_proxy
7056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
705761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
705861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   This routine is used to push the encoded video frames to
705961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   the video decoder.
7060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
706161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
706261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
706461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
706561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything went successful.
7066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
706761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
70688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE  hComp,
706961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
7070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
70718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
707261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int push_cnt = 0,i=0;
707361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
707461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
707561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_input_frameinfo frameinfo;
707661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload *temp_buffer;
707761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_seqheader seq_header;
707861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool port_setting_changed = true;
707961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Should we generate a Aync error event*/
708161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
70828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
708361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
708461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
708561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
708661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
708761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
7088ee06e61ff49357884de5c6714828c263966895eePraveen Chavan    if (nPortIndex >= drv_ctx.ip_buf.actualcount) {
70898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
709061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPortIndex);
709161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
709261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
709361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_input_buffers++;
709561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
709661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
709761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
709861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
70998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer");
71008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
710161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
710261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
710361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7105f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (input_flush_progress == true) {
71068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Flush in progress return buffer ");
71078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
710861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_COMPONENT_GENERATE_EBD);
710961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
711061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
711297e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    auto_lock l(buf_lock);
711361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
7114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
711597e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    if (!temp_buffer || (temp_buffer -  drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) {
711661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
711761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
711861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* If its first frame, H264 codec and reject is true, then parse the nal
711961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan       and get the profile. Based on this, reject the clip playback */
712061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
712161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_reject_avc_1080p_mp) {
712261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        first_frame = 1;
71238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Parse nal to get the profile");
712461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
712561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NALU_TYPE_SPS);
712661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_profile = h264_parser->get_profile();
712761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = is_video_session_supported();
712861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
71298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
713061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
713161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
713261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_state = OMX_StateInvalid;
713361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorNone;
713461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
713561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
71378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
713861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*for use buffer we need to memcpy the data*/
713961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer->buffer_len = buffer->nFilledLen;
714061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71417b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) {
714261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
714361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (arbitrary_bytes) {
714461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
714561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
714661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
714761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        buffer->nFilledLen);
714861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
714961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
715061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
715161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
715561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.bufferaddr = temp_buffer->bufferaddr;
715661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.client_data = (void *) buffer;
715761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.datalen = temp_buffer->buffer_len;
715861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = 0;
715961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = buffer->nOffset;
716061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_fd = temp_buffer->pmem_fd;
716161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.pmem_offset = temp_buffer->offset;
716261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = buffer->nTimeStamp;
716361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
716461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("ETB: dmx enabled");
716561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_demux_entries == 0) {
716661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extract_demux_addr_offsets(buffer);
716761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
716861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries);
717061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        handle_demux_data(buffer);
717161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
717261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
717361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
717461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_addr = NULL;
717561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.desc_size = 0;
7176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
717761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!arbitrary_bytes) {
717861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= buffer->nFlags;
717961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
718061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
718161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_
718261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
718361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (arbitrary_bytes) {
71848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
718561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
718661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
71878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
718861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_timestamp_list.insert_ts(buffer->nTimeStamp);
718961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
71934173299cd1f7b2cc9a9eefb8e954b6abae9ac642Praveen Chavan    log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len);
7194073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava
7195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
7196073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
719761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
719861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
719961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
720061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
72018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
720261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
720361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_scratch.nFilledLen = 0;
720461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nal_count = 0;
720561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
720661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_count = 0;
720761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.mutils)
720861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_frame_parser.mutils->initialize_frame_checking_environment();
720961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_frame_parser.flush();
721061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_ts = LLONG_MAX;
721161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_last_au_flags = 0;
721261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
721361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_entries = 0;
721461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
721561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
721661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
721761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
721861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&plane, 0, sizeof(plane));
721961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
722061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long  print_count;
722161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
72228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
72238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
722461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
722561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
722661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
722761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
722861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
722961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.bytesused = temp_buffer->buffer_len;
723061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.length = drv_ctx.ip_buf.buffer_size;
723161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
723261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)temp_buffer->offset;
723361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = temp_buffer->pmem_fd;
723461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = temp_buffer->offset;
723561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.data_offset = 0;
723661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
723761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
723861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frameinfo.timestamp >= LLONG_MAX) {
723961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
724061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
724161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //assumption is that timestamp is in milliseconds
724261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
724361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
724461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
724561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
724661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
7247f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
7248f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("Increment codec_config buffer counter");
7249f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        android_atomic_inc(&m_queued_codec_config_count);
7250f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
7251f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
725261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
725361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
72548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver");
725561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorHardware;
725661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
7258a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
7259a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        codec_config_flag = false;
7260a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    }
726161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
726261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
726361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret,r;
726461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
726561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
72668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
726761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
726861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!ret) {
72698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
727061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
7271f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        } else if (errno == EBUSY) {
7272f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD");
7273f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
7274f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
7275f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            return OMX_ErrorInsufficientResources;
727661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
72778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
727861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
7279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
728061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
728161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
728261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
728361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7284f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)",
7285f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            frameinfo.bufferaddr, (long long)frameinfo.timestamp,
7286f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (unsigned int)frameinfo.datalen);
7287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
728861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
7289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
729261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
729361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::FillThisBuffer
7294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
729561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
729661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
729761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
7298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
729961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
730061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
730261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
730361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
7304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
730561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
730761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
7308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
730997e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    if (m_state != OMX_StateExecuting &&
731097e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan            m_state != OMX_StatePause &&
731197e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan            m_state != OMX_StateIdle) {
731297e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan        DEBUG_PRINT_ERROR("FTB in Invalid State");
731397e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan        return OMX_ErrorInvalidState;
731497e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    }
731597e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan
731697e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    if (!m_out_bEnabled) {
731797e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
731897e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
731997e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan    }
732097e3ddfad60bf0417cbbc93dda97d2b887589fc0Praveen Chavan
7321f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    unsigned nPortIndex = 0;
7322576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    if (dynamic_buf_mode) {
7323576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        private_handle_t *handle = NULL;
7324576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        struct VideoDecoderOutputMetaData *meta;
7325576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        unsigned int nPortIndex = 0;
7326576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
7327576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        if (!buffer || !buffer->pBuffer) {
7328f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer);
7329576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            return OMX_ErrorBadParameter;
7330576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        }
7331576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
7332576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        //get the buffer type and fd info
7333576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer;
7334576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        handle = (private_handle_t *)meta->pHandle;
73358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle);
7336576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
73378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!handle) {
73388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle);
73398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
73408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
7341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF
7342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
7343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (nPortIndex < drv_ctx.op_buf.actualcount &&
7344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
7345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd;
7346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer;
7347576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
7348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           //Store private handle from GraphicBuffer
7349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            native_buffer[nPortIndex].privatehandle = handle;
7350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            native_buffer[nPortIndex].nativehandle = handle;
7351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else {
7352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex);
7353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            return OMX_ErrorBadParameter;
7354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
7355f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
7356f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite
7357f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        //this with a more sane size so that we don't compensate in rest of code
7358f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        //We'll restore this size later on, so that it's transparent to client
7359f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        buffer->nFilledLen = 0;
7360f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        buffer->nAllocLen = handle->size;
7361bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        drv_ctx.op_buf.buffer_size = handle->size;
7362576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    }
7363576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
7364f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    nPortIndex = buffer - client_buffers.get_il_buf_hdr();
736561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL ||
7366f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (nPortIndex >= drv_ctx.op_buf.actualcount)) {
7367f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
7368f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            nPortIndex, drv_ctx.op_buf.actualcount);
736961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
737061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
737161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
737261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
73738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex);
737461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadPortIndex;
737561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
737661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
737761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
73788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg);
737961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
7380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
738261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
738361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::fill_this_buffer_proxy
738461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
738561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
738661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   IL client uses this method to release the frame buffer
738761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   after displaying them.
738861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
738961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
739061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
739161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
739261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
739361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
739461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
739561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
739661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
739761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_HANDLETYPE        hComp,
739861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
739961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
740061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE nRet = OMX_ErrorNone;
740161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
740261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned nPortIndex = 0;
740361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_fillbuffer_cmd fillbuffer;
740461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
740561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
740661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
740761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
740861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
7409ee06e61ff49357884de5c6714828c263966895eePraveen Chavan    if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) {
7410f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
7411f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            nPortIndex, drv_ctx.op_buf.actualcount);
741261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
7413f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
7414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
741661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufferAdd, bufferAdd->pBuffer);
741761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*Return back the output buffer to client*/
741861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true) {
74198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
742061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
742161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
742261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
742361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
74248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
74255a9eab657a9f229a6ed3700f27dc1253a8eaddfbArun Menon    if (dynamic_buf_mode) {
7426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0;
7427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen;
7428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        buf_ref_add(nPortIndex);
7429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen;
74305a9eab657a9f229a6ed3700f27dc1253a8eaddfbArun Menon    }
74318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
743261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers++;
743361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
7434f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (!buffer) {
7435f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan       DEBUG_PRINT_ERROR("err: client_buffer ptr invalid");
7436f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan       return OMX_ErrorBadParameter;
7437f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
743861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
743961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer) {
744061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
744161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
744361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
744461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
744561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
744661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.FillBufferDone (hComp,m_app_data,buffer);
744761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_output_buffers--;
744861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
744961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
745161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
745261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
745361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
745461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)&buf, 0, sizeof(buf));
745561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
7456f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    unsigned int extra_idx = 0;
7457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
745861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = nPortIndex;
745961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
746061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
746161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = buffer->nFilledLen;
7462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    plane[0].length = buffer->nAllocLen;
746361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].m.userptr =
746461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
746561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
746661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
746761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
746861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = 0;
746961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
747061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
747161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
747261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
747361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
74746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
747561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
74766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
747761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
747861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
747961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
7480f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
748161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
748261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
748361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
748461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = drv_ctx.num_planes;
7485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d",
7486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress);
7487576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
748861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
748961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
749061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
749161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf to driver");
749261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinreturn OMX_ErrorNone;
7494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
749761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
749861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::SetCallbacks
7499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
750061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
750161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Set the callbacks.
7502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
750361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
750461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
750661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
750761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
7508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
750961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
751161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_CALLBACKTYPE* callbacks,
751261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR             appData)
7513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
75148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
751561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_cb       = *callbacks;
75168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
751761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EventHandler,m_cb.FillBufferDone);
751861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_app_data =    appData;
751961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNotImplemented;
7520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
752361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
752461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentDeInit
7525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
752661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
752761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Destroys the component and release memory allocated to the heap.
7528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
752961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
753061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
7531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
753261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
753361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything successful.
7534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
753561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
7537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
75388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan   (void) hComp;
7539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
75406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    unsigned i = 0;
754161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_StateLoaded != m_state) {
75428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
754361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_state);
75448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
754561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
75468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
7547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the output buffers have to be cleaned up*/
755061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
75518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Output Memory");
755261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
7553fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            if (BITMASK_PRESENT(&m_out_bm_count, i)) {
7554fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                BITMASK_CLEAR(&m_out_bm_count, i);
7555fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                client_buffers.free_output_buffer (&m_out_mem_ptr[i]);
7556fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            }
7557fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan
7558fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            if (release_output_done()) {
7559fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                break;
7560fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            }
7561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
756261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_
756361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
756461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
7565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Check if the input buffers have to be cleaned up*/
756861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr || m_inp_heap_ptr) {
75698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Freeing the Input Memory");
757061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
7571fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan
7572fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
7573fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                BITMASK_CLEAR(&m_inp_bm_count, i);
7574fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                if (m_inp_mem_ptr)
7575fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                    free_input_buffer (i,&m_inp_mem_ptr[i]);
7576fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                else
7577fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                    free_input_buffer (i,NULL);
7578fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            }
7579fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan
7580fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            if (release_input_done()) {
7581fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan                break;
7582fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan            }
7583fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan       }
7584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_input_buffer_header();
7586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    free_output_buffer_header();
758761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer) {
7588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(h264_scratch.pBuffer);
7589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        h264_scratch.pBuffer = NULL;
7590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
759261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_parser) {
7593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        delete h264_parser;
759461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        h264_parser = NULL;
7595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7597aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan    if (m_frame_parser.mutils) {
75988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free utils parser");
7599aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan        delete (m_frame_parser.mutils);
7600aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan        m_frame_parser.mutils = NULL;
7601aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan    }
7602aa66d36cb6948770d28b7583681649c9d8826bd9Praveen Chavan
760361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
7604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_platform_list);
7605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_platform_list = NULL;
7606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
760761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_vendor_config.pData) {
7608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        free(m_vendor_config.pData);
7609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_vendor_config.pData = NULL;
7610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // Reset counters in mesg queues
7613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_size=0;
7614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_size=0;
7615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_size=0;
7616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_ftb_q.m_read = m_ftb_q.m_write =0;
7617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_cmd_q.m_read = m_cmd_q.m_write =0;
7618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_etb_q.m_read = m_etb_q.m_write =0;
7619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
762061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_timestamp) {
762161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_timestamp_list.reset_ts_list();
7622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
76258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
7626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
762761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // NULL);
76288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Close the driver instance");
76296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
76308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile) {
76318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.infile);
76328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = NULL;
76338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
76348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile) {
76358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.outfile);
76368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = NULL;
76378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
7638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_debug.out_ymeta_file) {
7639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fclose(m_debug.out_ymeta_file);
7640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_debug.out_ymeta_file = NULL;
7641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
7642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_debug.out_uvmeta_file) {
7643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fclose(m_debug.out_uvmeta_file);
7644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_debug.out_uvmeta_file = NULL;
7645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
7646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_EXTRADATA_LOG
76476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    if (outputExtradataFile)
76486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        fclose (outputExtradataFile);
7649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
76508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete");
765161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
7652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
765561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
765661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::UseEGLImage
7657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
765861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
765961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Use EGL Image method implementation <TBD>.
7660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
766161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
766261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
7663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
766461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
766561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Not Implemented error.
7666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
766761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
76688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE     hComp,
766961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
767061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32                        port,
767161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_PTR                     appData,
767261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN void*                      eglImage)
7673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
76748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) appData;
767561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
767661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
767761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
7678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
768061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
768161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    EGLint fd = -1, offset = 0,pmemPtr = 0;
7682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
768361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -1, offset = 0;
7684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
76858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("use EGL image support for decoder");
768661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
76878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid EGL image");
768861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_EGL_IMAGE_GPU
769061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_display_id == NULL) {
76918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
7692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
769361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
769461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
769561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eglGetProcAddress("eglQueryImageKHR");
76968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd);
76978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset);
7698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr);
7699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else //with OMX test app
7700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl {
7701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int pmem_fd;
7702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        int offset;
7703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    };
7704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct temp_egl *temp_egl_id = NULL;
7705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void * pmemPtr = (void *) eglImage;
7706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    temp_egl_id = (struct temp_egl *)eglImage;
770761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (temp_egl_id != NULL) {
7708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        fd = temp_egl_id->pmem_fd;
7709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        offset = temp_egl_id->offset;
7710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
7712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (fd < 0) {
77138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
7714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorInsufficientResources;
771561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
771661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.pmem_fd = (OMX_U32) fd;
771761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_info.offset = (OMX_U32) offset;
771861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.entry = (void *) &pmem_info;
771961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
772061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.entryList = &pmem_entry;
772161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_list.nEntries = 1;
772261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = true;
772361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
772461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
772561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (OMX_U8 *)pmemPtr)) {
77268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
772761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
772861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
772961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
7730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
773361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
773461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ComponentRoleEnum
7735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
773661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
773761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Component Role Enum method implementation.
7738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
773961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
774061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   <TBD>.
7741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
774261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
774361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   OMX Error None if everything is successful.
774461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
774661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_OUT OMX_U8*        role,
774761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_IN OMX_U32        index)
7748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
77498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    (void) hComp;
775061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
7751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
775261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
775361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
775461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
77558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
775661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
775761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
775861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
776061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
776161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
776261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
77638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
776461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
776561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
776661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
776761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
776861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
776961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
77708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
777161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
77728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
777361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
777461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
777761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
77788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) {
777961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
778061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
77818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
778261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
77838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
778461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
778561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
778661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
778761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
778861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
77898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
77908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
77918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
77928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorNoMore;
77938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
77948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
77958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((0 == index) && role) {
77968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
77978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
7798a66301743224ed885fc1b5275acd16f4843a03f5Vineeta Srivastava        } else {
77998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
78008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            eRet = OMX_ErrorNoMore;
78018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
78028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
78038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((0 == index) && role) {
78048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
78058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s", role);
78068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
78078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
780861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
780961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
781061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
781161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
781261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan          ) {
781361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
781461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
78158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
781661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
78178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
781861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
781961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
782061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
782161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((0 == index) && role) {
782261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
78238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
782461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
78258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("No more roles");
782661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorNoMore;
782761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
7829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((0 == index) && role) {
7830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
7831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
7832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else {
7833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("No more roles");
7834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            eRet = OMX_ErrorNoMore;
7835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
783661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
78378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
783861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInvalidComponentName;
78396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
784061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
784761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
784861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateDone
7849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
785061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
785161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire buffer pool is allocated by IL Client or not.
785261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Need this to move to IDLE state.
7853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
785461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
785561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
785761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
785861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
7859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
786061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_done(void)
7862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
786361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
786461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_In = false;
786561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet_Out = false;
7866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
786761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_In = allocate_input_done();
786861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bRet_Out = allocate_output_done();
7869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
787061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bRet_In && bRet_Out) {
787161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
787261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
787461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
7875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
787761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
787861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateInputDone
7879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
788061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
788161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if I/P buffer pool is allocated by IL Client or not.
7882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
788361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
788461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
788661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
788761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
7888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
788961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_input_done(void)
7891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
789261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
789361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0;
789461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
789561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr == NULL) {
789661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
789761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
789861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr ) {
789961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; i<drv_ctx.ip_buf.actualcount; i++) {
790061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
790161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
790261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
790361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
790461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
790561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i == drv_ctx.ip_buf.actualcount) {
790661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
790761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
790861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
790961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
791061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_bPopulated = OMX_TRUE;
791161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
791261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
7913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
791561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
791661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::AllocateOutputDone
7917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
791861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
791961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if entire O/P buffer pool is allocated by IL Client or not.
7920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
792161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
792261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
792461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
792561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false.
7926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
792761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::allocate_output_done(void)
7929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
793061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
793161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned j=0;
7932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
793361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr == NULL) {
793461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bRet;
793561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
793761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
793861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount; j++) {
793961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
794061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
794161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
794261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
7944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
794561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (j == drv_ctx.op_buf.actualcount) {
794661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
794761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
794861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_bEnabled)
794961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bPopulated = OMX_TRUE;
795061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
795261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
7953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
795661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
795761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseDone
7958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
795961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
796061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
7961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
796261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
796361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
796561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
796661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
7967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
796861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_done(void)
7970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
797161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
7972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
797361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (release_input_done()) {
797461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (release_output_done()) {
797561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
797661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
7977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
797861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
7979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
7980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
798361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
798461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseOutputDone
7985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
798661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
798761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
7988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
798961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
799061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
7991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
799261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
799361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
7994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
799561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
7996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_output_done(void)
7997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
799861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
799961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
800061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8001fd65fa891104fd7cedb06a8ba0849934dae63640Praveen Chavan    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr);
800261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
800361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j < drv_ctx.op_buf.actualcount ; j++) {
800461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
800561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
800661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
800761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
800861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j == drv_ctx.op_buf.actualcount) {
800961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_bm_count = 0;
801061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
801161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
801261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
801361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_bm_count = 0;
801461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
8015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
801661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
8017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
801961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   FUNCTION
802061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   omx_vdec::ReleaseInputDone
8021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
802261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   DESCRIPTION
802361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   Checks if IL client has released all the buffers.
8024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
802561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   PARAMETERS
802661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   None.
8027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
802861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   RETURN VALUE
802961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   true/false
8030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
803161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan   ========================================================================== */
8032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool omx_vdec::release_input_done(void)
8033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
803461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool bRet = false;
803561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i=0,j=0;
803661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
80378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
803861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
803961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; j<drv_ctx.ip_buf.actualcount; j++) {
804061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
804161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
804261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
804361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
804461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (j==drv_ctx.ip_buf.actualcount) {
804561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bRet = true;
804661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
804761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
804861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bRet = true;
8049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
805061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return bRet;
8051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
805461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE * buffer)
8055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
805661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
80578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) {
80588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
805961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
806061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (output_flush_progress) {
806161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
806261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFilledLen = 0;
806361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nTimeStamp = 0;
806461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
806561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
806661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
806761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
806861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
806961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_debug_extradata) {
807061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
80718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("***************************************************");
80728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received");
80738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("***************************************************");
807461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
807561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
807661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
80778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("***************************************************");
80788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
80798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("***************************************************");
808061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
808261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
808361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld",
8085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp);
808661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pending_output_buffers --;
808761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
808861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
80898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Output EOS has been reached");
809061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!output_flush_progress)
809161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            post_event((unsigned)NULL, (unsigned)NULL,
809261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EOS_DONE);
809361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
809461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame) {
809561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
809661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
809761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
809861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame) {
809961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen = 0;
81008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL,
810161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL);
810261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = NULL;
810361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
81068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!output_flush_progress && (buffer->nFilledLen > 0)) {
8107939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // set the default colorspace advised by client, since the bitstream may be
8108939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // devoid of colorspace-info.
8109939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        if (m_enable_android_native_buffers) {
8110939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            ColorSpace_t color_space = ITU_R_601;
8111939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan
8112939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // Disabled ?
8113939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // WA for VP8. Vp8 encoder does not embed color-info (yet!).
8114939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // Encoding RGBA results in 601-LR for all resolutions.
8115939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // This conflicts with the client't defaults which are based on resolution.
8116939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        //   Eg: 720p will be encoded as 601-LR. Client will say 709.
8117939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // Re-enable this code once vp8 encoder generates color-info and hence the
8118939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        // decoder will be able to override with the correct source color.
8119939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan#if 0
8120939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            switch (m_client_color_space.sAspects.mPrimaries) {
8121939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                case ColorAspects::PrimariesBT601_6_625:
8122939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                case ColorAspects::PrimariesBT601_6_525:
8123939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                {
8124939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                    color_space = m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ?
8125939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                            ITU_R_601_FR : ITU_R_601;
8126939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                    break;
8127939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                }
8128939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                case ColorAspects::PrimariesBT709_5:
8129939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                {
8130939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                    color_space = ITU_R_709;
8131939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                    break;
8132939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                }
8133939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                default:
8134939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                {
8135939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                    break;
8136939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                }
8137939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            }
8138939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan#endif
8139939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)",
8140939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan                    color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
8141939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            set_colorspace_in_handle(color_space, buffer - m_out_mem_ptr);
8142939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        }
81438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Processing extradata");
81448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        handle_extradata(buffer);
814561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
8146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8147f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifdef OUTPUT_EXTRADATA_LOG
8148f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (outputExtradataFile) {
8149f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        int buf_index = buffer - m_out_mem_ptr;
8150f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr);
8151f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8152f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
8153f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        p_extra = (OMX_OTHER_EXTRADATATYPE *)
8154f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3));
8155f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8156f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) {
8157f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x",
8158f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                    p_extra->nSize, p_extra->eType);
8159f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
8160f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8161f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (p_extra->eType == OMX_ExtraDataNone) {
8162f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                break;
8163f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
8164f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
8165f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
8166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
8167f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif
8168f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
816961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* For use buffer we need to copy the data */
817061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!output_flush_progress) {
817161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* This is the error check for non-recoverable errros */
817261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_duplicate_ts_valid = true;
817361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
817461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
817561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (output_capability == V4L2_PIX_FMT_MPEG4 ||
817661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                output_capability == V4L2_PIX_FMT_MPEG2 ||
817761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                output_capability == V4L2_PIX_FMT_DIVX ||
817861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                output_capability == V4L2_PIX_FMT_DIVX_311)
817961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            is_duplicate_ts_valid = false;
818061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
81818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((output_capability == V4L2_PIX_FMT_H264 ||
81828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                output_capability == V4L2_PIX_FMT_H264_MVC) &&
81838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                is_interlaced) {
81848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) {
818561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                is_interlaced = false;
818661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
818761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
818861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
818961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen > 0) {
819061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            time_stamp_dts.get_next_timestamp(buffer,
819161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    is_interlaced && is_duplicate_ts_valid);
819261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_debug_timestamp) {
819361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                {
819461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_TICKS expected_ts = 0;
819561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_timestamp_list.pop_min_ts(expected_ts);
819661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (is_interlaced && is_duplicate_ts_valid) {
819761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_timestamp_list.pop_min_ts(expected_ts);
819861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
81998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
820061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            buffer->nTimeStamp, expected_ts);
820161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
820261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (buffer->nTimeStamp != expected_ts) {
82038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
820461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
820561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
820661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
8207f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
82086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
8209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
821061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_cb.FillBufferDone) {
821161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFilledLen > 0) {
82128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (arbitrary_bytes)
8213073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava                adjust_timestamp(buffer->nTimeStamp);
82148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            else
82158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                set_frame_rate(buffer->nTimeStamp);
82168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
821761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (perf_flag) {
821861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (!proc_frms) {
821961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.stop();
822061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    latency = dec_time.processing_time_us() - latency;
822161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
822261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    dec_time.start();
822361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.start();
822461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
822561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                proc_frms++;
822661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
822761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_U64 proc_time = 0;
822861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fps_metrics.stop();
822961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_time = fps_metrics.processing_time_us();
82308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)",
82318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (unsigned int)proc_frms, (float)proc_time / 1e6,
8232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            (float)(1e6 * proc_frms) / proc_time);
823361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    proc_frms = 0;
823461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
823561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
823661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
823761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
823861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = LLONG_MAX;
823961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rst_prev_ts = true;
824061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
824161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
824261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
824361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
824461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan             buffer->pPlatformPrivate)->entryList->entry;
82458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
824661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *il_buffer;
824761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        il_buffer = client_buffers.get_il_buf_hdr(buffer);
8248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator);
82498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (il_buffer && m_last_rendered_TS >= 0) {
82518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS);
82528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // Current frame can be send for rendering if
82548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // (a) current FPS is <=  60
82558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // (b) is the next frame after the frame with TS 0
82568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // (c) is the first frame after seek
82578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // (d) the delta TS b\w two consecutive frames is > 16 ms
82588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // (e) its TS is equal to previous frame TS
82598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            // (f) if marked EOS
82608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if(current_framerate <= 60 || m_last_rendered_TS == 0 ||
82628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               il_buffer->nTimeStamp == 0 || ts_delta >= 16000 ||
82638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
82648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               m_last_rendered_TS = il_buffer->nTimeStamp;
82658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
82668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               //mark for droping
82678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               buffer->nFilledLen = 0;
82688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
82698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)",
82718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS,
82728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              il_buffer->nTimeStamp,ts_delta);
8273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //above code makes sure that delta b\w two consecutive frames is not
8275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            //greater than 16ms, slow-mo feature, so cap fps to max 60
8276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (current_framerate > 60 ) {
8277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                current_framerate = 60;
8278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
8279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
8280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // add current framerate to gralloc meta data
8282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_enable_android_native_buffers && m_out_mem_ptr) {
8283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_U32 buf_index = buffer - m_out_mem_ptr;
8284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
8285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         UPDATE_REFRESH_RATE, (void*)&current_framerate);
82868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
82878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
82888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (il_buffer) {
82898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            log_output_buffers(il_buffer);
82908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (dynamic_buf_mode) {
82918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                unsigned int nPortIndex = 0;
82928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
82938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                // Since we're passing around handles, adjust nFilledLen and nAllocLen
8295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                // to size of the handle. Do it _after_ log_output_buffers which
8296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                // requires the respective sizes to be accurate.
8297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
8299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                buffer->nFilledLen = buffer->nFilledLen ?
8300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        sizeof(struct VideoDecoderOutputMetaData) : 0;
83018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
83028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                //Clear graphic buffer handles in dynamic mode
8303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (nPortIndex < drv_ctx.op_buf.actualcount &&
8304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
8305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    native_buffer[nPortIndex].privatehandle = NULL;
8306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    native_buffer[nPortIndex].nativehandle = NULL;
8307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                } else {
8308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex);
8309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    return OMX_ErrorBadParameter;
8310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
83118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
831261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
83138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
831461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
831561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
831661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
83178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
831861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
831961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
8320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
83228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
8323f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (m_smoothstreaming_mode && m_out_mem_ptr) {
832450ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan        OMX_U32 buf_index = buffer - m_out_mem_ptr;
832550ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan        BufferDim_t dim;
8326f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        private_handle_t *private_handle = NULL;
8327f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        dim.sliceWidth = framesize.nWidth;
8328f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        dim.sliceHeight = framesize.nHeight;
8329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (buf_index < drv_ctx.op_buf.actualcount &&
8330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
8331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            native_buffer[buf_index].privatehandle)
8332f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            private_handle = native_buffer[buf_index].privatehandle;
8333099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan        if (private_handle) {
83348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d",
83358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                dim.sliceWidth, dim.sliceHeight);
8336099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan            setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
8337099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan        }
8338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
83398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
834050ad2f6e2dc3f0fca5f2b9a5d1e2f7b056133036Praveen Chavan
834161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
834561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE* buffer)
8346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
8347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int nBufferIndex = buffer - m_inp_mem_ptr;
8349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8350ee06e61ff49357884de5c6714828c263966895eePraveen Chavan    if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) {
83518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
835261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
8353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x",
8356f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            buffer, buffer->pBuffer, buffer->nFlags);
8357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pending_input_buffers--;
8358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
835961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
836061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL && input_flush_progress == false) {
83618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
836261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame = buffer;
836361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
836461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nTimeStamp = LLONG_MAX;
836561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            push_input_buffer (hComp);
836661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
83678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
836861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer->nFilledLen = 0;
83698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!m_input_free_q.insert_entry((unsigned long)buffer,
837061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL, (unsigned)NULL)) {
83718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
837261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
8373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
837461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_cb.EmptyBufferDone) {
8375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        buffer->nFilledLen = 0;
837661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (input_use_buffer == true) {
8377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
8378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
8379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /* Restore the FD that we over-wrote in ETB */
8381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_input_pass_buffer_fd) {
8382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd;
8383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
8384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
8386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
8388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::async_message_process (void *context, void* message)
8391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
839261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_vdec* omx = NULL;
839361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_msginfo *vdec_msg = NULL;
839461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
839561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer *v4l2_buf_ptr = NULL;
839661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_output_frameinfo *output_respbuf = NULL;
839761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=1;
839861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (context == NULL || message == NULL) {
83998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
840061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
840161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
840261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vdec_msg = (struct vdec_msginfo *)message;
840361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
840461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(context);
840561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
840661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (vdec_msg->msgcode) {
840761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
840861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_HW_ERROR:
840961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
841061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
841161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
841261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8413f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        case VDEC_MSG_EVT_HW_OVERLOAD:
8414f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
8415f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
8416f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            break;
8417f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8418f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        case VDEC_MSG_EVT_HW_UNSUPPORTED:
8419f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
8420f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
8421f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            break;
8422f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
842361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_START_DONE:
842461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
842561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_START_DONE);
842661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
842761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
842861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_STOP_DONE:
842961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
843061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_STOP_DONE);
843161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
843261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
843361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_RESUME_DONE:
843461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
843561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_RESUME_DONE);
843661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
843761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
843861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_PAUSE_DONE:
843961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
844061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
844161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
844261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
844361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
844461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
844561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
844661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
844761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
844861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
844961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
845061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
845161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_FLUSHED:
845261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
845361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
845461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
845561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan               vdec_msg->msgdata.input_frame_clientdata; */
845661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
845761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
8458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL ||
8459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) {
846061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr = NULL;
846161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg->status_code = VDEC_S_EFATAL;
8462f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                break;
8463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
846461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
8465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index;
8466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
846761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
846861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Unsupported input");
8469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
8470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
847161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
847261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
8473f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
847461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
847561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
8476f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
8477f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8478f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                DEBUG_PRINT_LOW("Decrement codec_config buffer counter");
8479f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                android_atomic_dec(&omx->m_queued_codec_config_count);
8480f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) &&
8481f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) {
8482f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer");
8483f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    sem_post(&omx->m_safe_flush);
8484f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
8485f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
8486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME ||
8487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
8488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
8489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
84908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code,
849161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_EBD);
849261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
849361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
849461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int64_t *timestamp;
849561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            timestamp = (int64_t *) malloc(sizeof(int64_t));
849661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (timestamp) {
849761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
84988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx->post_event ((unsigned long)timestamp, vdec_msg->status_code,
849961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
85008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
8501f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        (long long)vdec_msg->msgdata.output_frame.time_stamp);
850261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
850361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
850461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
850561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
850661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
8508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL ||
8510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) {
8511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               omxhdr = NULL;
8512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               vdec_msg->status_code = VDEC_S_EFATAL;
8513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               break;
8514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           }
8515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index;
8517f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8518f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_LOW("[RespBufDone] Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x) FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)",
8519f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp,
8520f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags,
8521f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    (unsigned int)vdec_msg->msgdata.output_frame.len,
8522f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg->msgdata.output_frame.framesize.left,
8523f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg->msgdata.output_frame.framesize.top,
8524f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg->msgdata.output_frame.framesize.right,
8525f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    vdec_msg->msgdata.output_frame.framesize.bottom);
852661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
852761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omxhdr && omxhdr->pOutputPortPrivate &&
85288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) &&
852961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
85308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) {
8531f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
853361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
853461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
853561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
853661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFlags = 0;
853761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
853961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
854061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        //rc = -1;
854161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
854261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr->nFilledLen) {
854361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
854461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
854561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
854661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
854761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
854861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
854961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
8550f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
8551f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
8552f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    }
855361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
855461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
855561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
8556576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
85578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) {
85588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF;
85598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
85608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
8561576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) {
85628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                         omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY;
8563576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                         DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d",
8564576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                                    omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd);
8565576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                    }
8566576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
856761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
8568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            !omx->output_flush_progress &&
856961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
85708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) {
8571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        unsigned int index = v4l2_buf_ptr->index;
8572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        unsigned int extra_idx = EXTRADATA_IDX(omx->drv_ctx.num_planes);
8573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        struct v4l2_plane *plane = v4l2_buf_ptr->m.planes;
85748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        omx->time_stamp_dts.remove_time_stamp(
85758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                omxhdr->nTimeStamp,
85768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
85778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                ?true:false);
8578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        plane[0].bytesused = 0;
8579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        plane[0].m.userptr =
8580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].bufferaddr -
8581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].offset;
8582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        plane[0].reserved[0] = omx->drv_ctx.ptr_outputbuffer[index].pmem_fd;
8583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        plane[0].reserved[1] = omx->drv_ctx.ptr_outputbuffer[index].offset;
8584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        plane[0].data_offset = 0;
8585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        v4l2_buf_ptr->flags = 0x0;
8586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
8587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            plane[extra_idx].bytesused = 0;
8588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            plane[extra_idx].length = omx->drv_ctx.extradata_info.buffer_size;
8589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            plane[extra_idx].m.userptr = (long unsigned int) (omx->drv_ctx.extradata_info.uaddr + index * omx->drv_ctx.extradata_info.buffer_size);
8590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifdef USE_ION
8591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            plane[extra_idx].reserved[0] = omx->drv_ctx.extradata_info.ion.fd_ion_data.fd;
8592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
8593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            plane[extra_idx].reserved[1] = v4l2_buf_ptr->index * omx->drv_ctx.extradata_info.buffer_size;
8594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            plane[extra_idx].data_offset = 0;
8595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        } else if (extra_idx >= VIDEO_MAX_PLANES) {
8596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
8597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            return -1;
8598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
8599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         DEBUG_PRINT_LOW("SENDING FTB TO F/W from async_message_process - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d",
8601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], omx->output_flush_progress);
8602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if(ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_QBUF, v4l2_buf_ptr)) {
8603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            DEBUG_PRINT_ERROR("Failed to queue buffer back to driver: %d, %d, %d", v4l2_buf_ptr->length, v4l2_buf_ptr->m.planes[0].reserved[0], v4l2_buf_ptr->m.planes[1].reserved[0]);
8604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            return -1;
8605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
860661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
860761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
860861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
860961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
861061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
861161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    vdec_msg->msgdata.output_frame.bufferaddr =
861261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
8613f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8614f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    /* Post event if resolution OR crop changed */
8615f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    /* filled length will be changed if resolution changed */
8616f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    /* Crop parameters can be changed even without resolution change */
8617f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    if (omxhdr->nFilledLen
8618f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        && ((omx->prev_n_filled_len != omxhdr->nFilledLen)
8619f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left)
8620f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top)
8621f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right)
8622f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom)
8623f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width)
8624f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) {
8625f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8626f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        DEBUG_PRINT_HIGH("Paramters Changed From: Len: %u, WxH: %dx%d, L: %u, T: %u, R: %u, B: %u --> Len: %u, WxH: %dx%d, L: %u, T: %u, R: %u, B: %u",
8627f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                omx->prev_n_filled_len,
8628f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                omx->drv_ctx.video_resolution.frame_width,
8629f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                omx->drv_ctx.video_resolution.frame_height,
8630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top,
8631f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom,
8632f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width,
8633f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                vdec_msg->msgdata.output_frame.picsize.frame_height,
8634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                vdec_msg->msgdata.output_frame.framesize.left,
8635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                vdec_msg->msgdata.output_frame.framesize.top,
8636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                vdec_msg->msgdata.output_frame.framesize.right,
8637f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                vdec_msg->msgdata.output_frame.framesize.bottom);
8638f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8639f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        omx->drv_ctx.video_resolution.frame_width =
8640f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                vdec_msg->msgdata.output_frame.picsize.frame_width;
8641f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        omx->drv_ctx.video_resolution.frame_height =
8642f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                vdec_msg->msgdata.output_frame.picsize.frame_height;
8643f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
8644f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            omx->drv_ctx.video_resolution.stride =
8645f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width);
8646f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            omx->drv_ctx.video_resolution.scan_lines =
8647f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height);
8648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
8649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            omx->drv_ctx.video_resolution.stride =
8650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width);
8651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            omx->drv_ctx.video_resolution.scan_lines =
8652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height);
8653f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        }
8654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
8655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        memcpy(&omx->drv_ctx.frame_size,
8656f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                &vdec_msg->msgdata.output_frame.framesize,
8657f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                sizeof(struct vdec_framesize));
8658f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8659f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                        omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX,
8660f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                                OMX_IndexConfigCommonOutputCrop,
8661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
8662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
8663f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
866461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (omxhdr->nFilledLen)
866561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        omx->prev_n_filled_len = omxhdr->nFilledLen;
866661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
866761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf = (struct vdec_output_frameinfo *)\
866861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             omxhdr->pOutputPortPrivate;
8669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (!output_respbuf) {
8670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      DEBUG_PRINT_ERROR("async_message_process: invalid output buf received");
8671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      return -1;
8672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
867361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->len = vdec_msg->msgdata.output_frame.len;
867461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
8675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
867661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
867761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_I;
867861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
867961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
868061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_P;
868161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
868261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
868361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        output_respbuf->pic_type = PICTURE_TYPE_B;
868461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
8685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (omxhdr && omxhdr->nFilledLen) {
8686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        omx->request_perf_level(VIDC_NOMINAL);
8687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
86880c95c078771f637924fa7ae01b0d90df285dde64Ray Essick                    if (omx->output_use_buffer && omxhdr->pBuffer &&
8689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        vdec_msg->msgdata.output_frame.bufferaddr)
869061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ( omxhdr->pBuffer, (void *)
869161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
869261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                 (unsigned long)vdec_msg->msgdata.output_frame.offset),
869361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                vdec_msg->msgdata.output_frame.len);
8694f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                } else {
8695f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u",
8696f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            (unsigned int)vdec_msg->msgdata.output_frame.len,
8697f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            omxhdr->nAllocLen, omx->prev_n_filled_len);
869861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omxhdr->nFilledLen = 0;
8699f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                }
8700f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
87018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code,
870261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_FBD);
8703f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
8704f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) {
87058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                omx->post_event ((unsigned long)NULL, vdec_msg->status_code,
870661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_EOS_DONE);
8707f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            } else {
870861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
870961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
8710f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
871161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
871261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VDEC_MSG_EVT_CONFIG_CHANGED:
87138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Port settings changed");
8714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
8715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
871661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
871761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
8718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            omx->request_perf_level(VIDC_NOMINAL);
871961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
872061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
872161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
872261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
872361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
8724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
872761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_HANDLETYPE hComp,
872861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *buffer
872961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        )
8730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
873161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned address,p2,id;
87328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Empty this arbitrary");
873361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
873461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
873561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
873661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
87378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
87388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld",
87398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp);
874061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
874161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return zero length and not an EOS buffer */
874261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* return buffer if input flush in progress */
874361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
874461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
87458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
874661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
874761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
874861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
874961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
875061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame == NULL) {
87518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
875261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = buffer;
87538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
875461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        push_input_buffer (hComp);
875561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
87568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
87578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL,
875861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (unsigned)NULL)) {
875961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
876061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8763f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
8764f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        codec_config_flag = false;
8765f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
876661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
8770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
87718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long address,p2,id;
877261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
877361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
877461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pdest_frame == NULL || psource_frame == NULL) {
877561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
877661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame == NULL) {
87778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
877861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_free_q.m_size) {
877961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_free_q.pop_entry(&address,&p2,&id);
878061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
878161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen = 0;
878261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nTimeStamp = LLONG_MAX;
87838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
878461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
878561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
878761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if we have a destination buffer*/
878861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame == NULL) {
87898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Get a source buffer from the queue");
879061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
879161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
879261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
87938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
879461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
87958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
87968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
8797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
879861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
879961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
880161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
8802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
880361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
880461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_type_parse) {
880561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG4:
880661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H263:
880761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_MPEG2:
880861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret =  push_input_sc_codec(hComp);
880961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
881061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_H264:
881161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_h264(hComp);
881261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
88138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            case CODEC_TYPE_HEVC:
88148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                ret = push_input_hevc(hComp);
88158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                break;
881661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case CODEC_TYPE_VC1:
881761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ret = push_input_vc1(hComp);
881861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
881961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
882061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
882161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
882261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret != OMX_ErrorNone) {
88238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
882461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx_report_error ();
882561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
882661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
882961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
8830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
8833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
883461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
883561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
88368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long address = 0, p2 = 0, id = 0;
8837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld",
883961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame,psource_frame->nTimeStamp);
884061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_frame_parser.parse_sc_frame(psource_frame,
884161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame,&partial_frame) == -1) {
88428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
884361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
8844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
884561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
884661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
88478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Frame size %u source %p frame count %d",
88488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count);
884961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
885061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp);
885261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*First Parsed buffer will have only header Hence skip*/
885361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frame_count == 0) {
88548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
885561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
885661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
885761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    codec_type_parse == CODEC_TYPE_DIVX) {
885861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4StreamType psBits;
885961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
886061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psBits.numBytes = pdest_frame->nFilledLen;
886161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                mp4_headerparser.parseHeader(&psBits);
886261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
886361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
886461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_count++;
886561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
886661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
886761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame->nFilledLen) {
886861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
886961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
887061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
887161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
887261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
887361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
887461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
887561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_input_free_q.m_size) {
887661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_input_free_q.pop_entry(&address,&p2,&id);
887761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
887861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen = 0;
887961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
888061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
88818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
88828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL,
888361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (unsigned)NULL);
888461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
888561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
888661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
888761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
88888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen);
888961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
889061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pdest_frame->nAllocLen ==
889161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFilledLen + pdest_frame->nOffset) {
88928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
889361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
889461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
889761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (psource_frame->nFilledLen == 0) {
889861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
889961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
890061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame->nFlags |= psource_frame->nFlags;
89018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld",
89028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
89038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
89048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
890561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
890661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
890761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
890861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
890961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
891061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
891161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
89128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
891361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
891461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
891561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
891661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (generate_ebd) {
89178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
891861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
891961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = NULL;
892061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
892161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_input_pending_q.m_size) {
89228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
892361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_input_pending_q.pop_entry(&address,&p2,&id);
892461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
89258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
892661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        psource_frame->nTimeStamp);
89278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
89288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
892961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
893061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
893161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
893261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
8933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
8934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
8935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
8936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
893761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 partial_frame = 1;
89388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long address = 0, p2 = 0, id = 0;
893961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
894061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
894161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
894261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
89438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
894461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
8945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
89468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u "
89478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal);
89488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen);
894961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
895061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        look_ahead_nal = false;
895161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
895261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen) {
895361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
895461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
895561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
89568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
895761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFilledLen = 0;
895861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
89598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
896061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
896161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
896329caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan
896429caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan    /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result
896529caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan       in EOS flag getting associated with the destination
896629caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan    */
896729caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan    if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) &&
896829caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan            pdest_frame->nFilledLen) {
896929caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan        DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'");
897029caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan        generate_ebd = OMX_FALSE;
897129caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan    }
897229caf5e1d31befc442b606d77e6c170581a4bc63Praveen Chavan
897361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (nal_length == 0) {
89748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
897561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
897661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
89778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
897861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
897961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
898061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
89818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
898261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
898361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
89848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
898561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
898661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
8987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
8988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
898961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (partial_frame == 0) {
899061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
89918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
899261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nal_count++;
899361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
899461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
899561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
89968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen);
899761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (h264_scratch.nFilledLen) {
899861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
899961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        NALU_TYPE_SPS);
9000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
900161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
900261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
900361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
900461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
900561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // If timeinfo is present frame info from SEI is already processed
900661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
900761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
9008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
900961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
901061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_count++;
901161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
901261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nTimeStamp = h264_last_au_ts;
901361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFlags = h264_last_au_flags;
9014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef PANSCAN_HDLR
901561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
901661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_parser->update_panscan_data(h264_last_au_ts);
9017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
901861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
901961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
902061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
902161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = h264_scratch.nTimeStamp;
902261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_flags = h264_scratch.nFlags;
9023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
902461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
902561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
902661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (!VALID_TS(h264_last_au_ts))
902761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_last_au_ts = ts_in_sei;
902861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
9029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
903061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else
903161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_last_au_ts = LLONG_MAX;
903261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
903361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
903461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!isNewFrame) {
903561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
903661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
90378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u",
90388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            (unsigned int)h264_scratch.nFilledLen);
903961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
904061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
904161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
904261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
904361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
904461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    h264_scratch.nFilledLen = 0;
904561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
90468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
904761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
904861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
9049f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan            } else if(h264_scratch.nFilledLen) {
905061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                look_ahead_nal = true;
90518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu",
90528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
90538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
90548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
905561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
905661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
90578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
905861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    look_ahead_nal = false;
905961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
906061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            h264_scratch.nFilledLen) {
906161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
906261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
906361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
906461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen = 0;
906561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
90668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
906761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
906861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
906961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
907061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
90718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Reset the EOS Flag");
907261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
907361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
907461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    /*Push the frame to the Decoder*/
907561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
907661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorBadParameter;
907761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
907861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    //frame_count++;
907961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame = NULL;
908061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_input_free_q.m_size) {
908161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_input_free_q.pop_entry(&address,&p2,&id);
908261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
90838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
908461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFilledLen = 0;
908561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nFlags = 0;
908661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
908761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
908861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
908961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
9090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
909161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
90928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen);
909361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Check if Destination Buffer is full*/
909461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (h264_scratch.nAllocLen ==
909561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
90968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
909761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorStreamCorrupt;
9098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
9099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
910161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!psource_frame->nFilledLen) {
91028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
9103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
910461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
910561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pdest_frame) {
91068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
910761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
910861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        h264_scratch.nFilledLen) {
9109f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                    if(pdest_frame->nFilledLen == 0) {
9110f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        /* No residual frame from before, send whatever
9111f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                         * we have left */
9112f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
9113f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                                h264_scratch.pBuffer, h264_scratch.nFilledLen);
9114f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
9115f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        h264_scratch.nFilledLen = 0;
9116f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
9117f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                    } else {
9118f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
9119f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        if(!isNewFrame) {
9120f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                            /* Have a residual frame, but we know that the
9121f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             * AU in this frame is belonging to whatever
9122f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             * frame we had left over.  So append it */
9123f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
9124f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
9125f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
9126f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             h264_scratch.nFilledLen = 0;
9127f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                             if (h264_last_au_ts != LLONG_MAX)
9128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 pdest_frame->nTimeStamp = h264_last_au_ts;
9129f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        } else {
9130f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                            /* Completely new frame, let's just push what
9131f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             * we have now.  The resulting EBD would trigger
9132f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                             * another push */
9133f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                            generate_ebd = OMX_FALSE;
9134f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                            pdest_frame->nTimeStamp = h264_last_au_ts;
9135f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                            h264_last_au_ts = h264_scratch.nTimeStamp;
9136f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                        }
9137f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                    }
913861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
91398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
914061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
914161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
9142f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan
9143f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                /* Iff we coalesced two buffers, inherit the flags of both bufs */
9144f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                if(generate_ebd == OMX_TRUE) {
9145f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                     pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
9146f1b92e4ed363dcda40ea06783590d63b733ec659Praveen Chavan                }
9147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
91488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu",
91498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
91508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
9151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
915261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
915361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
915461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!VALID_TS(pdest_frame->nTimeStamp))
915561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        pdest_frame->nTimeStamp = ts_in_sei;
915661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
9157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
915861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Push the frame to the Decoder*/
915961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
916061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadParameter;
916161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
916261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                frame_count++;
916361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pdest_frame = NULL;
916461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
91658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
91668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
916761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                generate_ebd = OMX_FALSE;
916861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
916961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
917061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
917161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
917261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
917361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        psource_frame = NULL;
917461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_input_pending_q.m_size) {
91758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
917661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_input_pending_q.pop_entry(&address,&p2,&id);
917761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
91788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u",
91798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
91808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
91818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
91828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorNone;
91838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
91848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
91858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
91868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
91878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
91888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
91898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
91908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (pDst->nTimeStamp == LLONG_MAX) {
91918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pDst->nTimeStamp = pSrc->nTimeStamp;
91928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp);
91938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
91948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pDst->nFilledLen += pSrc->nFilledLen;
91958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        pSrc->nFilledLen = 0;
91968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
91978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
91988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = OMX_ErrorBadParameter;
91998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return rc;
92018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
92028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen ChavanOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp)
92048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
92058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_U32 partial_frame = 1;
92068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long address,p2,id;
92078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BOOL isNewFrame = OMX_FALSE;
92088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_BOOL generate_ebd = OMX_TRUE;
92098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_ERRORTYPE rc = OMX_ErrorNone;
92108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (h264_scratch.pBuffer == NULL) {
92118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
92128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return OMX_ErrorBadParameter;
92138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \
92168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            pdest_frame nFilledLen %u nTimeStamp %lld",
92178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
92188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (h264_scratch.nFilledLen && look_ahead_nal) {
92208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        look_ahead_nal = false;
92218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        rc = copy_buffer(pdest_frame, &h264_scratch);
92228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (rc != OMX_ErrorNone) {
92238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return rc;
92248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
92258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (nal_length == 0) {
92288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.parse_sc_frame(psource_frame,
92298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
92308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
92318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
92328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
92338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
92348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
92358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_frame_parser.parse_h264_nallength(psource_frame,
92368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    &h264_scratch,&partial_frame) == -1) {
92378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
92388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorBadParameter;
92398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
92408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
92418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (partial_frame == 0) {
92438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
92448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
92458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            nal_count++;
92468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
92478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            h264_scratch.nFlags = psource_frame->nFlags;
92488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
92498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen);
92508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (h264_scratch.nFilledLen) {
92518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame);
92528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nal_count++;
92538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
92548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
92558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (!isNewFrame) {
92568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \
92578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld",
92588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp,
92598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
92608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
92618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (rc != OMX_ErrorNone) {
92628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return rc;
92638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
92648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
92658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                look_ahead_nal = true;
92668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (pdest_frame->nFilledLen == 0) {
92678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    look_ahead_nal = false;
92688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
92698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    rc = copy_buffer(pdest_frame, &h264_scratch);
92708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (rc != OMX_ErrorNone) {
92718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorBadParameter;
92728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
92738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                } else {
92748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
92758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
92768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
92778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \
92788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            nTimeStamp %lld, look_ahead_nal in h264_scratch \
92798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            nFilledLen %u nTimeStamp %lld",
92808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            frame_count++, (unsigned int)pdest_frame->nFilledLen,
92818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen,
92828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            h264_scratch.nTimeStamp);
92838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
92848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return OMX_ErrorBadParameter;
92858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
92868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    pdest_frame = NULL;
92878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (m_input_free_q.m_size) {
92888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        m_input_free_q.pop_entry(&address, &p2, &id);
92898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
92908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame);
92918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nFilledLen = 0;
92928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nFlags = 0;
92938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame->nTimeStamp = LLONG_MAX;
92948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
92958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
92968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
92978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
92988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
92998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \
93008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \
93018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                nFilledLen %u nTimeStamp %lld",
93028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp,
93038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp,
93048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
93058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (h264_scratch.nAllocLen ==
93078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                h264_scratch.nFilledLen + h264_scratch.nOffset) {
93088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
93098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return OMX_ErrorStreamCorrupt;
93108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
93118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
93128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!psource_frame->nFilledLen) {
93148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame);
93158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
93168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (pdest_frame) {
93178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
93188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                rc = copy_buffer(pdest_frame, &h264_scratch);
93198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if ( rc != OMX_ErrorNone ) {
93208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return rc;
93218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
93228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
93238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
93248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld",
93258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
93268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
93278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    return OMX_ErrorBadParameter;
93288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
93298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                frame_count++;
93308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                pdest_frame = NULL;
93318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
93328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
93338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
93348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                generate_ebd = OMX_FALSE;
93358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
93368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
93378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
93388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
93398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (generate_ebd && !psource_frame->nFilledLen) {
93408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame);
93418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        psource_frame = NULL;
93428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_input_pending_q.m_size) {
93438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_input_pending_q.pop_entry(&address, &p2, &id);
93448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            psource_frame = (OMX_BUFFERHEADERTYPE *)address;
93458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld",
93468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp);
934761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
934861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
934961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
9350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9352e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp)
9353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
9354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U8 *buf, *pdest;
9355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 partial_frame = 1;
9356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_U32 buf_len, dest_len;
9357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
935861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (first_frame == 0) {
9359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        first_frame = 1;
93608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
936161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!m_vendor_config.pData) {
93628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
9363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buf = psource_frame->pBuffer;
9364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            buf_len = psource_frame->nFilledLen;
9365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
936761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    VC1_SP_MP_START_CODE) {
9368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_vc1_profile = VC1_SP_MP_RCV;
936961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
9370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                m_vc1_profile = VC1_AP;
937161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
93728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
9373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorStreamCorrupt;
9374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
937561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
9376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
9377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nOffset;
9378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
937961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pdest_frame->nOffset);
9380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
938161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dest_len < m_vendor_config.nDataSize) {
93828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Destination buffer full");
9383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorBadParameter;
938461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
9385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
9386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
9387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
9388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
9389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
939161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_vc1_profile) {
9392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case VC1_AP:
93938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
939461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
93958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
9396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                return OMX_ErrorBadParameter;
9397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
939861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
9399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        case VC1_SP_MP_RCV:
9401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        default:
94028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
9403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorBadParameter;
9404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
9406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
94086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifndef USE_ION
94096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
941061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment)
94116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
941261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
941361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = buffer_size;
941461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
941561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align < 4096) {
941661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 4096;
941761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
941861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
94198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
942061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
942161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
942261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
942361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
94246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
94256eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
9426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
9427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
942861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
942961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ion_fd_data *fd_data, int flag)
9430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
943161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int fd = -EINVAL;
943261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = -EINVAL;
943361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ion_dev_flag;
943461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct vdec_ion ion_buf_info;
943561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!alloc_data || buffer_size <= 0 || !fd_data) {
94368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
943761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -EINVAL;
943861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
943961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ion_dev_flag = O_RDONLY;
944061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd = open (MEM_DEVICE, ion_dev_flag);
944161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
94428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
944361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
944461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
9445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
9446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    alloc_data->flags = flag;
944761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->len = buffer_size;
944861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    alloc_data->align = clip2(alignment);
944961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (alloc_data->align < 4096) {
945061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        alloc_data->align = 4096;
945161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
945261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
9453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
9454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (secure_mode && (alloc_data->flags & ION_SECURE)) {
9455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
9456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
9457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
9458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    /* Use secure display cma heap for obvious reasons. */
9459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) {
9460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID);
9461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
9462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
946361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
946461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !alloc_data->handle) {
94658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed");
94668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        alloc_data->handle = 0;
946761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(fd);
946861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
946961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return fd;
947061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
947161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fd_data->handle = alloc_data->handle;
947261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(fd,ION_IOC_MAP,fd_data);
947361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
94748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
947561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_alloc_data = *alloc_data;
947661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.ion_device_fd = fd;
947761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ion_buf_info.fd_ion_data = *fd_data;
947861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&ion_buf_info);
947961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd_data->fd =-1;
948061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fd = -ENOMEM;
948161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
948261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
9483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return fd;
9484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
948661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
948761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
948861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
948961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!buf_ion_info) {
94908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
949161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
949261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
949361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
949461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &buf_ion_info->ion_alloc_data.handle)) {
94958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION: free failed" );
949661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
949761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    close(buf_ion_info->ion_device_fd);
949861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->ion_device_fd = -1;
94998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    buf_ion_info->ion_alloc_data.handle = 0;
950061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_ion_info->fd_ion_data.fd = -1;
9501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
9503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_output_buffer_header()
9504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
95058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
950661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    output_use_buffer = false;
950761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ouput_egl_buffers = false;
950861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
950961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_out_mem_ptr) {
951061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_out_mem_ptr);
951161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = NULL;
951261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
951361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
951461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_platform_list) {
951561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(m_platform_list);
951661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_platform_list = NULL;
951761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
951861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
951961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_respbuffer) {
952061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_respbuffer);
952161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = NULL;
952261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
952361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_outputbuffer) {
952461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_outputbuffer);
952561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = NULL;
952661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
9527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
9528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.op_buf_ion_info) {
95298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free o/p ion context");
953061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.op_buf_ion_info);
9531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.op_buf_ion_info = NULL;
9532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
9534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    buf_ref_remove();
9535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::free_input_buffer_header()
9538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
9539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    input_use_buffer = false;
954061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (arbitrary_bytes) {
954161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_inp_heap_ptr) {
95428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input Heap Pointer");
954361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_inp_heap_ptr);
954461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_inp_heap_ptr = NULL;
954561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
954661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
954761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_phdr_pmem_ptr) {
95488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Free input pmem header Pointer");
954961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free (m_phdr_pmem_ptr);
955061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_phdr_pmem_ptr = NULL;
955161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
9552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
955361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_inp_mem_ptr) {
95548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free input pmem Pointer area");
955561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (m_inp_mem_ptr);
955661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_inp_mem_ptr = NULL;
955761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
9558a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    /* We just freed all the buffer headers, every thing in m_input_free_q,
95598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan     * m_input_pending_q, pdest_frame, and psource_frame is now invalid */
956074258d54fc1c909efc0cf7ebb302e54e70067a20Praveen Chavan    while (m_input_free_q.m_size) {
95618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long address, p2, id;
956274258d54fc1c909efc0cf7ebb302e54e70067a20Praveen Chavan        m_input_free_q.pop_entry(&address, &p2, &id);
956374258d54fc1c909efc0cf7ebb302e54e70067a20Praveen Chavan    }
9564a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan    while (m_input_pending_q.m_size) {
95658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long address, p2, id;
9566a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan        m_input_pending_q.pop_entry(&address, &p2, &id);
9567a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan    }
9568a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    pdest_frame = NULL;
9569a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    psource_frame = NULL;
957061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.ptr_inputbuffer) {
95718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free Driver Context pointer");
957261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free (drv_ctx.ptr_inputbuffer);
957361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_inputbuffer = NULL;
9574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
9576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (drv_ctx.ip_buf_ion_info) {
95778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Free ion context");
957861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free(drv_ctx.ip_buf_ion_info);
9579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        drv_ctx.ip_buf_ion_info = NULL;
9580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
9582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
95836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
95846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalint omx_vdec::stream_off(OMX_U32 port)
9585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
958661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type btype;
958761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
958861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_ports v4l2_port = OUTPUT_PORT;
958961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
959061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == OMX_CORE_INPUT_PORT_INDEX) {
959161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
959261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = OUTPUT_PORT;
959361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
959461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
959561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        v4l2_port = CAPTURE_PORT;
959661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == OMX_ALL) {
959761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
959861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
959961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
960061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc_input)
960161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_input;
960261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
960361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return rc_output;
960461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
960561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
960661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[v4l2_port]) {
960761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // already streamed off, warn and move on
960861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
960961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " which is already streamed off", v4l2_port);
961061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 0;
961161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
961261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
961361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
961461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
961561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
961661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
961761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
96188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
961961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
962061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[v4l2_port] = false;
962161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
962261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
962361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
9624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
9627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
962861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
962961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
9630f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0;
96318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned int final_extra_data_size = 0;
963261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
963361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret = 0;
9634f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
9635f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
963661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
963761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 1;
963861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
963961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
964061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
964161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
964261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
964361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
964461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
964561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
964661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
964761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
9648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
964961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet==OMX_ErrorNone) {
965061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
9651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
965261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
965361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
965461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
965561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
965661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
965761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
965861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->actualcount = bufreq.count;
965961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->mincount = bufreq.count;
96608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
9661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9662f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
9663f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
966461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
966561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
966661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
966761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
966861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
966961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
967061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    update_resolution(fmt.fmt.pix_mp.width,
967161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.height,
967261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.plane_fmt[0].bytesperline,
967361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
967461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
967561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
96768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
967761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
967861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
967961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*TODO: How to handle this case */
968061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
968161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorInsufficientResources;
968261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
968361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
968461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
968561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = is_video_session_supported();
968661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet)
968761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return eRet;
968861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
968961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
969061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = buffer_prop->buffer_size;
969161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
969261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
969361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
969461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
96958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
969661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
969761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
96988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
9699f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        default_extra_data_size = VENUS_EXTRADATA_SIZE(
9700f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                drv_ctx.video_resolution.frame_height,
9701f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                drv_ctx.video_resolution.frame_width);
9702f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        final_extra_data_size = extra_data_size > default_extra_data_size ?
9703f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            extra_data_size : default_extra_data_size;
9704f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
9705f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) &
9706f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (~(buffer_prop->alignment - 1));
9707f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
97088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size;
970961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.extradata_info.count = buffer_prop->actualcount;
97108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.extradata_info.buffer_size = final_extra_data_size;
9711f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (!secure_mode)
9712f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            buf_size += final_extra_data_size;
971361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
9714f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)",
9715f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size);
97168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (extra_data_size)
97178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)",
97188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size);
97198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
972061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (in_reconfig) // BufReq will be set to driver when port is disabled
972161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
972261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (buf_size != buffer_prop->buffer_size) {
972361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_prop->buffer_size = buf_size;
972461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = set_buffer_req(buffer_prop);
972561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
9726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9727f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)",
9728f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
972961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
9730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
9733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
973461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
973561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned buf_size = 0;
973661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
973761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
973861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
9739f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)",
9740f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
974161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
974261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_size != buffer_prop->buffer_size) {
9743f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)",
9744f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (unsigned int)buffer_prop->buffer_size, buf_size);
974561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadParameter;
974661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
9747f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        memset(&fmt, 0x0, sizeof(struct v4l2_format));
974861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
974961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
9750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
975161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
975261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
975361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
975461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = output_capability;
975561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
975661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
975761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            fmt.fmt.pix_mp.pixelformat = capture_capability;
975861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
975961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
976061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
976161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
976261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
976361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
976461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
976561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
976661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
976761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
976861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
976961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
977061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.count = buffer_prop->actualcount;
977161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
977261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
977361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
977461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
977561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
977661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorBadParameter;
977761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
977861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
977961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eRet==OMX_ErrorNone) {
978061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
978161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
978261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
978361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
978461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
978561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /*TODO: How to handle this case */
978661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
978761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (bufreq.count < buffer_prop->actualcount) {
978861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
978961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
979061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    buffer_prop->actualcount, bufreq.count);
979161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet = OMX_ErrorInsufficientResources;
979261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
979361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!client_buffers.update_buffer_req()) {
979461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
979561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                eRet = OMX_ErrorInsufficientResources;
979661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
979761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
97986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
979961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
9800dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
9801dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
9802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_picture_resolution()
9803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
980461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
980561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
9806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
9809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
981061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
9811f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    struct v4l2_format fmt;
981261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!portDefn) {
981361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
981461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
98158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
981661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
981716ee85d1d456a4b694fd32baa5f52341e638b5d8Praveen Chavan    portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
981861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    portDefn->eDomain    = OMX_PortDomainVideo;
981961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.frame_rate.fps_denominator > 0)
98208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator /
98218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format
982261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
98238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Divide by zero");
982461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
9825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
9826f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    memset(&fmt, 0x0, sizeof(struct v4l2_format));
982761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (0 == portDefn->nPortIndex) {
982861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirInput;
982961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
983061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
983161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
983261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
983361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = eCompressionFormat;
983461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_inp_bEnabled;
983561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_inp_bPopulated;
9836f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
9837f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
9838f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        fmt.fmt.pix_mp.pixelformat = output_capability;
983961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (1 == portDefn->nPortIndex) {
984061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned int buf_size = 0;
984161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.update_buffer_req()) {
98428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
984361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
984461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
984561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_buffer_req(buf_size)) {
98468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("update buffer requirements");
984761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
984861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
984961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferSize = buf_size;
985061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir =  OMX_DirOutput;
985161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
985261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
985361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
985461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bEnabled   = m_out_bEnabled;
985561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->bPopulated = m_out_bPopulated;
985661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
98578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error in getting color format");
985861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorHardware;
985961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
9860f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
9861f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        fmt.fmt.pix_mp.pixelformat = capture_capability;
986261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
986361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        portDefn->eDir = OMX_DirMax;
986461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
986561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (int)portDefn->nPortIndex);
986661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorBadPortIndex;
986761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
9868f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (is_down_scalar_enabled) {
9869f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        int ret = 0;
9870f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
9871f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (ret) {
9872f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("update_portdef : Error in getting port resolution");
9873f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            return OMX_ErrorHardware;
9874f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        } else {
9875f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            portDefn->format.video.nFrameWidth = fmt.fmt.pix_mp.width;
9876f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            portDefn->format.video.nFrameHeight = fmt.fmt.pix_mp.height;
9877f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            portDefn->format.video.nStride = fmt.fmt.pix_mp.plane_fmt[0].bytesperline;
9878f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            portDefn->format.video.nSliceHeight = fmt.fmt.pix_mp.plane_fmt[0].reserved[0];
9879f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
9880f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    } else {
9881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
9882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
9883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
9884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
9885f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
9886f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
98878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
98888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
9889f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan           portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16);
9890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin           portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height;
98918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
98928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d "
98938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u",
98948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->nPortIndex,
98958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.nFrameWidth,
98968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.nFrameHeight,
98978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (int)portDefn->format.video.nStride,
98988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.nSliceHeight,
98998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.eColorFormat,
99008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->nBufferSize,
99018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->nBufferCountActual);
9902073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava
99038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return eRet;
9904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
9905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
9906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::allocate_output_headers()
9907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
990861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
990961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
991061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned i= 0;
991161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
991261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_out_mem_ptr) {
99138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
991461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nBufHdrSize        = 0;
991561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformEntrySize = 0;
991661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPlatformListSize  = 0;
991761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int nPMEMInfoSize = 0;
991861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
991961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
992061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
992161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
992361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf.actualcount);
992461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBufHdrSize        = drv_ctx.op_buf.actualcount *
992561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_BUFFERHEADERTYPE);
992661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
992761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
992861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
992961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformListSize  = drv_ctx.op_buf.actualcount *
993061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
993161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
993261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
993361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
9934f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
9935f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
993661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,
993761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPlatformListSize);
9938f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize,
993961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_bm_count);
994061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
994161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // Alloc mem for platform specific info
994261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        char *pPtr=NULL;
994361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
994461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nPMEMInfoSize,1);
994561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
994661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       calloc (sizeof(struct vdec_bufferpayload),
994761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                               drv_ctx.op_buf.actualcount);
994861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
994961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                     calloc (sizeof (struct vdec_output_frameinfo),
995061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             drv_ctx.op_buf.actualcount);
9951f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
9952f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer");
9953f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            return OMX_ErrorInsufficientResources;
9954f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
9955f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
9956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
995761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
995861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
9959f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (!drv_ctx.op_buf_ion_info) {
9960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
9961f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            return OMX_ErrorInsufficientResources;
9962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
9963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
9964576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        if (dynamic_buf_mode) {
9965576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            out_dynamic_list = (struct dynamic_buf_list *) \
9966576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount);
9967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (out_dynamic_list) {
9968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++)
9969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  out_dynamic_list[i].dup_fd = -1;
9970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
9971576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        }
9972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
997361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
997461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                && drv_ctx.ptr_respbuffer) {
997561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufHdr          =  m_out_mem_ptr;
997661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
997761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
997861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_list)  + nPlatformListSize);
997961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
998061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (((char *) m_platform_entry) + nPlatformEntrySize);
998161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformList   = m_platform_list;
998261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPlatformEntry  = m_platform_entry;
998361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pPMEMInfo       = m_pmem_info;
998461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
998661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
998761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            // Settting the entire storage nicely
99888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
998961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr,pPlatformEntry);
99908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
999161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
999261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
999361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
999461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Set the values when we determine the right HxW param
999561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nAllocLen          = 0;
999661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nFilledLen         = 0;
999761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pAppPrivate        = NULL;
999861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
999961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1000061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry->entry      = pPMEMInfo;
1000161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Initialize the Platform List
1000261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->nEntries    = 1;
1000361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList->entryList   = pPlatformEntry;
1000461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Keep pBuffer NULL till vdec is opened
1000561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pBuffer            = NULL;
1000661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo->offset          =  0;
10007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                pPMEMInfo->pmem_fd = -1;
1000861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pPlatformPrivate = pPlatformList;
1000961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
10010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
1001161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
10012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1001361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*Create a mapping between buffers*/
1001461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
1001561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
1001661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    &drv_ctx.ptr_outputbuffer[i];
1001761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                // Move the buffer and buffer header pointers
1001861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                bufHdr++;
1001961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPMEMInfo++;
1002061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformEntry++;
1002161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPlatformList++;
1002261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1002361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
100248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
1002561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_out_mem_ptr, pPtr);
1002661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_out_mem_ptr) {
1002761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(m_out_mem_ptr);
1002861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr = NULL;
1002961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1003061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (pPtr) {
1003161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(pPtr);
1003261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pPtr = NULL;
1003361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1003461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_outputbuffer) {
1003561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_outputbuffer);
1003661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_outputbuffer = NULL;
1003761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1003861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.ptr_respbuffer) {
1003961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.ptr_respbuffer);
1004061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.ptr_respbuffer = NULL;
1004161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
10042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
1004361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (drv_ctx.op_buf_ion_info) {
100448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("Free o/p ion context");
1004561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                free(drv_ctx.op_buf_ion_info);
1004661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.op_buf_ion_info = NULL;
1004761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
10048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1004961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eRet =  OMX_ErrorInsufficientResources;
1005061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1005161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
1005261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet =  OMX_ErrorInsufficientResources;
10053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1005461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
10055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
10057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::complete_pending_buffer_done_cbs()
10058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
100598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long p1, p2, ident;
1006061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_cmd_queue tmp_q, pending_bd_q;
1006161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&m_lock);
1006261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE FDB from ftb queue
1006361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_ftb_q.m_size) {
1006461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.pop_entry(&p1,&p2,&ident);
1006561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_FBD) {
1006661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
1006761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
1006861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
1006961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
10070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1007161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to ftb queue
1007261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
1007361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
1007461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_ftb_q.insert_entry(p1,p2,ident);
10075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1007661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // pop all pending GENERATE EDB from etb queue
1007761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (m_etb_q.m_size) {
1007861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.pop_entry(&p1,&p2,&ident);
1007961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ident == OMX_COMPONENT_GENERATE_EBD) {
1008061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pending_bd_q.insert_entry(p1,p2,ident);
1008161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
1008261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            tmp_q.insert_entry(p1,p2,ident);
10083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1008461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1008561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //return all non GENERATE FDB to etb queue
1008661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (tmp_q.m_size) {
1008761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        tmp_q.pop_entry(&p1,&p2,&ident);
1008861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_etb_q.insert_entry(p1,p2,ident);
1008961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1009061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&m_lock);
1009161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // process all pending buffer dones
1009261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (pending_bd_q.m_size) {
1009361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pending_bd_q.pop_entry(&p1,&p2,&ident);
1009461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (ident) {
1009561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_EBD:
1009661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
100978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
1009861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
1009961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
1010061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
10101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1010261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_COMPONENT_GENERATE_FBD:
1010361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
101048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
1010561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx_report_error ();
1010661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
1010761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
10108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
10109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
10110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
10112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
10113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1011461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_frame_interval = 0;
1011561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
1011661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            && llabs(act_timestamp - prev_ts) > 2000) {
10117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ?
10118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual);
10119f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (new_frame_interval != frm_int || frm_int == 0) {
1012061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frm_int = new_frame_interval;
1012161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (frm_int) {
1012261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_numerator = 1e6;
1012361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                drv_ctx.frame_rate.fps_denominator = frm_int;
101248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
101258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
1012661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        (float)drv_ctx.frame_rate.fps_denominator);
10127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_perf_control.request_cores(frm_int);
1012861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* We need to report the difference between this FBD and the previous FBD
1012961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 * back to the driver for clock scaling purposes. */
1013061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_outputparm oparm;
1013161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /*XXX: we're providing timing info as seconds per frame rather than frames
1013261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 * per second.*/
1013361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
1013461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
1013561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1013661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                struct v4l2_streamparm sparm;
1013761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1013861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                sparm.parm.output = oparm;
1013961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
1014061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
1014161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            performance might be affected");
1014261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
1014361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1014461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1014561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1014661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1014761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prev_ts = act_timestamp;
10148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
10150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
10151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1015261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rst_prev_ts && VALID_TS(act_timestamp)) {
1015361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        prev_ts = act_timestamp;
10154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        prev_ts_actual = act_timestamp;
1015561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = false;
1015661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (VALID_TS(prev_ts)) {
1015761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool codec_cond = (drv_ctx.timestamp_adjust)?
10158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) :
10159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual);
10160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             prev_ts_actual = act_timestamp; //unadjusted previous timestamp
1016161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (frm_int > 0 && codec_cond) {
1016261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
1016361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            act_timestamp = prev_ts + frm_int;
1016461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
1016561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            prev_ts = act_timestamp;
10166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        } else {
10167f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) {
10168f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                // ensure that timestamps can never step backwards when in display order
10169f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                act_timestamp = prev_ts;
10170f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
1017161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            set_frame_rate(act_timestamp);
10172f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        }
1017361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (frm_int > 0)          // In this case the frame rate was set along
1017461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    {                               // with the port definition, start ts with 0
1017561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
1017661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rst_prev_ts = true;
10177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
10178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
10180ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavanvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
10181ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects)
10182ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan{
10183ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    switch (primaries) {
10184ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_BT709_5:
10185ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            *color_space = ITU_R_709;
10186ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
10187ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10188ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_BT470_6_M:
10189ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mPrimaries = ColorAspects::PrimariesBT470_6M;
10190ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10191ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_BT601_6_625:
10192ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10193ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10194ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_BT601_6_525:
10195ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            *color_space = range ? ITU_R_601_FR : ITU_R_601;
10196ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525;
10197ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10198ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_GENERIC_FILM:
10199ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mPrimaries = ColorAspects::PrimariesGenericFilm;
10200ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10201ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_BT2020:
10202ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10203ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10204187779f25a339c00d37ff09a478113f0b2047120Praveen Chavan        case MSM_VIDC_UNSPECIFIED:
10205187779f25a339c00d37ff09a478113f0b2047120Praveen Chavan            //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default
10206ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        default:
10207c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            //aspects->mPrimaries = ColorAspects::PrimariesOther;
10208c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10209ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10210ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    }
10211ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10212ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
10213ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10214ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    switch (transfer) {
10215ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_BT709_5:
10216ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625:
10217ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10218ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10219ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_BT_470_6_M:
10220ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferGamma22;
10221ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10222ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_BT_470_6_BG:
10223ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferGamma28;
10224ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10225ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_SMPTE_240M:
10226ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10227ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10228ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_LINEAR:
10229ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferLinear;
10230ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10231ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_IEC_61966:
10232ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferXvYCC;
10233ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10234ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_BT_1361:
10235ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferBT1361;
10236ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10237ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_TRANSFER_SRGB:
10238ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mTransfer = ColorAspects::TransferSRGB;
10239ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10240ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        default:
10241c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            //aspects->mTransfer = ColorAspects::TransferOther;
10242c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            aspects->mTransfer = m_client_color_space.sAspects.mTransfer;
10243ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10244ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    }
10245ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10246ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    switch (matrix) {
10247ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_BT_709_5:
10248ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10249ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10250ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_FCC_47:
10251ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M;
10252ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10253ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_601_6_625:
10254ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_601_6_525:
10255ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10256ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10257ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_SMPTE_240M:
10258ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M;
10259ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10260ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_BT_2020:
10261ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10262ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10263ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case MSM_VIDC_MATRIX_BT_2020_CONST:
10264ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant;
10265ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10266ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        default:
10267c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            //aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10268c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10269ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10270ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    }
10271ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan}
10272ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10273c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavanvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) {
10274c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d",
10275c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs);
10276c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan}
10277c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
10278ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavanvoid omx_vdec::handle_color_space_info(void *data, unsigned int buf_index)
10279ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan{
10280187779f25a339c00d37ff09a478113f0b2047120Praveen Chavan    ColorSpace_t color_space = ITU_R_601;
10281c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    ColorAspects tempAspects;
10282c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    memset(&tempAspects, 0x0, sizeof(ColorAspects));
10283c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    ColorAspects *aspects = &tempAspects;
10284ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10285ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    switch(output_capability) {
10286ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_MPEG2:
10287ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            {
10288ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
10289ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data;
10290ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10291ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to
10292ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                 * understand this code */
10293ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10294ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                if (seqdisp_payload && seqdisp_payload->color_descp) {
10295ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10296ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    convert_color_space_info(seqdisp_payload->color_primaries, 1,
10297ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
10298ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            &color_space,aspects);
10299ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    m_disp_hor_size = seqdisp_payload->disp_width;
10300ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    m_disp_vert_size = seqdisp_payload->disp_height;
10301ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                }
10302ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            }
10303ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10304ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_H264:
10305ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_HEVC:
10306ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            {
10307ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                struct msm_vidc_vui_display_info_payload *display_info_payload;
10308ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                display_info_payload = (struct msm_vidc_vui_display_info_payload*)data;
10309ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10310ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */
10311ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10312ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                if (display_info_payload->video_signal_present_flag &&
10313ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        display_info_payload->color_description_present_flag) {
10314ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    convert_color_space_info(display_info_payload->color_primaries,
10315ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            display_info_payload->video_full_range_flag,
10316ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            display_info_payload->transfer_characteristics,
10317ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            display_info_payload->matrix_coefficients,
10318ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            &color_space,aspects);
10319ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                }
10320ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            }
10321ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10322ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_VC1_ANNEX_G:
10323ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_VC1_ANNEX_L:
10324ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            {
10325ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload;
10326ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data;
10327ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10328ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23
10329ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                 * SMPTE 421M to understand this code */
10330ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10331ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                if (m_enable_android_native_buffers &&
10332ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        vc1_seq_disp_payload->color_primaries) {
10333ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10334ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    convert_color_space_info(vc1_seq_disp_payload->color_primaries,
10335ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            1,
10336ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            vc1_seq_disp_payload->transfer_char,
10337ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            vc1_seq_disp_payload->matrix_coeffs,
10338ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                            &color_space,aspects);
10339ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                }
10340ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            }
10341ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10342ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_VP8:
10343ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            {
10344ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10345ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10346ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10347c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan                /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011
10348ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                 * to understand this code */
10349ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10350ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                if (vpx_color_space_payload->color_space == 0) {
10351ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    color_space = ITU_R_601;
10352ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                } else {
10353ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    DEBUG_PRINT_ERROR("Unsupported Color space for VP8");
10354ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    break;
10355ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                }
10356ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            }
10357ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10358ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        case V4L2_PIX_FMT_VP9:
10359ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            {
10360ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10361ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10362ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10363ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016
10364ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                 * to understand this code */
10365ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10366ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                switch(vpx_color_space_payload->color_space) {
10367ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_BT_601:
10368ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10369ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10370ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10371ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10372ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10373ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_BT_709:
10374ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        color_space = ITU_R_709;
10375ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10376ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10377ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries =  ColorAspects::PrimariesBT709_5;
10378ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10379ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10380ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_SMPTE_170:
10381ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10382ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10383ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10384ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10385ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10386ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_SMPTE_240:
10387ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10388ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10389ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10390ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10391ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10392ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_BT_2020:
10393ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10394ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects:: TransferSMPTE170M;
10395ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10396ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10397ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10398ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_RESERVED:
10399ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10400ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects::TransferOther;
10401ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10402ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10403ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10404ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    case MSM_VIDC_CS_RGB:
10405ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10406ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10407ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10408ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        aspects->mRange = m_client_color_space.sAspects.mRange;
10409ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10410ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                    default:
10411ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        break;
10412ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                }
10413ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            }
10414ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10415ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        default:
10416ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            break;
10417ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    }
10418c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    if (m_enable_android_native_buffers) {
10419939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        DEBUG_PRINT_HIGH("setMetaData for Color Space = 0x%x (601=%u FR=%u 709=%u)", color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
10420939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        set_colorspace_in_handle(color_space, buf_index);
10421c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    }
10422c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    print_debug_color_aspects(aspects, "Bitstream");
10423c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
10424c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan    if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries ||
10425c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            m_internal_color_space.sAspects.mTransfer != aspects->mTransfer ||
10426c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs ||
10427c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan            m_internal_color_space.sAspects.mRange != aspects->mRange) {
10428c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects));
10429c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        m_internal_color_space.bDataSpaceChanged = OMX_TRUE;
10430c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
10431ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        DEBUG_PRINT_HIGH("Initiating PORT Reconfig");
10432c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal");
10433c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan        print_debug_color_aspects(&(m_client_color_space.sAspects), "Client");
10434c8dc4a1e8fb2cc3509afecfbb64c2500174e0248Praveen Chavan
10435ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan        post_event(OMX_CORE_OUTPUT_PORT_INDEX,
10436ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                OMX_QTIIndexConfigDescribeColorAspects,
10437ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
10438ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan    }
10439ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan}
10440ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan
10441939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavanvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) {
10442939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan    private_handle_t *private_handle = NULL;
10443939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan    if (buf_index < drv_ctx.op_buf.actualcount &&
10444939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
10445939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan            native_buffer[buf_index].privatehandle) {
10446939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        private_handle = native_buffer[buf_index].privatehandle;
10447939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan    }
10448939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan    if (private_handle) {
10449939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan        setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space);
10450939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan    }
10451939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan}
10452939bc4145117bc6b87d6cef5c0219c63efff113bPraveen Chavan
10453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
10454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1045561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
1045661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_conceal_MB = 0;
104578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_TICKS time_stamp = 0;
1045861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 frame_rate = 0;
104598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long consumed_len = 0;
1046061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB_in_frame;
1046161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 recovery_sei_flags = 1;
1046261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int enable = 0;
104638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1046461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int buf_index = p_buf_hdr - m_out_mem_ptr;
10465a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan    if (buf_index >= drv_ctx.extradata_info.count) {
10466a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan        DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
10467a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan                buf_index, drv_ctx.extradata_info.count);
10468a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan        return;
10469a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan    }
1047061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
10471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) {
10473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL");
10474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return;
10475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
10476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1047761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr) +
1047861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_buf_hdr->nOffset;
10479a943a925f77029181f0bd74f6794ea4175819582Praveen Chavan
1048061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!drv_ctx.extradata_info.uaddr) {
104818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
1048261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
1048361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
104848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) {
104858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data");
104868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_extra = NULL;
104878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
104888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
104898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!secure_mode)
104908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_extra = (OMX_OTHER_EXTRADATATYPE *)
104918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
104928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    else
104938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_extra = m_other_extradata;
1049461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
104958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
104968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1049761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_extra = NULL;
10498f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
104998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
105008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
1050161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
105028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (data && p_extra) {
1050361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
105048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
105058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) {
1050661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Invalid extra data size");
1050761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
1050861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
10509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
10511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                p_extra = NULL;
10512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
10513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                return;
10514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
10515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10516ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan            DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType);
1051761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch ((unsigned long)data->eType) {
105188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
1051961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_interlace_payload *payload;
10520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_U32 interlace_color_format;
105218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    payload = (struct msm_vidc_interlace_payload *)(void *)data->data;
105228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (payload) {
1052361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        enable = 1;
105248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        switch (payload->format) {
105258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE:
105268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
105278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                enable = 0;
105288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                break;
105298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST:
105308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
105318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                break;
105328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST:
105338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
105348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                break;
105358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            default:
105368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_LOW("default case - set interlace to topfield");
105378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
105388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        }
10539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        switch (payload->color_format) {
10540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12:
10541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
10542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
10543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               break;
10544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC:
10545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
10546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC;
10547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               break;
10548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           default:
10549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
10550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame");
10551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
1055261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10554099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan                    if (m_enable_android_native_buffers) {
10555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d",
10556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                         payload->format, interlace_color_format ,enable,
105578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                        (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false);
10558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
105598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
105608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               PP_PARAM_INTERLACED, (void*)&enable);
10561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
10562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
10563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
10564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               LINEAR_FORMAT, (void*)&interlace_color_format);
10565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
10566099ba28f1f5f8a916fb20c0d097c891fd8fa02b2Praveen Chavan                    }
105678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (client_extradata & OMX_INTERLACE_EXTRADATA) {
105688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        append_interlace_extradata(p_extra, payload->format,
105698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                      p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF);
1057061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
1057161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
1057261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
105738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_FRAME_RATE:
1057461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_framerate_payload *frame_rate_payload;
105758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data;
1057661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    frame_rate = frame_rate_payload->frame_rate;
1057761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
105788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_TIMESTAMP:
1057961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_ts_payload *time_stamp_payload;
105808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data;
105818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    time_stamp = time_stamp_payload->timestamp_lo;
105828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
105838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    p_buf_hdr->nTimeStamp = time_stamp;
1058461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
105858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
1058661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
105878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data;
1058861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1058961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1059061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
1059161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
105928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_INDEX:
1059361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    int *etype;
105948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    etype  = (int *)(void *)data->data;
105958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) {
1059661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
1059761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
1059861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (aspect_ratio_payload) {
1059961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ((struct vdec_output_frameinfo *)
1060061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
1060161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            ((struct vdec_output_frameinfo *)
1060261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
1060361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
1060461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
1060561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
106068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
1060761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
106088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data;
1060961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    recovery_sei_flags = recovery_sei_payload->flags;
106108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
1061161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
106128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("***************************************************");
106138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
106148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_HIGH("***************************************************");
1061561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
1061661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
106178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
106188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data;
106198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) {
106208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Panscan windows are more than supported\n");
106218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n",
106228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows);
106238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        return;
106248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
1062561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
106268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP:
10627ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO:
10628ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                case MSM_VIDC_EXTRADATA_VC1_SEQDISP:
10629ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO:
10630ebe3411770bc467e978eacd66ebc1495a16d4a56Praveen Chavan                        handle_color_space_info((void *)data->data, buf_index);
1063161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
106328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING:
106338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload;
106348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data;
106358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
106368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        append_framepack_extradata(p_extra, s3d_frame_packing_payload);
106378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
106388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
106398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
106408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_FRAME_QP:
106418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    struct msm_vidc_frame_qp_payload *qp_payload;
106428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data;
106438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (client_extradata & OMX_QP_EXTRADATA) {
106448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        append_qp_extradata(p_extra, qp_payload);
106458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
106468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
106478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
106488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO:
106498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    struct msm_vidc_frame_bits_info_payload *bits_info_payload;
106508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data;
106518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (client_extradata & OMX_BITSINFO_EXTRADATA) {
106528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        append_bitsinfo_extradata(p_extra, bits_info_payload);
106538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
106548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
106558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
106568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                case MSM_VIDC_EXTRADATA_STREAM_USERDATA:
106578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
106588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        append_user_extradata(p_extra, data);
106598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
106608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    }
106618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    break;
10662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                case MSM_VIDC_EXTRADATA_VQZIP_SEI:
10663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    struct msm_vidc_vqzip_sei_payload *vqzip_payload;
10664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data;
10665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (client_extradata & OMX_VQZIPSEI_EXTRADATA) {
10666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
10667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        append_vqzip_extradata(p_extra, vqzip_payload);
10668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
106696ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan                    }
106706ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan                    break;
1067161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
106728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Unrecognized extradata");
1067361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    goto unrecognized_extradata;
1067461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1067561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            consumed_len += data->nSize;
1067661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
1067761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
106788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
1067961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1068061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            append_frame_info_extradata(p_extra,
1068161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
106828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
1068361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
106848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
106858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
106868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) {
106878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            append_frame_dimension_extradata(p_extra);
106888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
1068961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1069061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
106916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunrecognized_extradata:
106928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (client_extradata && p_extra) {
106938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1069461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        append_terminator_extradata(p_extra);
106958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
10696f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (secure_mode && p_extradata && m_other_extradata) {
106978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct vdec_output_frameinfo  *ptr_extradatabuff = NULL;
106988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size);
106998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate;
107008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata;
107018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size;
107028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
1070361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
10704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
107066eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
1070761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool is_internal, bool enable)
10708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1070961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE ret = OMX_ErrorNone;
1071061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
1071161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_state != OMX_StateLoaded) {
1071261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
1071361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorIncorrectStateOperation;
1071461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
107158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d",
107168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal);
1071761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1071861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!is_internal) {
1071961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enable)
1072061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata |= requested_extradata;
1072161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
1072261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            client_extradata = client_extradata & ~requested_extradata;
1072361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1072461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1072561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
1072661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
1072761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1072861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
1072961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1073061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
107318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        " Quality of interlaced clips might be impacted.");
1073261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
107338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
1073561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1073661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
1073761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
1073961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1074061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1074161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
1074261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
1074461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1074561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1074661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
1074761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
1074961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1075061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1075161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
1075261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1075461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1075561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
107568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
1075761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1075961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
10760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (output_capability == V4L2_PIX_FMT_MPEG2) {
10761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
10762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
10763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
10764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
10765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1076661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
10767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
107688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
1076961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1077061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
1077161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
107738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
107748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (requested_extradata & OMX_FRAMEPACK_EXTRADATA) {
107768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (output_capability == V4L2_PIX_FMT_H264) {
107778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA");
107788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
107798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                control.value =  V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING;
107808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata");
107828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
107838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            } else {
107848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only");
107858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
107868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (requested_extradata & OMX_QP_EXTRADATA) {
107888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
107898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
107908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set QP extradata");
107928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
107938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
107948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (requested_extradata & OMX_BITSINFO_EXTRADATA) {
107958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
107968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO;
107978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
107988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set frame bits info extradata");
107998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            }
108008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
108018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (requested_extradata & OMX_EXTNUSER_EXTRADATA) {
10802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (secure_mode) {
10803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("ExtnUser Extra Data not supported for secure sessions");
10804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                return OMX_ErrorUnsupportedSetting;
10805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
108068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
108078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA;
108088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
108098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set stream userdata extradata");
1081061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1081161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
10812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) {
10813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
10814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI;
10815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
10816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata");
10817f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            }
10818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            client_extradata |= OMX_VQZIPSEI_EXTRADATA;
10819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
108206ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
10821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
108226ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
10823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                DEBUG_PRINT_HIGH("Failed to set QP extradata");
108246ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan            }
10825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            client_extradata |= OMX_QP_EXTRADATA;
108266ee2d713ec3877635f654ba65aa95395e5323eb6Praveen Chavan        }
10827da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan        if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) {
10828da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
10829da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan            switch(output_capability) {
10830da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case V4L2_PIX_FMT_H264:
10831da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case V4L2_PIX_FMT_HEVC:
10832da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
10833da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    break;
10834da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case CODEC_TYPE_MPEG2:
10835da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
10836da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    break;
10837da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case V4L2_PIX_FMT_VP8:
10838da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case V4L2_PIX_FMT_VP9:
10839da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE;
10840da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    break;
10841da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case V4L2_PIX_FMT_VC1_ANNEX_G:
10842da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                case V4L2_PIX_FMT_VC1_ANNEX_L:
10843da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP;
10844da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    break;
10845da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                default:
10846da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind);
10847da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                    return ret;
10848da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan            }
10849da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan
10850da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
10851da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan                DEBUG_PRINT_HIGH("Failed to set Display info extradata");
10852da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan            }
10853da491142bd05b7bbb5704579b04f1b968b47a9b6Praveen Chavan        }
1085461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1085561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = get_buffer_req(&drv_ctx.op_buf);
1085661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
10857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
10859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
10860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1086161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
1086261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *data_ptr = extra->data, data = 0;
1086361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (byte_count < extra->nDataSize) {
1086461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data = *data_ptr;
1086561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        while (data) {
1086661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            num_MB += (data&0x01);
1086761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            data >>= 1;
1086861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1086961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        data_ptr++;
1087061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        byte_count++;
1087161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1087261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1087361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1087461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
10875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
10876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
10877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
10878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
108798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_debug_extradata || !extra)
1088061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
10881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
108828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
10883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH(
1088461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "============== Extra Data ==============\n"
108858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "           Size: %u\n"
108868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "        Version: %u\n"
108878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "      PortIndex: %u\n"
108888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "           Type: %x\n"
108898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "       DataSize: %u",
108908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion,
108918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize);
1089261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1089361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
108948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1089561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
1089661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "------ Interlace Format ------\n"
108978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "                Size: %u\n"
108988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "             Version: %u\n"
108998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           PortIndex: %u\n"
109008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                " Is Interlace Format: %d\n"
109018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "   Interlace Formats: %u\n"
109028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "=========== End of Interlace ===========",
109038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex,
109048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats);
1090561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
109068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1090761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1090861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH(
1090961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "-------- Frame Format --------\n"
109108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "             Picture Type: %d\n"
109118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Interlace Type: %d\n"
109128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                " Pan Scan Total Frame Num: %u\n"
109138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "   Concealed Macro Blocks: %u\n"
109148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "               frame rate: %u\n"
109158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "               Time Stamp: %llu\n"
109168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Aspect Ratio X: %u\n"
109178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "           Aspect Ratio Y: %u",
1091861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->ePicType,
1091961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fminfo->interlaceType,
109208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)fminfo->panScan.numWindows,
109218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)fminfo->nConcealedMacroblocks,
109228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)fminfo->nFrameRate,
109238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                fminfo->nTimeStamp,
109248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)fminfo->aspectRatio.aspectRatioX,
109258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)fminfo->aspectRatio.aspectRatioY);
1092661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1092761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
1092861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH(
109298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "------------------------------"
109308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "     Pan Scan Frame Num: %u\n"
109318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "            Rectangle x: %d\n"
109328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "            Rectangle y: %d\n"
109338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "           Rectangle dx: %d\n"
109348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    "           Rectangle dy: %d",
109358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y,
109368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy);
1093761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1093861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1093961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
109408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) {
109418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
109428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
109438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "------------------ Framepack Format ----------\n"
109448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "                           id: %u \n"
109458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "                  cancel_flag: %u \n"
109468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "                         type: %u \n"
109478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                " quincunx_sampling_flagFormat: %u \n"
109488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "  content_interpretation_type: %u \n"
109498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "        spatial_flipping_flag: %u \n"
109508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "          frame0_flipped_flag: %u \n"
109518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "             field_views_flag: %u \n"
109528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                " current_frame_is_frame0_flag: %u \n"
109538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "   frame0_self_contained_flag: %u \n"
109548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "   frame1_self_contained_flag: %u \n"
109558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "       frame0_grid_position_x: %u \n"
109568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "       frame0_grid_position_y: %u \n"
109578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "       frame1_grid_position_x: %u \n"
109588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "       frame1_grid_position_y: %u \n"
109598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "                reserved_byte: %u \n"
109608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "            repetition_period: %u \n"
109618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "               extension_flag: %u \n"
109628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "================== End of Framepack ===========",
109638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->id,
109648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->cancel_flag,
109658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->type,
109668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->quincunx_sampling_flag,
109678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->content_interpretation_type,
109688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->spatial_flipping_flag,
109698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame0_flipped_flag,
109708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->field_views_flag,
109718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->current_frame_is_frame0_flag,
109728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame0_self_contained_flag,
109738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame1_self_contained_flag,
109748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame0_grid_position_x,
109758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame0_grid_position_y,
109768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame1_grid_position_x,
109778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->frame1_grid_position_y,
109788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->reserved_byte,
109798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->repetition_period,
109808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)framepack->extension_flag);
109818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) {
109828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
109838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
109848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "---- QP (Frame quantization parameter) ----\n"
109858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "    Frame QP: %u \n"
109868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "================ End of QP ================\n",
109878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)qp->nQP);
109888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) {
109898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data;
109908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
109918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "--------- Input bits information --------\n"
109928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "    Header bits: %u \n"
109938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "     Frame bits: %u \n"
109948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "===== End of Input bits information =====\n",
109958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits);
109968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) {
109978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data;
109988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U8 *data_ptr = (OMX_U8 *)userdata->data;
109998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type);
110008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U32 i = 0;
110018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
110028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "--------------  Userdata  -------------\n"
110038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "    Stream userdata type: %u\n"
110048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "          userdata size: %u\n"
110058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "    STREAM_USERDATA:",
110068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)userdata->type, (unsigned int)userdata_size);
110078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                for (i = 0; i < userdata_size; i+=4) {
110088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_HIGH("        %x %x %x %x",
110098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        data_ptr[i], data_ptr[i+1],
110108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        data_ptr[i+2], data_ptr[i+3]);
110118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                }
110128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH(
110138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                "=========== End of Userdata ===========");
11014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) {
11015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
11016f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_HIGH(
11017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "--------------  VQZip  -------------\n"
11018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "    Size: %u\n",
11019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (unsigned int)vq->nSize);
11020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_HIGH( "=========== End of VQZip ===========");
1102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra->eType == OMX_ExtraDataNone) {
1102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
1102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
1102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
1102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
11026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
110298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_U32 interlaced_format_type, bool is_mbaff)
11030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STREAMINTERLACEFORMAT *interlace_format;
110328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
1103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
1103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
11036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!extra) {
11037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input");
11038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       return;
11039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
1104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
1104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
110458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
1104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
110498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
110508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) && !is_mbaff) {
1105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_FALSE;
1105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
110548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if ((interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) && !is_mbaff) {
110558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
110568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->nInterlaceFormats =  OMX_InterlaceInterleaveFrameTopFieldFirst;
110578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
110588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else if ((interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) && !is_mbaff) {
110598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
110608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst;
110618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
1106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->bInterlaceFormat = OMX_TRUE;
1106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
1106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
11068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
110708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra)
110718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
110728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension;
110738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) {
110748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
110758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
110768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE;
110778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
110788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
110798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension;
110808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION);
110818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data;
110828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_dimension->nDecWidth = rectangle.nLeft;
110838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_dimension->nDecHeight = rectangle.nTop;
110848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_dimension->nActualWidth = rectangle.nWidth;
110858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_dimension->nActualHeight = rectangle.nHeight;
110868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
110878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
110886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::fill_aspect_ratio_info(
1108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct vdec_aspectratioinfo *aspect_ratio_info,
1109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
110916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata = frame_info;
1109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
1109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
110958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX,
110968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)m_extradata->aspectRatio.aspectRatioY);
110976eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
11098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
111018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload,
111026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        struct vdec_aspectratioinfo *aspect_ratio_info)
11103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
1110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct msm_vidc_panscan_window *panscan_window;
1110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
111076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return;
1110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
1111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
1111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
111148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (picture_type) {
1111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_I:
1111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
1111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
1111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_P:
1112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
1112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
1112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case PICTURE_TYPE_B:
1112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
1112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
1112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
1112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
1112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
1113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
1113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
1113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
1113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
1113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nConcealedMacroblocks = num_conceal_mb;
1113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->nFrameRate = frame_rate;
111378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    frame_info->nTimeStamp = time_stamp;
1113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frame_info->panScan.numWindows = 0;
1113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (output_capability == V4L2_PIX_FMT_MPEG2) {
1114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_disp_hor_size && m_disp_vert_size) {
1114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
1114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
111438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else {
111448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frame_info->displayAspectRatio.displayHorizontalSize = 0;
111458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            frame_info->displayAspectRatio.displayVerticalSize = 0;
1114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (panscan_payload) {
1115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
1115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        panscan_window = &panscan_payload->wnd[0];
1115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
1115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
1115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
1115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
1115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
1115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            panscan_window++;
1115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
1116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
11162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
11165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
1116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
1116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
1117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
111728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data;
1117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *portDefn = m_port_def;
111748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u "
111758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight,
111768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.nFrameWidth,
111778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.nStride,
111788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (unsigned int)portDefn->format.video.nSliceHeight);
111798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
111808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
111818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
111828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload)
111838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
111848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack;
111858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) {
111868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("frame packing size mismatch");
111878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
111888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
111898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE;
111908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
111918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
111928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement;
111938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
111948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
111958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
111968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    framepack->nVersion.nVersion = OMX_SPEC_VERSION;
111978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
111988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memcpy(&framepack->id, s3d_frame_packing_payload,
111998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sizeof(struct msm_vidc_s3d_frame_packing_payload));
112008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memcpy(&m_frame_pack_arrangement, framepack,
112018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
112028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
112038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
112048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
112058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
112068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct msm_vidc_frame_qp_payload *qp_payload)
112078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
112088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_EXTRADATA_QP * qp = NULL;
112098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!qp_payload) {
112108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("QP payload is NULL");
112118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
112128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
112138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_QP_EXTRADATA_SIZE;
112148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
112158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
112168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP;
112178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP);
112188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
112198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    qp->nQP = qp_payload->frame_qp;
112208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
112218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
112228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
112238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
112248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            struct msm_vidc_frame_bits_info_payload *bits_payload)
112258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
112268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL;
112278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!bits_payload) {
112288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("bits info payload is NULL");
112298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
112308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
112318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nSize = OMX_BITSINFO_EXTRADATA_SIZE;
112328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
112338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
112348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo;
112358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO);
112368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data;
112378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bits->frame_bits = bits_payload->frame_bits;
112388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    bits->header_bits = bits_payload->header_bits;
112398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
112408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
112418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
112428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra,
112438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            OMX_OTHER_EXTRADATATYPE *p_user)
112448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
112458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    int userdata_size = 0;
112468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    struct msm_vidc_stream_userdata_payload *userdata_payload = NULL;
112478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    userdata_payload =
112488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data;
112498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    userdata_size = p_user->nDataSize;
11250f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size;
112518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
112528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
112538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
112548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    extra->nDataSize = userdata_size;
11255ce256dab580d6601e34cf59642f642bd496952aePatrick Tjin    if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize))
112568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        memcpy(extra->data, p_user->data, extra->nDataSize);
112578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    print_debug_extradata(extra);
11258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
11261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!client_extradata) {
1126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return;
1126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
1126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->eType = OMX_ExtraDataNone;
1126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->nDataSize = 0;
1126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra->data[0] = 0;
1127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    print_debug_extradata(extra);
11272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra,
11275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct msm_vidc_vqzip_sei_payload *vqzip_payload)
11276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
11277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL;
11278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size;
11280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    extra->nVersion.nVersion = OMX_SPEC_VERSION;
11281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
11282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI;
11283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size;
11284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
11286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    vq->nSize = vqzip_payload->size;
11287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memcpy(vq->data, vqzip_payload->data, vqzip_payload->size);
11288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    print_debug_extradata(extra);
11290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
11291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
11293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= drv_ctx.ip_buf.actualcount) {
112968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
1129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
1129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
1130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr = (desc_buffer_hdr*) \
1130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    calloc( (sizeof(desc_buffer_hdr)),
1130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            drv_ctx.ip_buf.actualcount);
1130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_desc_buffer_ptr == NULL) {
113048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
1130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
1130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
11307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
11308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
1131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
113118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
1131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
1131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
11314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
11316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
11319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
113208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries);
1132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_demux_entries < 8192) {
1132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_demux_offsets[m_demux_entries++] = address_offset;
1132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
11325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
11328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
1133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
1133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 index = 0;
1133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
1133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (index < bytes_to_parse) {
1133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
1133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 (buf[index+2] == 0x01)) ) {
1134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //Found start code, insert address offset
1134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            insert_demux_addr_offset(index);
1134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buf[index+2] == 0x01) // 3 byte start code
1134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 3;
1134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            else                      //4 byte start code
1134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                index += 4;
1134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
1134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            index++;
11348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
113498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries);
1135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return;
11351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
11354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //fix this, handle 3 byte start code, vc1 terminator entry
1135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U8 *p_demux_data = NULL;
1135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 desc_data = 0;
1135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 start_addr = 0;
1135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 nal_size = 0;
1136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 suffix_byte = 0;
1136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 demux_index = 0;
1136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 buffer_index = 0;
1136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_desc_buffer_ptr == NULL) {
1136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
1136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
1136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
1137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_index > drv_ctx.ip_buf.actualcount) {
113718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index);
1137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
1137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
1137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ( ((OMX_U8*)p_demux_data == NULL) ||
1137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
1137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
1138061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
1138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
1138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (; demux_index < m_demux_entries; demux_index++) {
1138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
1138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            start_addr = m_demux_offsets[demux_index];
1138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
1138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
1138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
1138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
1138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
1139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (demux_index < (m_demux_entries - 1)) {
1139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
1139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
1139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
1139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
113958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)",
113968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)start_addr,
113978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)suffix_byte,
113988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)nal_size,
113998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    (unsigned int)demux_index);
1140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = (start_addr >> 3) << 1;
1140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= (start_addr & 7) << 21;
1140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data |= suffix_byte << 24;
1140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
1140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
1141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_type_parse == CODEC_TYPE_VC1) {
1141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VC1 terminator entry");
1141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0;
1141461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            desc_data = 0x82 << 24;
1141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
1141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_demux_data += 16;
1142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_demux_entries++;
1142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //Add zero word to indicate end of descriptors
1142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(p_demux_data, 0, sizeof(OMX_U32));
1142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
114268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size);
1142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
1142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_demux_entries = 0;
1143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Demux table complete!");
1143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
11432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
11433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level)
11435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
11436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct v4l2_control control;
11437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    char property_value[PROPERTY_VALUE_MAX] = {0};
11438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property_get("vidc.debug.turbo", property_value, "0");
11440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&control, 0, sizeof(v4l2_control));
11441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
11442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (perf_level) {
11443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case VIDC_NOMINAL:
11444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (atoi(property_value))
11445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
11446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
11447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
11448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
11449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case VIDC_TURBO:
11450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
11451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
11452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     default:
11453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("Requested PERF level not supported");
11454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
11455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
11456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig)
11457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return;
11458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DEBUG_PRINT_HIGH("changing performance level to %d", control.value);
11460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        current_perf_level = control.value;
1146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
11463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_ERROR("Failed to set PERF level");
1146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
11465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
114666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
114676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
114686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enabled = false;
1147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = NULL;
1147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    init_members();
1147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ColorFormat = OMX_COLOR_FormatMax;
114738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    dest_format = YCbCr420P;
114746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
114756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
114766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
114776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx = reinterpret_cast<omx_vdec*>(client);
114796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
114806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_vdec::allocate_color_convert_buf::init_members()
1148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
1148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count = 0;
1148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_size_req = 0;
1148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buffer_alignment_req = 0;
1148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
1148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
1148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
1148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
114906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
1149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
11492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < MAX_COUNT; i++)
1149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd[i] = -1;
114956eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
114966eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
1149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
1149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.destroy();
115006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
11501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
115026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
115036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
1150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int src_size = 0, destination_size = 0;
1150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
1150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
115088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
1150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
1151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
115128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("No color conversion required");
1151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
1151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
1151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
1151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
115188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
1151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
1152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        goto fail_update_buf_req;
1152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2d.close();
1152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = c2d.open(omx->drv_ctx.video_resolution.frame_height,
1152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            omx->drv_ctx.video_resolution.frame_width,
115258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            NV12_128m,dest_format);
1152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
1152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = c2d.get_buffer_size(C2D_INPUT,src_size);
1152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (status)
1152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
1153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
1153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
1153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                !destination_size) {
115348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
11535f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    "driver size %u destination size %d",
11536f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size,
11537f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                    destination_size);
1153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
1153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.close();
1154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = 0;
1154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
1154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req = destination_size;
1154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_size_req < omx->drv_ctx.op_buf.buffer_size)
1154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_size_req = omx->drv_ctx.op_buf.buffer_size;
1154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
1154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
1154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
115486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
115496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_update_buf_req:
1155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
1155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
115526eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
115536eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
115546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::set_color_format(
1155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_COLOR_FORMATTYPE dest_color_format)
115566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
1155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_COLOR_FORMATTYPE drv_color_format;
1155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
115608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid client in color convert");
1156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
1156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
1156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
115658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
115668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            drv_color_format = (OMX_COLOR_FORMATTYPE)
115678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
115688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        else
11569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            drv_color_format = (OMX_COLOR_FORMATTYPE)
11570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
11571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
11572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         drv_color_format = (OMX_COLOR_FORMATTYPE)
11573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
11574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     } else {
115758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect color format");
115766eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        status = false;
115776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
11578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (status &&
115798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_color_format != dest_color_format &&
115808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        drv_color_format != (OMX_COLOR_FORMATTYPE)
11581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView &&
11582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        drv_color_format != (OMX_COLOR_FORMATTYPE)
11583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed &&
11584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        dest_color_format != (OMX_COLOR_FORMATTYPE)
11585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
115868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Enabling C2D");
115878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) &&
115888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) {
115898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
1159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
1159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
115928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ColorFormat = dest_color_format;
115938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ?
115948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    YCbCr420P : YCbCr420SP;
1159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (enabled)
1159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                c2d.destroy();
1159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            enabled = false;
1159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!c2d.init()) {
115998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("open failed for c2d");
1160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
1160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
1160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                enabled = true;
1160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
1160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (enabled)
1160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            c2d.destroy();
1160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enabled = false;
1160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
1161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
116116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
116126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
116136eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
116146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1161561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
116168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
1161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
1162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->m_out_mem_ptr;
1162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return m_out_mem_ptr_client;
116226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
116236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
1162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
116266eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
116288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
1163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
1163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
1163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
1163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - omx->m_out_mem_ptr;
1163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
1163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
1163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
1163961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool status;
1164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
1164161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_mutex_lock(&omx->c_lock);
11642f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            cache_clean_buffer(index);
1164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
1164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
1164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    pmem_baseaddress[index], pmem_baseaddress[index]);
1164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!status) {
116478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
1164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = 0;
116492278148b3ae1838153fe2319ddbc2e058e754079Zhijun He                pthread_mutex_unlock(&omx->c_lock);
1165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return &m_out_mem_ptr_client[index];
11651a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan            } else {
11652a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan                unsigned int filledLen = 0;
11653a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan                c2d.get_output_filled_length(filledLen);
11654a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan                m_out_mem_ptr_client[index].nFilledLen = filledLen;
11655f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                cache_clean_invalidate_buffer(index);
1165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
116572278148b3ae1838153fe2319ddbc2e058e754079Zhijun He            pthread_mutex_unlock(&omx->c_lock);
1165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
1165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_out_mem_ptr_client[index].nFilledLen = 0;
116606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        return &m_out_mem_ptr_client[index];
1166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
116628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
1166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
116646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
116656eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
1166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(OMX_BUFFERHEADERTYPE *bufadd)
116686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!omx) {
116708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1167161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return NULL;
1167261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
1167461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return bufadd;
1167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned index = 0;
1167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufadd - m_out_mem_ptr_client;
1167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index < omx->drv_ctx.op_buf.actualcount) {
1167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return &omx->m_out_mem_ptr[index];
1167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
116808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
116816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    return NULL;
116826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
1168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
1168461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan(unsigned int &buffer_size)
116856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
1168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&omx->c_lock);
1168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
1168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_size = omx->drv_ctx.op_buf.buffer_size;
1169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
1169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
116928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Get buffer size failed");
1169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
1169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            goto fail_get_buffer_size;
1169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_size < omx->drv_ctx.op_buf.buffer_size)
116986eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal        buffer_size = omx->drv_ctx.op_buf.buffer_size;
1169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer_alignment_req < omx->drv_ctx.op_buf.alignment)
1170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_alignment_req = omx->drv_ctx.op_buf.alignment;
117016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalfail_get_buffer_size:
1170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&omx->c_lock);
1170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
117046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
117056eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
1170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE *bufhdr)
1170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
1170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int index = 0;
1170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled)
1171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return omx->free_output_buffer(bufhdr);
1171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure())
1171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
1171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count || !bufhdr) {
117158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
1171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
1171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    index = bufhdr - m_out_mem_ptr_client;
1171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (index >= omx->drv_ctx.op_buf.actualcount) {
117208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
1172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
1172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
11723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (pmem_fd[index] >= 0) {
1172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap(pmem_baseaddress[index], buffer_size_req);
1172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[index]);
1172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[index] = -1;
117286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
1172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx->free_ion_memory(&op_buf_ion_info[index]);
117306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
1173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[index].video_heap_ptr = NULL;
1173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count > 0)
1173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count--;
1173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
1173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocated_count = 0;
1173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!allocated_count) {
1173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&omx->c_lock);
1173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2d.close();
1173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        init_members();
1174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&omx->c_lock);
1174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
117436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
117446eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
117456eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
1174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
117476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
1175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
1175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
1175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enabled && omx->is_component_secure()) {
117548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
1175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->is_component_secure());
1175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUnsupportedSetting;
1175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!bufferHdr || bytes > buffer_size_req) {
117598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
117608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u",
117618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                (unsigned int)buffer_size_req, (unsigned int)bytes);
1176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
1176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
117658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
1176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
1176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
1176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
1177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            port,appData,omx->drv_ctx.op_buf.buffer_size);
1177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
117728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
1177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return eRet;
1177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
117768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            (int)omx->drv_ctx.op_buf.actualcount) {
11777f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("Invalid header index %ld",
11778f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan               (long int)(temp_bufferHdr - omx->m_out_mem_ptr));
1177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorUndefined;
1178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int i = allocated_count;
117826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
11783f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    // Allocate color-conversion buffers as cached to improve software-reading
11784f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    // performance of YUV (thumbnails). NOTE: These buffers will need an explicit
11785f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    // cache invalidation.
1178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
1178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            buffer_size_req,buffer_alignment_req,
1178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
11789f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            ION_FLAG_CACHED);
1179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
1179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (op_buf_ion_info[i].ion_device_fd < 0) {
117928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
1179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
1179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
1179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
1179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_baseaddress[i] == MAP_FAILED) {
117998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
1180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd[i]);
1180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        omx->free_ion_memory(&op_buf_ion_info[i]);
1180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
1180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
1180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
11806f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
118076eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
118088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get();
1180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_pmem_info_client[i].offset = 0;
1181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
1181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].nEntries = 1;
1181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
1181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
1181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
1181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFilledLen = 0;
1181761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nFlags = 0;
1181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
1182061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
1182161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
1182261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
1182361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_out_mem_ptr_client[i].pAppPrivate = appData;
1182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *bufferHdr = &m_out_mem_ptr_client[i];
118258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr);
1182661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocated_count++;
1182761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
118286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
118296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
118306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::is_component_secure()
118316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return secure_mode;
118336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
118346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
118356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
118366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
1183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
1183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!enabled) {
11839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
118408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
118418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    dest_color_format = (OMX_COLOR_FORMATTYPE)
118428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
118438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                else
11844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
11845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){
11846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
11847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } else
1184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
1184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
118508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
118518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
118528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            dest_color_format = ColorFormat;
11853073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava        } else
118548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            status = false;
118556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    }
1185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
118576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
11858576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
11859f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen ChavanOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops(
11860f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        unsigned int index, unsigned int cmd)
11861f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan{
11862f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (!enabled) {
11863f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        return OMX_ErrorNone;
11864f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
11865f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11866f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (!omx || index >= omx->drv_ctx.op_buf.actualcount) {
11867f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("%s: Invalid param", __func__);
11868f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        return OMX_ErrorBadParameter;
11869f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
11870f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11871f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    struct ion_flush_data flush_data;
11872f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    struct ion_custom_data custom_data;
11873f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11874f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    memset(&flush_data, 0x0, sizeof(flush_data));
11875f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    memset(&custom_data, 0x0, sizeof(custom_data));
11876f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11877f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    flush_data.vaddr = pmem_baseaddress[index];
11878f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd;
11879f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle;
11880f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    flush_data.length = buffer_size_req;
11881f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    custom_data.cmd = cmd;
11882f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    custom_data.arg = (unsigned long)&flush_data;
11883f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11884f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d",
11885f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
11886f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            flush_data.fd, flush_data.handle, flush_data.vaddr,
11887f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            flush_data.length);
11888f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data);
11889f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (ret < 0) {
11890f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        DEBUG_PRINT_ERROR("Cache %s failed: %s\n",
11891f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
11892f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                strerror(errno));
11893f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        return OMX_ErrorUndefined;
11894f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
11895f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    return OMX_ErrorNone;
11896f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan}
11897f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::buf_ref_add(int nPortIndex)
11899576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon{
119008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long i = 0;
11901576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    bool buf_present = false;
11902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
11903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
11904f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!dynamic_buf_mode || !out_dynamic_list) {
11906f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        return;
11907f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
11908f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11909576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    pthread_mutex_lock(&m_lock);
11910576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
11911576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        //check the buffer fd, offset, uv addr with list contents
11912576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        //If present increment reference.
11913576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        if ((out_dynamic_list[i].fd == fd) &&
11914576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            (out_dynamic_list[i].offset == offset)) {
119158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u",
119168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
11917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               if (!secure_mode) {
11918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                   drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr;
11919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin               }
11920576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon               buf_present = true;
11921576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon               break;
11922576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        }
11923576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    }
11924576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    if (!buf_present) {
11925576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
11926576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            //search for a entry to insert details of the new buffer
11927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (out_dynamic_list[i].dup_fd < 0) {
11928576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                out_dynamic_list[i].fd = fd;
11929576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                out_dynamic_list[i].offset = offset;
11930576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                out_dynamic_list[i].dup_fd = dup(fd);
11931576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                out_dynamic_list[i].ref_count++;
119328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u",
119338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
11934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (!secure_mode) {
11936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr =
11937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len,
11938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          PROT_READ|PROT_WRITE, MAP_SHARED,
11939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0);
11940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    //mmap returns (void *)-1 on failure and sets error code in errno.
11941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) {
11942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno);
11943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL;
11944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        break;
11945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
11946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr;
11947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len;
11948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
11949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
11950576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon                break;
11951576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon            }
11952576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        }
11953576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    }
11954576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon   pthread_mutex_unlock(&m_lock);
11955576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon}
11956576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon
11957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::buf_ref_remove()
11958576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon{
119598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    unsigned long i = 0;
11960f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!dynamic_buf_mode || !out_dynamic_list) {
11962f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        return;
11963f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    }
11964f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
11965576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    pthread_mutex_lock(&m_lock);
11966576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
11967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) {
11968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
11969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            munmap(out_dynamic_list[i].buffaddr,
11970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        out_dynamic_list[i].mapped_size);
11971576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon        }
11972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u",
11974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
11975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         close(out_dynamic_list[i].dup_fd);
11976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         out_dynamic_list[i].dup_fd = -1;
11977576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    }
11978576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon    pthread_mutex_unlock(&m_lock);
11979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
11980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (out_dynamic_list) {
11981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        free(out_dynamic_list);
11982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        out_dynamic_list = NULL;
11983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
11984576efc8b5f9ab640e1a769e0524f0bf07fdfec7dArun Menon}
11985a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan
119868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef _MSM8974_
11987a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavanvoid omx_vdec::send_codec_config() {
11988a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    if (codec_config_flag) {
119898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long p1 = 0; // Parameter - 1
119908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long p2 = 0; // Parameter - 2
119918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned long ident = 0;
11992a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        pthread_mutex_lock(&m_lock);
11993a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n");
11994a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        while (m_etb_q.m_size) {
11995a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan            m_etb_q.pop_entry(&p1,&p2,&ident);
11996a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan            if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
11997a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
11998a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
11999a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
12000a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
12001a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                        omx_report_error();
12002a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    }
12003a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                } else {
12004a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
12005a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
12006a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                }
12007a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan            } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
12008a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
12009a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
12010a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
12011a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
12012a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                        omx_report_error ();
12013a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    }
12014a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                } else {
12015a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    pending_input_buffers++;
12016a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
12017a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                            (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
12018a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                    empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
12019a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                }
12020a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan            } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
12021a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
12022a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                        (OMX_BUFFERHEADERTYPE *)p1);
12023a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan                empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
12024a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan            }
12025a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        }
12026a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan        pthread_mutex_unlock(&m_lock);
12027a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan    }
12028a7cc922ab8aacc121d0abca2ba687d5551ad7523Praveen Chavan}
120298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
120308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdec::perf_control::perf_control()
120328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
120338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_perf_lib = NULL;
12034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_perf_handle = 0;
120358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_perf_lock_acquire = NULL;
120368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_perf_lock_release = NULL;
120378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
120388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
120398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanomx_vdec::perf_control::~perf_control()
120408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
12041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_perf_handle != 0 && m_perf_lock_release) {
120428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("NOTE2: release perf lock");
120438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_perf_lock_release(m_perf_handle);
120448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
120458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_perf_lib) {
120468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        dlclose(m_perf_lib);
120478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
120488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
120498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0};
12051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
12052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock;
12053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
12054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state)
12055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
12056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (load_lib() == false) {
12057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       return;
12058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
12059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_perf_lock.lock();
12060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    /* 0x4401 maps to video decode playback hint
12061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     * in perflock, enum number is 44 and state
12062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     * being sent on perflock acquire is 01 (true)
12063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     */
12064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int arg = 0x4401;
12065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
12066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (state == true) {
12067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        mpctl_obj.vid_inst_count++;
12068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (state == false) {
12069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        mpctl_obj.vid_inst_count--;
12070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
12071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
12072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) {
12073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int));
12074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        mpctl_obj.vid_acquired = true;
12075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_INFO("Video slvp perflock acquired");
12076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) {
12077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_perf_lock_release(mpctl_obj.vid_disp_handle);
12078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        mpctl_obj.vid_acquired = false;
12079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        DEBUG_PRINT_INFO("Video slvp perflock released");
12080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
12081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_perf_lock.unlock();
12082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
12083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
120848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanvoid omx_vdec::perf_control::request_cores(int frame_duration_us)
120858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
120868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) {
120878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        return;
120888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
12089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool retVal = load_lib();
12090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retVal && m_perf_lock_acquire && m_perf_handle == 0) {
120918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int arg = 0x700 /*base value*/ + 2 /*cores*/;
120928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int));
120938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_perf_handle) {
120948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("perf lock acquired");
120958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
120968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
120978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
120988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
12099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_vdec::perf_control::load_lib()
121008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
121018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char perf_lib_path[PROPERTY_VALUE_MAX] = {0};
121028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_perf_lib)
12103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        return true;
121048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
121058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) {
121068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library");
12107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto handle_err;
121088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
121098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
121108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) {
121118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror());
12112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto handle_err;
121138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    } else {
121148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq");
121158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_perf_lock_acquire == NULL) {
121168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq");
12117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto handle_err;
121188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
121198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel");
121208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (m_perf_lock_release == NULL) {
121218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel");
12122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto handle_err;
121238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
121248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
12125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return true;
12126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
12127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinhandle_err:
12128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_perf_lib) {
12129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        dlclose(m_perf_lib);
12130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
12131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_perf_lib = NULL;
12132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return false;
121338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
12134709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan
12135f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen ChavanOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth,
12136f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                            unsigned long nMaxFrameHeight)
12137f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan{
12138f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12139f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
12140f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    int ret = 0;
12141f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    unsigned long min_res_buf_count = 0;
12142f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12143f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    eRet = enable_smoothstreaming();
12144f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (eRet != OMX_ErrorNone) {
12145f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver");
12146f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return eRet;
12147f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12148f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12149f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu",
12150f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan             nMaxFrameWidth,
12151f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan             nMaxFrameHeight);
12152f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     m_smoothstreaming_mode = true;
12153f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     m_smoothstreaming_width = nMaxFrameWidth;
12154f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     m_smoothstreaming_height = nMaxFrameHeight;
12155f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12156f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     //Get upper limit buffer count for min supported resolution
12157f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     struct v4l2_format fmt;
12158f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
12159f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.fmt.pix_mp.height = m_decoder_capability.min_height;
12160f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.fmt.pix_mp.width = m_decoder_capability.min_width;
12161f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.fmt.pix_mp.pixelformat = output_capability;
12162f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12163f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
12164f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (ret) {
12165f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u",
12166f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                           m_decoder_capability.min_height,
12167f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                           m_decoder_capability.min_width);
12168f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return OMX_ErrorUnsupportedSetting;
12169f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12170f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12171f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     eRet = get_buffer_req(&drv_ctx.op_buf);
12172f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (eRet != OMX_ErrorNone) {
12173f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("failed to get_buffer_req");
12174f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return eRet;
12175f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12176f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12177f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     min_res_buf_count = drv_ctx.op_buf.mincount;
12178f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u",
12179f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                     min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width);
12180f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12181f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     update_resolution(m_smoothstreaming_width, m_smoothstreaming_height,
12182f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                       m_smoothstreaming_width, m_smoothstreaming_height);
12183f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     eRet = is_video_session_supported();
12184f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (eRet != OMX_ErrorNone) {
12185f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("video session is not supported");
12186f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return eRet;
12187f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12188f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12189f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     //Get upper limit buffer size for max smooth streaming resolution set
12190f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
12191f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
12192f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
12193f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     fmt.fmt.pix_mp.pixelformat = output_capability;
12194f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
12195f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (ret) {
12196f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback");
12197f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return OMX_ErrorUnsupportedSetting;
12198f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12199f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12200f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     eRet = get_buffer_req(&drv_ctx.op_buf);
12201f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (eRet != OMX_ErrorNone) {
12202f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("failed to get_buffer_req!!");
12203f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return eRet;
12204f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12205f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u",
12206f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                     (unsigned int)drv_ctx.op_buf.buffer_size);
12207f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12208f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     drv_ctx.op_buf.mincount = min_res_buf_count;
12209f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     drv_ctx.op_buf.actualcount = min_res_buf_count;
12210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size;
12211f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     eRet = set_buffer_req(&drv_ctx.op_buf);
12212f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (eRet != OMX_ErrorNone) {
12213f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("failed to set_buffer_req");
12214f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return eRet;
12215f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12216f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12217f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     eRet = get_buffer_req(&drv_ctx.op_buf);
12218f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     if (eRet != OMX_ErrorNone) {
12219f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         DEBUG_PRINT_ERROR("failed to get_buffer_req!!!");
12220f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan         return eRet;
12221f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     }
12222f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u",
12223f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan                      drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size);
12224f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan     return eRet;
12225f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan}
12226709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan
12227709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan//static
12228f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen ChavanOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) {
12229f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12230f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#ifndef FLEXYUV_SUPPORTED
12231f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    return OMX_ErrorUndefined;
12232f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#else
12233f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12234f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    if (pParam == NULL) {
12235709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        DEBUG_PRINT_ERROR("describeColorFormat: invalid params");
12236709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        return OMX_ErrorBadParameter;
12237709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    }
12238709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan
12239f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan    DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam;
12240f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan
12241709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    MediaImage *img = &(params->sMediaImage);
12242709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    switch(params->eColorFormat) {
12243709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m:
12244709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        {
12245709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
12246709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mNumPlanes = 3;
12247709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            // mWidth and mHeight represent the W x H of the largest plane
12248709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            // In our case, this happens to be the Stride x Scanlines of Y plane
12249709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mWidth = params->nFrameWidth;
12250709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mHeight = params->nFrameHeight;
12251709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
12252709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight);
12253709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mBitDepth = 8;
12254709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            //Plane 0 (Y)
12255709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::Y].mOffset = 0;
12256709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::Y].mColInc = 1;
12257709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride
12258709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::Y].mHorizSubsampling = 1;
12259709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::Y].mVertSubsampling = 1;
12260709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            //Plane 1 (U)
12261709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight;
12262709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::U].mColInc = 2;           //interleaved UV
12263709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::U].mRowInc =
12264709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
12265709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::U].mHorizSubsampling = 2;
12266709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::U].mVertSubsampling = 2;
12267709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            //Plane 2 (V)
12268709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1;
12269709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::V].mColInc = 2;           //interleaved UV
12270709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::V].mRowInc =
12271709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
12272709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::V].mHorizSubsampling = 2;
12273709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mPlane[MediaImage::V].mVertSubsampling = 2;
12274709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            break;
12275709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        }
12276709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan
12277709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        case OMX_COLOR_FormatYUV420Planar:
12278709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        case OMX_COLOR_FormatYUV420SemiPlanar:
12279709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            // We need not describe the standard OMX linear formats as these are
12280709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            // understood by client. Fail this deliberately to let client fill-in
12281709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            return OMX_ErrorUnsupportedSetting;
12282709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan
12283709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan        default:
12284709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            // Rest all formats which are non-linear cannot be described
12285709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat);
12286709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
12287709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan            return OMX_ErrorNone;
12288709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    };
12289709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan
12290709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat);
12291709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    DEBUG_PRINT_LOW("  FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight);
12292709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    DEBUG_PRINT_LOW("  YWidth x YHeight : %d x %d", img->mWidth, img->mHeight);
12293709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    for (size_t i = 0; i < img->mNumPlanes; ++i) {
12294ce256dab580d6601e34cf59642f642bd496952aePatrick Tjin        DEBUG_PRINT_LOW("    Plane[%zd] : offset=%d / xStep=%d / yStep = %d",
12295709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan                i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc);
12296709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    }
12297709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan    return OMX_ErrorNone;
12298f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan#endif //FLEXYUV_SUPPORTED
12299709179c13220590b748a585a698f8c57f0f59b75Praveen Chavan}
12300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
12301bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetschvoid omx_vdec::prefetchNewBuffers() {
12302bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12303bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    struct v4l2_decoder_cmd dec;
12304bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t prefetch_count;
12305bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t prefetch_size;
12306bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t want_size;
12307bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t have_size;
12308bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    int color_fmt, rc;
12309bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t new_calculated_size;
12310bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t new_buffer_size;
12311bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t new_buffer_count;
12312bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t old_buffer_size;
12313bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    uint32_t old_buffer_count;
12314bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12315bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    memset((void *)&dec, 0 , sizeof(dec));
12316bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    DEBUG_PRINT_LOW("Old size : %d, count : %d, width : %u, height : %u\n",
12317bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            (int)drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount,
12318bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            drv_ctx.video_resolution.frame_width,
12319bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            drv_ctx.video_resolution.frame_height);
12320bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT;
12321bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
12322bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno);
12323bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    } else {
12324bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n",
12325bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch                dec.raw.data[0], dec.raw.data[1]);
12326bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    }
12327bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12328bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    switch ((int)drv_ctx.output_format) {
12329bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    case VDEC_YUV_FORMAT_NV12:
12330bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        color_fmt = COLOR_FMT_NV12;
12331bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        break;
12332bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    case VDEC_YUV_FORMAT_NV12_UBWC:
12333bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        color_fmt = COLOR_FMT_NV12_UBWC;
12334bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        break;
12335bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    default:
12336bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        color_fmt = -1;
12337bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    }
12338bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12339bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height);
12340bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n",
12341bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            m_reconfig_width, m_reconfig_height, new_calculated_size);
12342bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size;
12343bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    new_buffer_count = dec.raw.data[1];
12344bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    old_buffer_size = drv_ctx.op_buf.buffer_size;
12345bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    old_buffer_count = drv_ctx.op_buf.actualcount;
12346bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12347bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count;
12348bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12349bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    prefetch_count = new_buffer_count;
12350bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    prefetch_size = new_buffer_size - old_buffer_size;
12351bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    want_size = new_buffer_size * new_buffer_count;
12352bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    have_size = old_buffer_size * old_buffer_count;
12353bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12354bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    if (want_size > have_size) {
12355bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size);
12356bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size);
12357bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12358bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        int ion_fd = open(MEM_DEVICE, O_RDONLY);
12359bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        if (ion_fd < 0) {
12360bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd);
12361bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            return;
12362bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        }
12363bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12364bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data));
12365bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data));
12366bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions));
12367bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count);
12368bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12369bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) {
12370bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            DEBUG_PRINT_ERROR("prefetch data allocation failed");
12371bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            goto prefetch_exit;
12372bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        }
12373bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12374bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        for (uint32_t i = 0; i < prefetch_count; i++) {
12375bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            sizes[i] = prefetch_size;
12376bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        }
12377bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12378bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        regions[0].nr_sizes = prefetch_count;
12379bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        regions[0].sizes = sizes;
12380bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        regions[0].vmid = ION_FLAG_CP_PIXEL;
12381bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12382bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        prefetch_data->nr_regions = 1;
12383bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        prefetch_data->regions = regions;
12384bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID);
12385bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12386bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        custom_data->cmd = ION_IOC_PREFETCH;
12387bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        custom_data->arg = (unsigned long )prefetch_data;
12388bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12389bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data);
12390bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        if (rc) {
12391bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch            DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno);
12392bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        }
12393bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
12394bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetschprefetch_exit:
12395bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        close(ion_fd);
12396bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        free(sizes);
12397bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        free(regions);
12398bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        free(prefetch_data);
12399bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch        free(custom_data);
12400bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch    }
12401bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch}
12402bb6e2c659c093ccb6266b679b07513cbeeb9fb24Steve Pfetsch
124037ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan// No code beyond this !
124047ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan
124057ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan// inline import of vendor-extensions implementation
124067ab8354641c04c403a5d51104866c8f43b95bf61Praveen Chavan#include "omx_vdec_extensions.hpp"
12407