111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
2a5bf317aa35f90b6fcc533882760f86342b79547Thierry StrudelCopyright (c) 2010 - 2017, The Linux Foundation. All rights reserved.
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met:
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions of source code must retain the above copyright
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer.
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions in binary form must reproduce the above copyright
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer in the
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      documentation and/or other materials provided with the distribution.
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Neither the name of The Linux Foundation nor
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      the names of its contributors may be used to endorse or promote
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      products derived from this software without specific prior written
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      permission.
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*============================================================================
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            O p e n M A X   w r a p p e r s
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             O p e n  M A X   C o r e
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  This module contains the implementation of the OpenMAX core & component.
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//*========================================================================*/
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//                             Include Files
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define __STDC_FORMAT_MACROS
4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <inttypes.h>
4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h>
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <pthread.h>
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/prctl.h>
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h>
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h>
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <errno.h>
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_vdec.h"
5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h>
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <limits.h>
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h>
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_media_info.h>
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/eventfd.h>
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#if !defined(_ANDROID_) || defined(SYS_IOCTL)
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/ioctl.h>
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/mman.h>
61a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#endif
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h>
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef USE_EGL_IMAGE_GPU
66a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
67a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#ifdef _QUERY_DISP_RES_
68a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#include "display_config.h"
69a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#endif
70a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#endif
71a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
72a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#ifdef _USE_GLIB_
73a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#include <glib.h>
74a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#define strlcpy g_strlcpy
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <qdMetaData.h>
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ANDROID_JELLYBEAN_MR2
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "QComOMXMetadata.h"
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <EGL/egl.h>
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <EGL/eglQCOM.h>
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EGL_BUFFER_HANDLE 0x4F00
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EGL_BUFFER_OFFSET 0x4F01
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BUFFER_LOG_LOC "/data/misc/media"
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFILE *outputExtradataFile;
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelchar output_extradata_filename [] = "/data/misc/media/extradata";
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_FPS 30
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_SUPPORTED_FPS 240
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_WIDTH_ALIGNMENT 128
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_HEIGHT_ALIGNMENT 32
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE        0xC5000000
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE_MASK   0xFF000000
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_AP_SEQ_START_CODE       0x0F010000
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_PROFILE_MASK   0xF0
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE          0
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_MAIN_PROFILE            1
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_ADVANCE_PROFILE         3
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_LEN            4
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_POS            8
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_A_POS            12
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_POS            24
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SEQ_LAYER_SIZE          36
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define POLL_TIMEOUT 0x7fffffff
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_DEVICE "/dev/ion"
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C" {
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include<utils/Log.h>
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif//_ANDROID_
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_1M 0x100000
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1))
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
136fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_FRAMEPACK_EXTRADATA | OMX_OUTPUTCROP_EXTRADATA \
137fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           | OMX_DISPLAY_INFO_EXTRADATA | OMX_HDR_COLOR_INFO_EXTRADATA)
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_BITSTREAM
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_BITSTREAM 0
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_PIXEL
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_PIXEL 0
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MASTER_SIDE_CP
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_SECURE_HEAP_ID
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_4K
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER (ION_SECURE | ION_FLAG_CP_BITSTREAM)
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER (ION_SECURE | ION_FLAG_CP_PIXEL)
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //SLAVE_SIDE_CP
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_1M
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER ION_SECURE
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
160af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel#define LUMINANCE_DIV_FACTOR 10000.0
161af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel
162a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#define MIN(x,y) (((x) < (y)) ? (x) : (y))
163a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#define MAX(x,y) (((x) > (y)) ? (x) : (y))
164a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingWidth = 1920;
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingHeight = 1088;
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input)
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *buffer;
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pollfd pfds[2];
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event dqevent;
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].events = POLLIN | POLLERR;
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].fd = omx->drv_ctx.video_driver_fd;
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].fd = omx->m_poll_efd;
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->async_thread_force_stop) {
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = poll(pfds, 2, POLL_TIMEOUT);
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc) {
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Poll timedout");
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (rc < 0 && errno != EINTR && errno != EAGAIN) {
19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno);
19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) {
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited");
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) {
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_msginfo vdec_msg;
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&vdec_msg, 0, sizeof(vdec_msg));
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = omx->drv_ctx.num_planes;
20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (uint64_t)v4l2_buf.timestamp.tv_usec;
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) {
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_msginfo vdec_msg;
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = 1;
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pfds[0].revents & POLLPRI) {
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent);
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0];
24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1];
24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient");
24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(ptr[2] & V4L2_EVENT_BITDEPTH_FLAG) {
24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->dpb_bit_depth = ptr[3];
24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", ptr[3]);
24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(ptr[2] & V4L2_EVENT_PICSTRUCT_FLAG) {
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->m_progressive = ptr[4];
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig PicStruct change - %d", ptr[4]);
25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
254af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                if(ptr[2] & V4L2_EVENT_COLOUR_SPACE_FLAG) {
255af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    if (ptr[5] == MSM_VIDC_BT2020) {
256af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        omx->m_color_space = omx_vdec::BT2020;
257af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    } else {
258af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        omx->m_color_space = omx_vdec::EXCEPT_BT2020;
259af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    }
260af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig ColorSpace change - %d", omx->m_color_space);
261af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                }
26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
2688a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                uint32_t flush_type = *(uint32_t *)dqevent.u.data;
2698a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                // Old driver doesn't send flushType information.
2708a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                // To make this backward compatible fallback to old approach
2718a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                // if the flush_type is not present.
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
2738a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                if (!flush_type || (flush_type & V4L2_QCOM_CMD_FLUSH_OUTPUT)) {
2748a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
2758a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved");
2768a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    if (omx->async_message_process(input,&vdec_msg) < 0) {
2778a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                        DEBUG_PRINT_HIGH("async_message_thread Exited");
2788a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                        break;
2798a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    }
28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
2818a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel
2828a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                if (!flush_type || (flush_type & V4L2_QCOM_CMD_FLUSH_CAPTURE)) {
2838a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
2848a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved");
2858a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    if (omx->async_message_process(input,&vdec_msg) < 0) {
2868a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                        DEBUG_PRINT_HIGH("async_message_thread Exited");
2878a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                        break;
2888a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel                    }
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) {
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD;
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Overload received");
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) {
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED;
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Unsupported received");
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR;
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code = VDEC_S_SUCCESS;
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("SYS Error Recieved");
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) {
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]);
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) {
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]);
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.memory = V4L2_MEMORY_USERPTR;
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.length = omx->drv_ctx.num_planes;
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.m.planes = plane;
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.index = ptr[5];
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.flags = 0;
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code = VDEC_S_SUCCESS;
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf;
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.len = 0;
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2];
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) +
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (uint64_t)ptr[4];
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exitedn");
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                continue;
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread_dec(void *input)
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char id;
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int n;
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd_set readFds;
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int res = 0;
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct timeval tv;
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->message_thread_stop) {
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tv.tv_sec = 2;
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tv.tv_usec = 0;
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FD_ZERO(&readFds);
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FD_SET(omx->m_pipe_in, &readFds);
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv);
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (res < 0) {
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno));
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (res == 0 /*timeout*/ || omx->message_thread_stop) {
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        n = read(omx->m_pipe_in, &id, 1);
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (0 == n) {
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (1 == n) {
39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->process_event_cb(omx, id);
39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((n < 0) && (errno != EINTR)) {
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_vdec *omx, unsigned char id)
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret_value;
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret_value = write(omx->m_pipe_out, &id, 1);
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret_value <= 0) {
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno));
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor
41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::~omx_cmd_queue()
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Nothing to do
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id)
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].id       = id;
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].param1   = p1;
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].param2   = p2;
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_write++;
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_size ++;
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_write = 0;
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop
44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id)
44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_size > 0) {
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *id = m_q[m_read].id;
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *p1 = m_q[m_read].param1;
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *p2 = m_q[m_read].param2;
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Move the read pointer ahead
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ++m_read;
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        --m_size;
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_read = 0;
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_q[m_read].id;
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::ts_arr_list()
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //initialize timestamps array
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::~ts_arr_list()
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //free m_ts_arr_list?
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool duplicate_ts = false;
48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //insert at the first available empty location
49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_ts_arr_list[idx].valid) {
49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //found invalid or empty entry, save timestamp
49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_ts_arr_list[idx].valid = true;
49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_ts_arr_list[idx].timestamp = ts;
49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ts, idx);
49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int min_idx = -1;
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_TICKS min_ts = 0;
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_ts_arr_list[idx].valid) {
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //found valid entry, save index
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (min_idx < 0) {
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //first valid entry
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_ts = m_ts_arr_list[idx].timestamp;
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_idx = idx;
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_ts = m_ts_arr_list[idx].timestamp;
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_idx = idx;
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (min_idx < 0) {
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //no valid entries found
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts = 0;
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts = m_ts_arr_list[min_idx].timestamp;
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ts_arr_list[min_idx].valid = false;
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ts, min_idx);
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::reset_ts_list()
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ts_arr_list[idx].valid = false;
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// factory function executed by the core to create instances
56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void)
56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (new omx_vdec);
56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_user_handle_t handle, int ionMapfd)
57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) devicefd;
57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) size;
57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) base;
57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) handle;
57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) ionMapfd;
57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int fd, size_t size, void* base)
58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // dup file descriptor, map once, use pmem
58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init(dup(fd), base, size, 0 , MEM_DEVICE);
58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
587b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
588b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool is_platform_tp10capture_supported()
589b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{
590b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    char platform_name[PROPERTY_VALUE_MAX] = {0};
591b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    property_get("ro.board.platform", platform_name, "0");
5928a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel    if (!strncmp(platform_name, "msm8998", 7)) {
593b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_HIGH("TP10 on capture port is supported");
594b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        return true;
595b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
596b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    DEBUG_PRINT_HIGH("TP10 on capture port is not supported");
597b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    return false;
598b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel}
599b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::omx_vdec
60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Constructor
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_vdec(): m_error_propogated(false),
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_state(OMX_StateInvalid),
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_app_data(NULL),
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_mem_ptr(NULL),
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr(NULL),
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_flush_progress (false),
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_flush_progress (false),
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_use_buffer (false),
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_use_buffer (false),
62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers(false),
62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_output_pmem(OMX_FALSE),
62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_region_smi(OMX_FALSE),
62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_pvt_entry_pmem(OMX_FALSE),
62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers(0),
62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers(0),
62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bm_count(0),
62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bm_count(0),
63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bPopulated(OMX_FALSE),
63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bPopulated(OMX_FALSE),
63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_flags(0),
63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr(NULL),
63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bEnabled(OMX_TRUE),
63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bEnabled(OMX_TRUE),
63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_in_alloc_cnt(0),
63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list(NULL),
64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry(NULL),
64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info(NULL),
64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_parser(NULL),
64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    arbitrary_bytes (true),
64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    psource_frame (NULL),
64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pdest_frame (NULL),
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_heap_ptr (NULL),
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_phdr_pmem_ptr(NULL),
64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_inp_bm_count (0),
64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    codec_type_parse ((codec_type)0),
65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame_meta (true),
65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_count (0),
65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nal_count (0),
65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nal_length(0),
65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    look_ahead_nal (false),
65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame(0),
65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_buffer(NULL),
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame_size (0),
65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_device_file_ptr(NULL),
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_vc1_profile((vc1_profile_type)0),
66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_last_au_ts(LLONG_MAX),
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_last_au_flags(0),
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disp_hor_size(0),
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disp_vert_size(0),
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts(LLONG_MAX),
66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts_actual(LLONG_MAX),
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rst_prev_ts(true),
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frm_int(0),
668fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_fps_received(0),
669fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_fps_prev(0),
670fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_drc_enable(0),
67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    in_reconfig(false),
67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_display_id(NULL),
67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_extradata(0),
67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reject_avc_1080p_mp (0),
67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_enable_android_native_buffers(OMX_FALSE),
67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_android_native_buffers(OMX_FALSE),
67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_desc_buffer_ptr(NULL),
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_mode(false),
68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocate_native_handle(false),
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_other_extradata(NULL),
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_profile(0),
684a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    m_need_turbo(0),
68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_set_fps(false),
68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    stereo_output_mode(HAL_NO_3D),
68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_last_rendered_TS(-1),
68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_queued_codec_config_count(0),
68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL),
69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_scaling_to_non_secure_opb(false),
691b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_force_compressed_for_dpb(true),
69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_is_display_session(false)
69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_in = -1;
69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_out = -1;
69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = -1;
69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_driver_fd = -1;
69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.extradata_info.ion.fd_ion_data.fd = -1;
69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Assumption is that , to begin with , we have all the frames with decoder */
70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8);
70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_debug,0,sizeof(m_debug));
70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.level", property_value, "1");
705b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    debug_level = strtoul(property_value, NULL, 16);
70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.perf", property_value, "0");
71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    perf_flag = atoi(property_value);
71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec_time.start();
71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
716fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    proc_frms = latency = 0;
71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_n_filled_len = 0;
71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.ts", property_value, "0");
72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_timestamp = atoi(property_value);
72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        time_stamp_dts.set_timestamp_reorder_mode(true);
72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        time_stamp_dts.enable_debug_print(true);
72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.concealedmb", property_value, "0");
72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_concealedmb = atoi(property_value);
73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.profile.check", property_value, "0");
73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reject_avc_1080p_mp = atoi(property_value);
73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.log.in", property_value, "0");
73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.in_buffer_log = atoi(property_value);
74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.log.out", property_value, "0");
74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_buffer_log = atoi(property_value);
74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.meta.log.out", property_value, "0");
74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_meta_buffer_log = atoi(property_value);
74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.log.loc", property_value, "");
75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (*property_value)
75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.120fps.enabled", property_value, "0");
75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //if this feature is not enabled then reset this value -ve
76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(atoi(property_value)) {
76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("feature 120 FPS decode enabled");
76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_last_rendered_TS = 0;
76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.dyn.disabled", property_value, "0");
76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_dynamic_buf_mode = atoi(property_value);
76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode);
76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
770fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    property_value[0] = '\0';
771fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    property_get("vidc.dec.drc.enable", property_value, "0");
772fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (atoi(property_value)) {
773fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_drc_enable = true;
774fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_HIGH("DRC enabled");
775fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
776fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_
77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0");
78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_ubwc_mode = atoi(property_value);
78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled");
78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_ubwc_mode = true;
78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_cmp,0,sizeof(m_cmp));
78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_cb,0,sizeof(m_cb));
78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&drv_ctx,0,sizeof(drv_ctx));
78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams));
794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams));
795fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    memset(&m_client_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams));
796fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    memset(&m_internal_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams));
797a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    memset(&m_color_mdata, 0, sizeof(ColorMetaData));
79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    msg_thread_id = 0;
80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_id = 0;
80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    msg_thread_created = false;
80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_created = false;
80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_force_stop = false;
80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    message_thread_stop = false;
80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* invalidate m_frame_pack_arrangement */
81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_frame_pack_arrangement.cancel_flag = 1;
81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.timestamp_adjust = false;
81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_vendor_config.pData = NULL;
81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&m_lock, NULL);
81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&c_lock, NULL);
81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&buf_lock, NULL);
81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_init(&m_cmd_lock,0,0);
82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_init(&m_safe_flush, 0, 0);
82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    streaming[CAPTURE_PORT] =
82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[OUTPUT_PORT] = false;
82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char extradata_value[PROPERTY_VALUE_MAX] = {0};
82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.extradata", extradata_value, "0");
82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_extradata = atoi(extradata_value);
82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_buffers.set_vdec_client(this);
83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dynamic_buf_mode = false;
83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    out_dynamic_list = NULL;
83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = false;
834a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    m_enable_downscalar = 0;
83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_downscalar_width = 0;
83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_downscalar_height = 0;
83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_force_down_scalar = 0;
83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reconfig_height = 0;
83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reconfig_width = 0;
84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_mode = false;
84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_width = 0;
84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_height = 0;
84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_q6_platform = false;
84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_control.send_hint_to_mpctl(true);
84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_input_pass_buffer_fd = false;
84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_extradata_info, 0, sizeof(m_extradata_info));
847fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
848fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
849fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
850fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
851fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
852fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
853fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
854fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
856fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
857fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
858fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams);
859fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
860fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_client_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
861fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_internal_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
862fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_change_client_hdr_info = false;
863fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    pthread_mutex_init(&m_hdr_info_client_lock, NULL);
864af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel
865af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    char dither_value[PROPERTY_VALUE_MAX] = {0};
866af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    property_get("vidc.dec.dither", dither_value, "0");
867af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    if ((atoi(dither_value) > DITHER_ALL_COLORSPACE) ||
868af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        (atoi(dither_value) < DITHER_DISABLE)) {
869af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        m_dither_config = DITHER_ALL_COLORSPACE;
870af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    } else {
871af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        m_dither_config = is_platform_tp10capture_supported() ? (dither_type)atoi(dither_value) : DITHER_ALL_COLORSPACE;
872af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    }
873af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel
874af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    DEBUG_PRINT_HIGH("Dither config is %d", m_dither_config);
875b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_color_space = EXCEPT_BT2020;
87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = {
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT,
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE,
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER,
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_SYS_ERROR,
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_HW_OVERLOAD,
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd)
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < array_sz) {
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (--i; i >=0 ; i--) {
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&sub, 0, sizeof(sub));
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sub.type = event_type[i];
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::~omx_vdec
95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Destructor
95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None
95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::~omx_vdec()
96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info = NULL;
96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (msg_thread_created) {
96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread");
96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        message_thread_stop = true;
96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_message(this, OMX_COMPONENT_CLOSE_MSG);
96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_join(msg_thread_id,NULL);
97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_pipe_in);
97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_pipe_out);
97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_in = -1;
97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_out = -1;
97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(eventfd_write(m_poll_efd, 1)) {
97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno);
97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         async_thread_force_stop = true;
97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (async_thread_created)
98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_join(async_thread_id,NULL);
98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsubscribe_to_events(drv_ctx.video_driver_fd);
98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_poll_efd);
98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(drv_ctx.video_driver_fd);
98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&m_lock);
98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&c_lock);
98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&buf_lock);
98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_destroy(&m_cmd_lock);
990fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    pthread_mutex_destroy(&m_hdr_info_client_lock);
99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec_time.end();
99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd);
99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_control.send_hint_to_mpctl(false);
99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = 0;
100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) {
100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = 0;
101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format)
101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[2];
102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s",
102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         is_split_mode ? "split" : "combined",
102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc":
102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc":
102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb":
102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "unknown",
102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         capture_capability == V4L2_PIX_FMT_NV12 ? "nv12":
103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc":
1031b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel         capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC ? "nv12_10bit_ubwc":
103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "unknown");
103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE;
103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (is_split_mode) {
103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY;
103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY;
103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT;
104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].value = dpb_color_format;
104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 2;
104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls);
104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc);
105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1057b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt)
105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
1062b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool cpu_access = (capture_capability != V4L2_PIX_FMT_NV12_UBWC) &&
1063b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        capture_capability != V4L2_PIX_FMT_NV12_TP10_UBWC;
1064b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool tp10_enable = !cpu_access &&
1065b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10;
1066b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool dither_enable = true;
1067b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1068b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    switch (m_dither_config) {
1069b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_DISABLE:
1070b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = false;
1071b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1072b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_COLORSPACE_EXCEPTBT2020:
1073b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = (m_color_space == EXCEPT_BT2020);
1074b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1075b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_ALL_COLORSPACE:
1076b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = true;
1077b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1078b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    default:
1079b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_ERROR("Unsupported dither configuration:%d", m_dither_config);
1080b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1081b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1082b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (tp10_enable && !dither_enable) {
1083b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_TP10_UBWC;
1084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        capture_capability = V4L2_PIX_FMT_NV12_TP10_UBWC;
1085b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1086b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
1087b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1088b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1089b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1090b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("%s: Failed get format on capture mplane", __func__);
1091b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return OMX_ErrorUnsupportedSetting;
1092b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1093b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1094b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1095b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1096b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
1097b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return OMX_ErrorUnsupportedSetting;
1098b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1099b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1100b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1101b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_IDLE_PENDING) &&
110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Invalid state to decide on dpb-opb split");
110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cpu_access) {
111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Disabled split mode for VP9. In split mode the DPB buffers are part of the internal
111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * scratch buffers and the driver does not does the reference buffer management for
111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * scratch buffers. In case of VP9 with spatial scalability, when a sequence changed
111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * event is received with the new resolution, and when a flush is sent by the driver, it
111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * releases all the references of internal scratch buffers. However as per the VP9
111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * spatial scalability, even after the flush, the buffers which have not yet received
111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * release reference event should not be unmapped and freed. Currently in driver,
111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * reference buffer management of the internal scratch buffer is not implemented
112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * and hence the DPB buffers get unmapped. For other codecs it does not matter
112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * as with the new SPS/PPS, the DPB is flushed.
112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             */
1123b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bool is_not_vp9 = eCompressionFormat != OMX_VIDEO_CodingVP9;
1124b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bool eligible_for_split_dpb_ubwc =
1125b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               m_progressive == MSM_VIDC_PIC_STRUCT_PROGRESSIVE &&     //@ Due to Venus limitation for Interlaced, Split mode enabled only for Progressive.
1126b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               is_not_vp9                                       &&     //@ Split mode disabled for VP9.
1127b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               !drv_ctx.idr_only_decoding                       &&     //@ Split mode disabled for Thumbnail usecase.
1128b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               !m_disable_split_mode;                                  //@ Set prop to disable split mode
1129b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            //Since opb is linear, dpb should also be linear.
1131b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (split_opb_dpb_with_same_color_fmt) {
1132b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eligible_for_split_dpb_ubwc = false;
1133b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            }
1134b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1135b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (eligible_for_split_dpb_ubwc) {
113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //split DPB-OPB
113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB -> UBWC , OPB -> Linear
113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
1139b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            } else if (split_opb_dpb_with_same_color_fmt) {
114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //DPB -> Linear, OPB -> Linear
114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //DPB-OPB combined linear
114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //split DPB-OPB
114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //DPB -> UBWC, OPB -> Linear
114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else { //no cpu access
115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
1153b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (split_opb_dpb_with_same_color_fmt) {
115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //split DPB-OPB
115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB -> UBWC, OPB -> UBWC
115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB-OPB combined UBWC
115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
1162b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (dither_enable) {
1163b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //split DPB-OPB
1164b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //DPB -> TP10UBWC, OPB -> UBWC
1165b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1166b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            } else {
1167b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //combined DPB-OPB
1168b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //DPB -> TP10UBWC, OPB -> TP10UBWC
1169b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1170b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            }
117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet) {
117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet);
117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1177b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::enable_downscalar()
118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (is_down_scalar_enabled) {
118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: already enabled", __func__);
119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec::enable_downscalar");
119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = decide_dpb_buffer_mode(true);
119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__);
119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = true;
120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0x0, sizeof(struct v4l2_control));
120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO;
120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__);
120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::disable_downscalar()
121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!is_down_scalar_enabled) {
121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled");
122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = decide_dpb_buffer_mode(false);
122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__);
122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = false;
122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::decide_downscalar()
123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum color_fmts color_format;
12382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_U32 width, height;
1239a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    OMX_BOOL isPortraitVideo = OMX_FALSE;
124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1241b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC) {
1242b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = disable_downscalar();
1243b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1244b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("Disable downscalar failed!");
1245b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return rc;
1246b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1247b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        return 0;
1248b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1249b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1250a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if  (!m_enable_downscalar) {
125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: downscalar not supported", __func__);
125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1255a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#ifdef _QUERY_DISP_RES_
1256a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
1257a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1258a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
1259a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1260a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (rc < 0) {
1261a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
1262a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       return rc;
1263a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
1264a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    isPortraitVideo = fmt.fmt.pix_mp.width < fmt.fmt.pix_mp.height ? OMX_TRUE : OMX_FALSE;
1265a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (!m_downscalar_width || !m_downscalar_height) {
1266a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        qdutils::DisplayAttributes dpa = {}, dsa = {}, dva = {};
1267a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        int prim_config, ext_config, virt_config;
1268a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1269a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        prim_config = qdutils::getActiveConfig(qdutils::DISPLAY_PRIMARY);
1270a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        dpa = qdutils::getDisplayAttributes(prim_config, qdutils::DISPLAY_PRIMARY);
1271a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_HIGH("%s: Primary dpa.xres = %d  dpa.yres=%d   dpa.xdpi = %f  dpa.ydpi = %f ",
1272a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            __func__, dpa.xres, dpa.yres, dpa.xdpi, dpa.ydpi);
1273a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1274a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        ext_config = qdutils::getActiveConfig(qdutils::DISPLAY_EXTERNAL);
1275a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        dsa = qdutils::getDisplayAttributes(ext_config, qdutils::DISPLAY_EXTERNAL);
1276a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_HIGH("%s: HDMI dsa.xres = %d  dsa.yres = %d   dsa.xdpi = %f  dsa.ydpi = %f ",
1277a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            __func__, dsa.xres, dsa.yres, dsa.xdpi, dsa.ydpi);
1278a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1279a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        virt_config = qdutils::getActiveConfig(qdutils::DISPLAY_VIRTUAL);
1280a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        dva = qdutils::getDisplayAttributes(virt_config, qdutils::DISPLAY_VIRTUAL);
1281a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_HIGH("%s: Virtual dva.xres = %d  dva.yres = %d   dva.xdpi = %f  dva.ydpi = %f ",
1282a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            __func__, dva.xres, dva.yres, dva.xdpi, dva.ydpi);
1283a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1284a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        /* Below logic takes care of following conditions:
1285a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *   1. Choose display resolution as maximum resolution of all the connected
1286a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *      displays (secondary, primary, virtual), so that we do not downscale
1287a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *      unnecessarily which might be supported on one of the display losing quality.
1288a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *   2. Displays connected might be in landscape or portrait mode, so the xres might
1289a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *      be smaller or greater than the yres. So we first take the max of the two
1290a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *      in width and min of two in height and then rotate it if below point is true.
1291a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *   3. Video might also be in portrait mode, so invert the downscalar width and
1292a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         *      height for such cases.
1293a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         */
1294a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (dsa.xres * dsa.yres > dpa.xres * dpa.yres) {
1295a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_width = MAX(dsa.xres, dsa.yres);
1296a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_height = MIN(dsa.xres, dsa.yres);
1297a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        } else if (dva.xres * dva.yres > dpa.xres * dpa.yres) {
1298a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_width = MAX(dva.xres, dva.yres);
1299a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_height = MIN(dva.xres, dva.yres);
1300a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1301a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        } else {
1302a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_width = MAX(dpa.xres, dpa.yres);
1303a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_height = MIN(dpa.xres, dpa.yres);
1304a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
1305a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (isPortraitVideo) {
1306a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            // Swap width and height
1307a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_width = m_downscalar_width ^ m_downscalar_height;
1308a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_height = m_downscalar_width ^ m_downscalar_height;
1309a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_downscalar_width = m_downscalar_width ^ m_downscalar_height;
1310a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
1311a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
1312a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    m_downscalar_width = ALIGN(m_downscalar_width, 128);
1313a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    m_downscalar_height = ALIGN(m_downscalar_height, 32);
1314a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#endif
1315a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1316a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (!m_downscalar_width || !m_downscalar_height) {
1317a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_LOW("%s: Invalid downscalar configuration", __func__);
1318a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        return 0;
1319a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
1320a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_force_down_scalar) {
132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar);
132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return rc;
133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    height = fmt.fmt.pix_mp.height;
13362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    width = fmt.fmt.pix_mp.width;
13372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d m_is_display_session = %d", __func__,
133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height, m_is_display_session);
134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1341a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height > m_downscalar_width * m_downscalar_height) &&
134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         m_is_display_session) {
134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = enable_downscalar();
134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc < 0) {
134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        width = m_downscalar_width > fmt.fmt.pix_mp.width ?
135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fmt.fmt.pix_mp.width : m_downscalar_width;
13512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        height = m_downscalar_height > fmt.fmt.pix_mp.height ?
135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fmt.fmt.pix_mp.height : m_downscalar_height;
135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (capture_capability) {
135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12:
135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12;
135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_UBWC:
135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_UBWC;
135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_TP10_UBWC:
136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_BPP10_UBWC;
136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Color format not recognized\n");
136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = OMX_ErrorUndefined;
136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return rc;
136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = disable_downscalar();
137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc < 0) {
137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
13792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.height = height;
13802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.width = width;
138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = get_buffer_req(&drv_ctx.op_buf);
138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__);
139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::OMXCntrlProcessMsgCb
140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL Client callbacks are generated through this routine. The decoder
140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   provides the thread context for this routine.
140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ctxt -- Context information related to the self.
140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   id   -- Event identifier. This could be any of the following:
140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   1. Command completion event
140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   2. Buffer done callback event
141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   3. Frame done callback event
141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1; // Parameter - 1
141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2; // Parameter - 2
142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident;
142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned qsize=0; // qsize
142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec *pThis = (omx_vdec *) ctxt;
142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!pThis) {
142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__);
142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Protect the shared queue data structure
143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    do {
143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Read the message id's from the queue*/
143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&pThis->m_lock);
143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        qsize = pThis->m_cmd_q.m_size;
143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize) {
143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pThis->m_cmd_q.pop_entry(&p1, &p2, &ident);
143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize = pThis->m_ftb_q.m_size;
144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qsize) {
144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pThis->m_ftb_q.pop_entry(&p1, &p2, &ident);
144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize = pThis->m_etb_q.m_size;
144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qsize) {
144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pThis->m_etb_q.pop_entry(&p1, &p2, &ident);
145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&pThis->m_lock);
145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*process message if we have one*/
145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize > 0) {
145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id = ident;
145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (id) {
145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT:
145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pThis->m_cb.EventHandler) {
146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (p1) {
146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandStateSet:
146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_state = (OMX_STATETYPE) p2;
146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->m_state);
146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL);
146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_EventError:
147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (p2 == OMX_StateInvalid) {
147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_state = (OMX_STATETYPE) p2;
147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (p2 == (unsigned long)OMX_ErrorHardware) {
147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->omx_report_error();
147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandPortDisable:
148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2);
148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (BITMASK_PRESENT(&pThis->m_flags,
148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    break;
148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet !=  OMX_ErrorNone) {
149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_error();
149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandPortEnable:
150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2);
150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
1509a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                pThis->in_reconfig = false;
151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            default:
151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_ETB: {
153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_ERRORTYPE iret;
153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2);
153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (iret == OMX_ErrorInsufficientResources) {
153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload");
153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_hw_overload ();
153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else if (iret != OMX_ErrorNone) {
153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_error ();
153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_FTB:
154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\
154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_COMMAND:
155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_U32)p2,(OMX_PTR)NULL);
155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EBD:
155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->time_stamp_dts.remove_time_stamp(
156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp,
156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ?true:false);
156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) {
157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_error ();
157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            int64_t *timestamp = (int64_t *)(intptr_t)p1;
157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p1) {
157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->time_stamp_dts.remove_time_stamp(*timestamp,
157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        ?true:false);
158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                free(timestamp);
158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_FBD:
158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (p2 != VDEC_S_SUCCESS) {
158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->omx_report_error ();
158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) {
159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("fill_buffer_done failure");
159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->omx_report_error ();
159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!pThis->input_flush_progress) {
159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->execute_input_flush();
160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_cb.EventHandler) {
160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (p2 != VDEC_S_SUCCESS) {
160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->omx_report_error ();
160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else {
160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    /*Check if we need generate event for Flush done*/
160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_EventCmdComplete,OMX_CommandFlush,
161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_CORE_INPUT_PORT_INDEX,NULL );
161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_IDLE_PENDING)) {
161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->omx_report_error ();
162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        } else {
162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->streaming[OUTPUT_PORT] = false;
162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (!pThis->output_flush_progress) {
162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_LOW("Input flush done hence issue stop");
162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!pThis->output_flush_progress) {
164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->execute_output_flush();
164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_cb.EventHandler) {
164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (p2 != VDEC_S_SUCCESS) {
164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->omx_report_error ();
164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else {
164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    /*Check if we need generate event for Flush done*/
164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Notify Output Flush done");
165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_EventCmdComplete,OMX_CommandFlush,
165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_CORE_OUTPUT_PORT_INDEX,NULL );
165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Internal flush complete");
166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,
166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (BITMASK_PRESENT(&pThis->m_flags,
166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event(OMX_CommandPortDisable,
166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_CORE_OUTPUT_PORT_INDEX,
166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_EVENT);
166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            BITMASK_CLEAR (&pThis->m_flags,
166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            BITMASK_CLEAR (&pThis->m_flags,
167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->omx_report_error ();
167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            break;
168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->streaming[CAPTURE_PORT] = false;
168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (!pThis->input_flush_progress) {
168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_LOW("Output flush done hence issue stop");
168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_START_DONE:
169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Move to executing");
170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateExecuting;
170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateExecuting, NULL);
171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else if (BITMASK_PRESENT(&pThis->m_flags,
171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_COMPONENT_PAUSE_PENDING)) {
171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                          VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->omx_report_error ();
171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_LOW("Event Handler callback is NULL");
172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->complete_pending_buffer_done_cbs();
173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    //Send the callback now
173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StatePause;
173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StatePause, NULL);
174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_RESUME_DONE:
175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Moving the decoder to execute state");
175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateExecuting;
176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateExecuting,NULL);
176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_STOP_DONE:
177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->complete_pending_buffer_done_cbs();
178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateIdle;
178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Move to Idle State");
178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateIdle,NULL);
179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (p2 == OMX_IndexParamPortDefinition) {
180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition");
180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->in_reconfig = true;
1802a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                            pThis->m_need_turbo &= ~TURBO_MODE_HIGH_FPS;
180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }  else if (p2 == OMX_IndexConfigCommonOutputCrop) {
180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop");
180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Check if resolution is changed in smooth streaming mode */
180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_smoothstreaming_mode &&
180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                (pThis->framesize.nWidth !=
180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_width) ||
181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                (pThis->framesize.nHeight !=
181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height)) {
181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d",
181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->framesize.nWidth,
181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->framesize.nHeight,
181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width,
181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height);
181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                /* Update new resolution */
182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->framesize.nWidth =
182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       pThis->drv_ctx.video_resolution.frame_width;
182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->framesize.nHeight =
182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       pThis->drv_ctx.video_resolution.frame_height;
182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                /* Update C2D with new resolution */
182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (!pThis->client_buffers.update_buffer_req()) {
182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed");
182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Update new crop information */
183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left;
183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top;
183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right;
183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom;
183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Validate the new crop information */
183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->rectangle.nLeft + pThis->rectangle.nWidth >
183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->drv_ctx.video_resolution.frame_width) {
184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]",
184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->rectangle.nLeft, pThis->rectangle.nWidth,
184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width);
184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->rectangle.nLeft = 0;
184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (pThis->rectangle.nWidth >
184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_width) {
184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]",
185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->rectangle.nWidth,
185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->drv_ctx.video_resolution.frame_width);
185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nWidth =
185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width;
185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->rectangle.nTop + pThis->rectangle.nHeight >
185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->drv_ctx.video_resolution.frame_height) {
185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]",
186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nTop, pThis->rectangle.nHeight,
186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height);
186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->rectangle.nTop = 0;
186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (pThis->rectangle.nHeight >
186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height) {
186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]",
186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->rectangle.nHeight,
186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height);
187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nHeight =
187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height;
187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u",
187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nLeft, pThis->rectangle.nTop,
187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nWidth, pThis->rectangle.nHeight);
1877fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                        } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) {
1878fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects");
1879fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                        } else if (p2 == OMX_QTIIndexConfigDescribeHDRColorInfo) {
1880fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeHDRcolorinfo");
188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2);
188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            break;
188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.outfile) {
188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.outfile);
188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.outfile = NULL;
188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.out_ymeta_file) {
189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.out_ymeta_file);
189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.out_ymeta_file = NULL;
189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.out_uvmeta_file) {
189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.out_uvmeta_file);
189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.out_uvmeta_file = NULL;
189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) {
189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->prefetchNewBuffers();
190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            uint32_t frame_data[4];
190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ?
190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->m_reconfig_height : pThis->rectangle.nHeight;
190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ?
190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->m_reconfig_width : pThis->rectangle.nWidth;
190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[2] = (p2 == OMX_IndexParamPortDefinition) ?
191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                frame_data[0] : pThis->drv_ctx.video_resolution.frame_height;
191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[3] = (p2 == OMX_IndexParamPortDefinition) ?
191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                frame_data[1] : pThis->drv_ctx.video_resolution.frame_width;
191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data );
191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EOS_DONE:
192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->prev_ts = LLONG_MAX;
193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->rst_prev_ts = true;
193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_error();
193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING");
194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_unsupported_setting();
194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD:
194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD");
194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_hw_overload();
194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&pThis->m_lock);
195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        qsize = pThis->m_cmd_q.m_size;
195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pThis->m_state != OMX_StatePause)
195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&pThis->m_lock);
195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } while (qsize>0);
195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int format_changed = 0;
196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((height != (int)drv_ctx.video_resolution.frame_height) ||
196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (width != (int)drv_ctx.video_resolution.frame_width)) {
196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)",
196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                width, drv_ctx.video_resolution.frame_width,
196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                height,drv_ctx.video_resolution.frame_height);
197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        format_changed = 1;
197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.frame_height = height;
197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.frame_width = width;
197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.scan_lines = scan_lines;
197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.stride = stride;
1976fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1977fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (!is_down_scalar_enabled) {
1978fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nLeft = m_extradata_info.output_crop_rect.nLeft;
1979fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nTop = m_extradata_info.output_crop_rect.nTop;
1980fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nWidth = m_extradata_info.output_crop_rect.nWidth;
1981fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nHeight = m_extradata_info.output_crop_rect.nHeight;
198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return format_changed;
198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::is_video_session_supported()
198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE) &&
199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_decoder_capability.max_width = 1280;
199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_decoder_capability.max_height = 720;
199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((drv_ctx.video_resolution.frame_width *
199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height >
199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_width *
199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_height) ||
200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (drv_ctx.video_resolution.frame_width*
200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             drv_ctx.video_resolution.frame_height <
200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             m_decoder_capability.min_width *
200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             m_decoder_capability.min_height)) {
200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR(
200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_width,
200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height,
200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.min_width,
200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.min_height,
201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_width,
201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_height);
201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("video session supported");
201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len)
201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.in_buffer_log && !m_debug.infile) {
202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v",
202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc,
202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263",
202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) ||
203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264",
203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265",
203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) {
204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx",
205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = fopen (m_debug.infile_name, "ab");
205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.infile) {
205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.infile_name[0] = '\0';
205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct ivf_file_header {
206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 signature[4]; //='DKIF';
206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 version         ; //= 0;
206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 headersize      ; //= 32;
206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 FourCC;
206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 width;
206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 height;
206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 rate;
206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 scale;
207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 length;
207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 unused[4];
207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } file_header;
207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset((void *)&file_header,0,sizeof(file_header));
207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[0] = 'D';
207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[1] = 'K';
207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[2] = 'I';
207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[3] = 'F';
207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.version = 0;
208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.headersize = 32;
208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (drv_ctx.decoder_format) {
208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case VDEC_CODECTYPE_VP8:
208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    file_header.FourCC = 0x30385056;
208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case VDEC_CODECTYPE_VP9:
208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    file_header.FourCC = 0x30395056;
208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("unsupported format for VP8/VP9");
209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite((const char *)&file_header,
209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof(file_header),1,m_debug.infile);
209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         }
209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile && buffer_addr && buffer_len) {
209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vpx_ivf_frame_header {
210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 framesize;
210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 timestamp_lo;
210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 timestamp_hi;
210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } vpx_frame_header;
210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.framesize = buffer_len;
210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Currently FW doesn't use timestamp values */
210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.timestamp_lo = 0;
210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.timestamp_hi = 0;
210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite((const char *)&vpx_frame_header,
210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof(vpx_frame_header),1,m_debug.infile);
211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fwrite(buffer_addr, buffer_len, 1, m_debug.infile);
211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) {
211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int buf_index = 0;
211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *temp = NULL;
211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2120a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (!(m_debug.out_buffer_log || m_debug.out_meta_buffer_log) || !buffer || !buffer->nFilledLen)
2121a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        return 0;
2122a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
2123a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (m_debug.out_buffer_log && !m_debug.outfile) {
212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv",
212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = fopen (m_debug.outfile_name, "ab");
212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.outfile) {
212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc);
212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.outfile_name[0] = '\0';
213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2134a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file) {
213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta",
213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta",
213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab");
214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab");
214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) {
214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc);
214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.out_ymetafile_name[0] = '\0';
214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.out_uvmetafile_name[0] = '\0';
214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_index = buffer - m_out_mem_ptr;
215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2152b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC ||
2153b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)",
215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height);
215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_debug.outfile)
215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile);
216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) {
216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned int width = 0, height = 0;
216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned int y_plane, y_meta_plane;
216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int y_stride = 0, y_sclines = 0;
216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0;
2166b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            int color_fmt = (drv_ctx.output_format== VDEC_YUV_FORMAT_NV12_UBWC)? COLOR_FMT_NV12_UBWC: COLOR_FMT_NV12_BPP10_UBWC;
216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int i;
216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int bytes_written = 0;
216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            width = drv_ctx.video_resolution.frame_width;
217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            height = drv_ctx.video_resolution.frame_height;
217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_stride = VENUS_Y_STRIDE(color_fmt, width);
217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096);
218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i = 0; i < y_meta_scanlines; i++) {
218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file);
218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 temp += y_meta_stride;
218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane;
218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for(i = 0; i < uv_meta_scanlines; i++) {
219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file);
219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp += uv_meta_stride;
219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
2194a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    } else if (m_debug.outfile && drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride = drv_ctx.video_resolution.stride;
219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int scanlines = drv_ctx.video_resolution.scan_lines;
219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_smoothstreaming_mode) {
219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = drv_ctx.video_resolution.frame_width;
219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = drv_ctx.video_resolution.frame_height;
220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned i;
220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)",
220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height, stride, scanlines);
220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int bytes_written = 0;
220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             temp += stride;
221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride_c = stride;
221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp += stride_c;
221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentInit
222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Initialize the component.
222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ctxt -- Context information related to the self.
223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   id   -- Event identifier. This could be any of the following:
223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   1. Command completion event
223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   2. Buffer done callback event
223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   3. Frame done callback event
223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_fmtdesc fdesc;
224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_frmsizeenum frmsize;
224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int   alignment = 0,buffer_size = 0;
225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fds[2];
225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int r,ret=0;
225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool codec_ambiguous = false;
225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STRING device_name = (OMX_STRING)"/dev/video32";
225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *soc_file = NULL;
225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char buffer[10];
225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char platform_name[PROPERTY_VALUE_MAX];
226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("ro.board.platform", platform_name, "0");
226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(platform_name, "msm8610", 7)) {
226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        device_name = (OMX_STRING)"/dev/video/q6_dec";
226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        is_q6_platform = true;
226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        maxSmoothStreamingWidth = 1280;
226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        maxSmoothStreamingHeight = 720;
226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_thulium_v1 = false;
227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    soc_file = fopen("/sys/devices/soc0/soc_id", "r");
227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (soc_file) {
227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fread(buffer, 1, 4, soc_file);
227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(soc_file);
227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(buffer) == 246) {
227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            soc_file = fopen("/sys/devices/soc0/revision", "r");
227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (soc_file) {
227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fread(buffer, 1, 4, soc_file);
227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fclose(soc_file);
227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (atoi(buffer) == 1) {
228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_thulium_v1 = true;
228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE");
228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*
228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * turn off frame parsing for Android by default.
229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode
229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    arbitrary_bytes = false;
229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (atoi(property_value)) {
229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command");
229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = true;
229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",
230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",
230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2";
231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure",
231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.hevc";
231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure",
231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vc1";
232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.secure",
232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.wmv";
232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.secure",
232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg4";
233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.secure",
233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vp9";
233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (!strncmp(role, "OMX.qcom.video.decoder.vp8.secure",
233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vp8";
234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd);
234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.video_driver_fd < 0) {
234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.frame_rate.fps_denominator = 1;
235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    operating_frame_rate = DEFAULT_FPS;
235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = eventfd(0, 0);
235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_poll_efd < 0) {
235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno));
235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = subscribe_to_events(drv_ctx.video_driver_fd);
236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!ret) {
236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        async_thread_created = true;
236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = pthread_create(&async_thread_id,0,async_message_thread,this);
236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        async_thread_created = false;
236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    outputExtradataFile = fopen (output_extradata_filename, "ab");
237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Copy the role information which provides the decoder kind
237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    strlcpy(drv_ctx.kind,role,128);
237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.timestamp_adjust = true;
238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability=V4L2_PIX_FMT_MPEG4;
238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Initialize Start Code for MPEG4*/
238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_MPEG4;
238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_MPEG2;
239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Initialize Start Code for MPEG2*/
239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_MPEG2;
239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("H263 Decoder selected");
240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingH263;
240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_H263;
240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H263;
240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX_311;
241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX;
242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_ambiguous = true;
242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX;
243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_ambiguous = true;
243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability=V4L2_PIX_FMT_H264;
244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingAVC;
244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H264;
244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (is_thulium_v1) {
244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            arbitrary_bytes = true;
245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264");
245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\
245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MVC;
245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_H264_MVC;
245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC;
245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H264;
245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_HEVC;
246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_HEVC;
246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingWMV;
247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VC1;
247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingWMV;
248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VC1;
248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",    \
248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VP8;
249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VP8;
249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingVP8;
249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VP8;
249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",    \
249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VP9;
249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VP9;
249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingVP9;
250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VP9;
250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE dest_color_format;
250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disable_ubwc_mode) {
251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC;
251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC)
251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = (OMX_COLOR_FORMATTYPE)
251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = (OMX_COLOR_FORMATTYPE)
251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.set_color_format(dest_color_format)) {
252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting color format failed");
252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8;
252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_progressive = MSM_VIDC_PIC_STRUCT_PROGRESSIVE;
252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disable_ubwc_mode) {
252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            capture_capability = V4L2_PIX_FMT_NV12;
253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            capture_capability = V4L2_PIX_FMT_NV12_UBWC;
253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_capability cap;
253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to query capabilities");
253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " version = %d, capabilities = %x", cap.driver, cap.card,
254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cap.bus_info, cap.version, cap.capabilities);
254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=0;
254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index=0;
254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fdesc.pixelformat, fdesc.flags);
255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fdesc.index++;
255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index=0;
255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fdesc.pixelformat, fdesc.flags);
255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fdesc.index++;
255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
2560fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nLeft = 0;
2561fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nTop = 0;
2562fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nWidth = 320;
2563fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nHeight = 240;
256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        update_resolution(320, 240, 320, 240);
2565fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set format on output port");
257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Format was successful");
257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_ambiguous) {
257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_DIVX) {
257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control divx_ctrl;
258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ret) {
259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set divx version");
259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR);
260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_conceal_color= atoi(property_value);
260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color);
260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR;
260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = m_conceal_color;
260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret);
260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Get the hardware capabilities
261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset((void *)&frmsize,0,sizeof(frmsize));
261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frmsize.index = 0;
261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frmsize.pixel_format = output_capability;
261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd,
261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VIDIOC_ENUM_FRAMESIZES, &frmsize);
261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to get framesizes");
261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.min_width = frmsize.stepwise.min_width;
262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.max_width = frmsize.stepwise.max_width;
262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.min_height = frmsize.stepwise.min_height;
262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.max_height = frmsize.stepwise.max_height;
262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set format on capture port");
263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE));
263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        framesize.nWidth = drv_ctx.video_resolution.frame_width;
263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        framesize.nHeight = drv_ctx.video_resolution.frame_height;
264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE));
264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rectangle.nWidth = drv_ctx.video_resolution.frame_width;
264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rectangle.nHeight = drv_ctx.video_resolution.frame_height;
264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Format was successful");
264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode) {
264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = 1;
264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (output_capability == V4L2_PIX_FMT_H264_MVC) {
265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT;
265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM;
265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to set MVC buffer layout");
266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (is_thulium_v1) {
266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = enable_smoothstreaming();
266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet != OMX_ErrorNone) {
266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver");
267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               return eRet;
267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Get the Buffer requirements for input and output ports*/
267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode) {
267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.alignment = SECURE_ALIGN;
268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf.alignment = SECURE_ALIGN;
268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.alignment = SZ_4K;
268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf.alignment = SZ_4K;
268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata = 0;
268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.idr_only_decoding = 0;
269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
2695a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        property_get("vidc.dec.enable.downscalar",property_value,"0");
269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value)) {
2697a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_enable_downscalar =  atoi(property_value);
2698a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            property_get("vidc.dec.downscalar_width",property_value,"0");
2699a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (atoi(property_value)) {
2700a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_downscalar_width = atoi(property_value);
2701a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
2702a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            property_get("vidc.dec.downscalar_height",property_value,"0");
2703a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (atoi(property_value)) {
2704a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_downscalar_height = atoi(property_value);
2705a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2707a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (m_downscalar_width < m_decoder_capability.min_width ||
2708a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_downscalar_height < m_decoder_capability.min_height) {
2709a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_downscalar_width = 0;
2710a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_downscalar_height = 0;
2711a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2713a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n",
2714a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_downscalar_width, m_downscalar_height);
2715a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.disable.split.mode",property_value,"0");
271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_disable_split_mode = atoi(property_value);
271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("split mode is %s", m_disable_split_mode ? "disabled" : "enabled");
271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_state = OMX_StateLoaded;
272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef DEFAULT_EXTRADATA
272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enable_extradata(DEFAULT_EXTRADATA, true, true);
272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = get_buffer_req(&drv_ctx.ip_buf);
272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size);
272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        get_buffer_req(&drv_ctx.op_buf);
272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC ||
272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nFilledLen = 0;
273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nOffset = 0;
273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (h264_scratch.pBuffer == NULL) {
273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_frame_parser.mutils == NULL) {
274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_frame_parser.mutils = new H264_Utils();
274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_frame_parser.mutils == NULL) {
274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorInsufficientResources;
274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_frame_parser.mutils->initialize_frame_checking_environment();
274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_parser = new h264_stream_parser();
275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!h264_parser) {
275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pipe(fds)) {
276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("pipe creation failed");
276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pipe_in = fds[0];
276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pipe_out = fds[1];
276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            msg_thread_created = true;
276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            r = pthread_create(&msg_thread_id,0,message_thread_dec,this);
276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (r < 0) {
277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("component_init(): message_thread_dec creation failed");
277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                msg_thread_created = false;
277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone) {
277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Component Init Failed");
277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d",
278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_driver_fd);
278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetComponentVersion
279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns the component version.
279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   TBD.
279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_ErrorNone.
279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_component_version
280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp,
280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName,
280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion,
280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion,
280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID
280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel )
280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentName;
281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentVersion;
281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentUUID;
281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* TBD -- Return the proper version */
281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (specVersion) {
282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        specVersion->nVersion = OMX_SPEC_VERSION;
282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommand
282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_COMMANDTYPE cmd,
284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32 param1,
284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR cmdData
284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) cmdData;
284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "to invalid port: %u", (unsigned int)param1);
285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_wait(&m_cmd_lock);
286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command: Command Processed");
286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommand
286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_COMMANDTYPE cmd,
288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32 param1,
288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR cmdData
288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) cmdData;
288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int bFlag = 1,sem_posted = 0,ret=0;
288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state, eState);
289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cmd == OMX_CommandStateSet) {
289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Loaded */
289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_state == OMX_StateLoaded) {
290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateIdle) {
290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //if all buffers are allocated or all ports disabled
290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (allocate_done() ||
290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Skip the event notification
291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Loaded */
291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to WaitForResources */
292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Executing */
292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Pause */
293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Invalid */
294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eState);
294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is IDLE */
295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateIdle) {
295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateLoaded) {
295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (release_done()) {
295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*
2959a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                     * Since error is None , we will post an event at the end
2960a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                     * of this function definition
2961a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                     * Reset buffer requirements here to ensure setting buffer requirement
2962a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                     * when component move to executing state from loaded state via Idle.
296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     */
2964a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    drv_ctx.op_buf.buffer_size = 0;
2965a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    drv_ctx.op_buf.actualcount = 0;
296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Skip the event notification
297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Executing */
297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state=OMX_StateExecuting;
298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Idle */
298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateIdle) {
298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to WaitForResources */
299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Pause */
299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*To pause the Video core we need to start the driver*/
300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      NULL) < */0) {
300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorHardware;
300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Invalid */
301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /******************************/
302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Executing */
302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /******************************/
302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateExecuting) {
302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Idle */
302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateIdle) {
302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition
303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 */
303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!sem_posted) {
303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_posted = 1;
303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post (&m_cmd_lock);
303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_ALL);
303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Paused */
304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("PAUSE Command Issued");
304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state = OMX_StatePause;
304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Loaded */
304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to WaitForResources */
305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Executing */
306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Invalid */
306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Pause  */
308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StatePause) {
308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Executing */
308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateExecuting) {
308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pause --> Executing");
308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state = OMX_StateExecuting;
308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Idle */
308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateIdle) {
309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pause --> Idle");
309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!sem_posted) {
309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_posted = 1;
309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post (&m_cmd_lock);
309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_ALL);
309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to loaded */
310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> loaded");
310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to WaitForResources */
310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Pause */
311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> Pause");
311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Invalid */
312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> Invalid");
312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is WaitForResources  */
313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateWaitForResources) {
313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Loaded */
313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateLoaded) {
313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to WaitForResources */
314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,
314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Executing */
315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Pause */
315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Invalid */
316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Loaded -
317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               is NOT tested by Khronos TS */
317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /********************************/
317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Current State is Invalid */
317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*******************************/
318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (m_state == OMX_StateInvalid) {
318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* State Transition from Inavlid to any state */
318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || OMX_StateIdle || OMX_StateExecuting
318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || OMX_StatePause || OMX_StateInvalid)) {
318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_EventError,OMX_ErrorInvalidState,\
318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInvalidState;
318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (cmd == OMX_CommandFlush) {
319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        send_codec_config();
319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX ||
319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    param1 == OMX_ALL)) {
319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (android_atomic_add(0, &m_queued_codec_config_count) > 0) {
319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               struct timespec ts;
320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               clock_gettime(CLOCK_REALTIME, &ts);
320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               ts.tv_sec += 2;
320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ",
320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       m_queued_codec_config_count);
320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED);
320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (sem_timedwait(&m_safe_flush, &ts)) {
320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers");
320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED);
321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!sem_posted) {
322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sem_posted = 1;
322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set the Semaphore");
322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sem_post (&m_cmd_lock);
322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            execute_omx_flush(param1);
322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bFlag = 0;
322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ( cmd == OMX_CommandPortEnable) {
322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bEnabled = OMX_TRUE;
323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_state == OMX_StateLoaded &&
323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || allocate_input_done()) {
323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Enable output Port command recieved");
324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bEnabled = OMX_TRUE;
324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_state == OMX_StateLoaded &&
324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || (allocate_output_done())) {
325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* enable/disable downscaling if required */
326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = decide_downscalar();
326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ret) {
326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("decide_downscalar failed\n");
326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (cmd == OMX_CommandPortDisable) {
326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            codec_config_flag = false;
327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bEnabled = OMX_FALSE;
327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    && release_input_done()) {
327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!sem_posted) {
328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_posted = 1;
328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_post (&m_cmd_lock);
328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bEnabled = OMX_FALSE;
329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Disable output Port command recieved");
329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    && release_output_done()) {
329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!sem_posted) {
330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_posted = 1;
330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_post (&m_cmd_lock);
330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone && bFlag) {
331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!sem_posted) {
332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sem_post(&m_cmd_lock);
332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ExecuteOmxFlush
332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Executes the OMX flush.
333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   flushtype - input flush(1)/output flush(0)/ both.
333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane;
334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_decoder_cmd dec;
334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType);
334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_flush_progress = true;
335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* XXX: The driver/hardware does not support flushing of individual ports
335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * in all states. So we pretty much need to flush both ports internally,
335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * we automatically omit sending the FLUSH done for the "opposite" port. */
336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_flush_progress = true;
336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_flush_progress = true;
336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        request_perf_level(VIDC_TURBO);
336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType);
336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = false;
337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*=========================================================================
337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush
337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION
337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at OUTPUT PORT.
337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS
338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone.
338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE
338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false
338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/
338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_output_flush()
338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1 = 0; // Parameter - 1
338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2 = 0; // Parameter - 2
339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident = 0;
339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = true;
339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Generate FBD for all Buffers in the FTBq*/
339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Initiate Output Flush");
339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //reset last render TS
339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(m_last_rendered_TS > 0) {
339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_last_rendered_TS = 0;
340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_ftb_q.m_size) {
340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d",
340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_ftb_q.m_size,pending_output_buffers);
340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.pop_entry(&p1,&p2,&ident);
340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2);
340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == m_fill_output_msg ) {
340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2);
340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1);
341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_flush_progress = false;
341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = LLONG_MAX;
341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*=========================================================================
342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush
342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION
342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT PORT.
342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS
343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone.
343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE
343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false
343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/
343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_input_flush()
343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned       i =0;
343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1 = 0; // Parameter - 1
343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2 = 0; // Parameter - 2
344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident = 0;
344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = true;
344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Generate EBD for all Buffers in the ETBq*/
344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Initiate Input Flush");
344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Check if the Queue is empty");
344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_etb_q.m_size) {
344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.pop_entry(&p1,&p2,&ident);
345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_input_buffers++;
3456b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_BUFFERHEADERTYPE *)p1);
346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    time_stamp_dts.flush_timestamp();
346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if Heap Buffers are to be flushed*/
346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes && !(codec_config_flag)) {
346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Reset all the variables before flusing");
347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.nFilledLen = 0;
347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_count = 0;
347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_count = 0;
347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_ts = LLONG_MAX;
347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_flags = 0;
347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_entries = 0;
347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Initialize parser");
347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.mutils) {
348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_frame_parser.mutils->initialize_frame_checking_environment();
348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (m_input_pending_q.m_size) {
348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&p1,&p2,&ident);
348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame) {
348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame) {
349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen = 0;
349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL,
349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)NULL);
349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = NULL;
349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.flush();
350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec_config_flag) {
350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "is not sent to the driver yet");
350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_flush_progress = false;
350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes) {
350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = LLONG_MAX;
350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_timestamp_list.reset_ts_list();
351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommandEvent
352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Send the event to decoder pipe.  This is needed to generate the callbacks
352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   in decoder thread context.
352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::post_event(unsigned long p1,
353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p2,
353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long id)
353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Just drop messages typically generated by hardware (w/o client request),
354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * if we've reported an error to client. */
354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_error_propogated) {
354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (id) {
354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Dropping message %lx "
354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "since client expected to be in error state", id);
354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* whatever */
355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (id == m_fill_output_msg ||
355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_FBD ||
356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_PORT_RECONFIG ||
356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) {
356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.insert_entry(p1,p2,id);
356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EBD ||
356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY ||
356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) {
356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.insert_entry(p1,p2,id);
356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cmd_q.insert_entry(p1,p2,id);
357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet = true;
357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_message(this, id);
357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!profileLevelType)
358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (profileLevelType->nPortIndex == 0) {
358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
3589a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            profileLevelType->eLevel = OMX_VIDEO_AVCLevel51;
359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 2) {
359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 3) {
359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline;
359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 4) {
359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh;
360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)profileLevelType->nProfileIndex);
360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh;
360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = QOMX_VIDEO_MVCLevel51;
360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain;
361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10;
362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
3621a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            } else if (profileLevelType->nProfileIndex == 2) {
3622a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10HDR10;
3623a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)profileLevelType->nProfileIndex);
362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind);
366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u",
367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          (unsigned int)profileLevelType->nPortIndex);
367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetParameter
368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Get Parameter method implementation
368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Error None if successful.
368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE paramIndex,
369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_PTR     paramData)
369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_parameter:");
369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Param in Invalid State");
370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL) {
370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)paramIndex) {
370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition: {
370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               decide_dpb_buffer_mode(is_down_scalar_enabled);
371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = update_portdef(portDefn);
371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (eRet == OMX_ErrorNone)
371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_port_def = *portDefn;
371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoInit: {
372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *portParamType =
372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nPorts           = 2;
372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nStartPortNumber = 0;
372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat: {
373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                portFmt->nSize             = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE);
373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (0 == portFmt->nPortIndex) {
374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (0 == portFmt->nIndex) {
374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eCompressionFormat = eCompressionFormat;
374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore compression formats");
374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet =  OMX_ErrorNoMore;
374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (1 == portFmt->nPortIndex) {
375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // Distinguish non-surface mode from normal playback use-case based on
375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2"
375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // For non-android, use the default list
375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // Also use default format-list if FLEXIBLE YUV is supported,
375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // as the client negotiates the standard color-format if it needs to
375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    bool useNonSurfaceMode = false;
375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED)
375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE);
376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (is_thulium_v1) {
376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex);
376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat = useNonSurfaceMode ?
376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) :
376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            getPreferredColorFormatDefaultMode(portFmt->nIndex);
376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) {
377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorNoMore;
377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore Color formats");
377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat);
377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (int)portFmt->nPortIndex);
377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorBadPortIndex;
377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /*Component should support this port definition*/
378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamAudioInit: {
378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *audioPortParamType =
378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nPorts           = 0;
379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nStartPortNumber = 0;
379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          /*Component should support this port definition*/
379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamImageInit: {
379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *imagePortParamType =
379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nPorts           = 0;
380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nStartPortNumber = 0;
380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          /*Component should support this port definition*/
380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamOtherInit: {
380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              eRet =OMX_ErrorUnsupportedIndex;
381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole: {
381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role->nSize = sizeof(*comp_role);
382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          paramIndex);
382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          OMX_MAX_STRINGNAME_SIZE);
382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              /* Added for parameter test */
382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt: {
382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PRIORITYMGMTTYPE *priorityMgmType =
383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 (OMX_PRIORITYMGMTTYPE *) paramData;
383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE);
383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         /* Added for parameter test */
383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier: {
384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE);
384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (0 == bufferSupplierType->nPortIndex)
384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else if (1 == bufferSupplierType->nPortIndex)
385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else
385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadPortIndex;
385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc: {
385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x",
386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263: {
386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4: {
387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg2: {
387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelQuerySupported: {
388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = get_supported_profile_level(profileLevelType);
388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams);
389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (secure_mode && !secure_scaling_to_non_secure_opb) {
389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        GRALLOC_USAGE_PRIVATE_UNCACHED);
390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
390511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorBadParameter;
390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    break;
390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED
391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexFlexibleYUVDescription: {
391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: describeColorFormat");
391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams);
391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = describeColorFormat(paramData);
391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
391711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
391811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
391911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent: {
392011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
392111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
392211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             struct v4l2_control profile_control, level_control;
392311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             switch (drv_ctx.decoder_format) {
392511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 case VDEC_CODECTYPE_H264:
392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     break;
392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 default:
393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264");
393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     eRet = OMX_ErrorNotImplemented;
393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     break;
393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) {
393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) {
393711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
393911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileBaseline;
394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileMain;
394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileExtended;
394611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
394711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
394811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh;
394911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
395011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh10;
395211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
395311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
395411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh422;
395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA:
395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA:
395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA:
396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA:
396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE:
396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH:
396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA:
396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH:
396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH:
396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH:
396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = OMX_ErrorUnsupportedIndex;
396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) {
397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch ((enum v4l2_mpeg_video_h264_level)level_control.value) {
397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel1;
397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel1b;
398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel11;
398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel12;
398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel13;
399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel2;
399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel21;
399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel22;
400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel3;
400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel31;
400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel32;
400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel4;
401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel41;
401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel42;
401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel5;
402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel51;
4024d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                        break;
402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_2:
402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel52;
402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         }
40362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QTIIndexParamVideoClientExtradata:
40372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
40382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
40392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVideoClientExtradata");
40402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
40412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
40422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            pParam->nExtradataSize = VENUS_EXTRADATA_SIZE(4096, 2160);
40432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            pParam->nExtradataAllocSize = pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS;
40442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            eRet = OMX_ErrorNone;
40452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
40462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
4047af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        case OMX_QTIIndexParamDitherControl:
4048af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        {
4049af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL);
4050af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("get_parameter: QOMX_VIDEO_DITHER_CONTROL");
4051af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            QOMX_VIDEO_DITHER_CONTROL *pParam =
4052af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                (QOMX_VIDEO_DITHER_CONTROL *) paramData;
4053af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            pParam->eDitherType = (QOMX_VIDEO_DITHERTYPE) m_dither_config;
4054af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            eRet = OMX_ErrorNone;
4055af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            break;
4056af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        }
405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default: {
405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet =OMX_ErrorUnsupportedIndex;
406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height,
406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.stride,
406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.scan_lines);
406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((params == NULL) ||
408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (params->nativeBuffer == NULL) ||
408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (params->nativeBuffer->handle == NULL) ||
408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            !m_enable_android_native_buffers)
408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_android_native_buffers = OMX_TRUE;
408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private_handle_t *handle = (private_handle_t *)nBuf->handle;
408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *buffer = NULL;
409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = (OMX_U8*)mmap(0, handle->size,
409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
409311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buffer == MAP_FAILED) {
409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() {
410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
411311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
411411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorHardware;
411511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
411611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_mode = true;
411711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::Setparameter
412311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
412411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Set Parameter method implementation.
412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE paramIndex,
413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR        paramData)
413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret=0;
414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Set Param in Invalid State");
414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL) {
414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((m_state != OMX_StateLoaded) &&
415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_out_bEnabled == OMX_TRUE) &&
415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_inp_bEnabled == OMX_TRUE)) {
415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Set Param in Invalid State");
415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)paramIndex) {
416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition: {
416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
416611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               //been called.
416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (int)portDefn->format.video.nFrameHeight,
416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (int)portDefn->format.video.nFrameWidth);
417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4171fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d",
417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                          portDefn->nBufferCountActual);
417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorBadParameter;
417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (OMX_DirOutput == portDefn->eDir) {
417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bool port_format_changed = false;
418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_display_id = portDefn->format.video.pNativeWindow;
418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   unsigned int buffer_size;
418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   /* update output port resolution with client supplied dimensions
418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      in case scaling is enabled, else it follows input resolution set
418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   */
418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   decide_dpb_buffer_mode(is_down_scalar_enabled);
418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (is_down_scalar_enabled) {
418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)",
418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameWidth,
418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameHeight);
419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (portDefn->format.video.nFrameHeight != 0x0 &&
419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->format.video.nFrameWidth != 0x0) {
419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Get Resolution failed");
419811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorHardware;
419911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) ||
420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) {
420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   port_format_changed = true;
420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           /* set crop info */
420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nLeft = 0;
420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nTop = 0;
420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nWidth = portDefn->format.video.nFrameWidth;
421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nHeight = portDefn->format.video.nFrameHeight;
421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4212fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nLeft = 0;
4213fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nTop = 0;
4214fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nWidth = rectangle.nWidth;
4215fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nHeight = rectangle.nHeight;
4216fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = is_video_session_supported();
421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (eRet)
421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
42222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           fmt.fmt.pix_mp.height = (unsigned int)portDefn->format.video.nFrameHeight;
42232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           fmt.fmt.pix_mp.width = (unsigned int)portDefn->format.video.nFrameWidth;
422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width);
422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Set Resolution failed");
423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else
423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = get_buffer_req(&drv_ctx.op_buf);
423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (eRet) {
423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (secure_mode) {
424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           struct v4l2_control control;
424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD;
424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id);
424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorHardware;
424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else {
424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               /* This is a workaround for a bug in fw which uses stride
424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                * and slice instead of width and height to check against
424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                * the threshold.
424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                */
425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               OMX_U32 stride, slice;
425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth);
425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight);
425411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
425511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth);
425611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight);
4257b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
4258b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameWidth);
4259b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameHeight);
426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               } else {
426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = portDefn->format.video.nFrameWidth;
426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = portDefn->format.video.nFrameHeight;
426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
426511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice);
426611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("Threshold value is %d\n", control.value);
426711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
426811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (stride * slice <= (OMX_U32)control.value) {
426911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   secure_scaling_to_non_secure_opb = true;
427011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ");
427111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2;
427211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   control.value = 1;
427311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) {
427411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       DEBUG_PRINT_ERROR("Enabling non-secure output2 failed");
427511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       eRet = OMX_ErrorUnsupportedSetting;
427611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   }
427711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
427811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
427911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
428011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
428111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
428211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (eRet) {
428311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
428411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
428511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
428611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
428711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)",
428811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
428911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   } else if (!client_buffers.get_buffer_req(buffer_size)) {
429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Error in getting buffer requirements");
429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   } else if (!port_format_changed) {
429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4295fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                       // Buffer count can change only when port is unallocated
4296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                       if (m_out_mem_ptr &&
4297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount ||
4298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) {
4299fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !");
430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorInvalidState;
430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // route updating of buffer requirements via c2d proxy.
430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // Based on whether c2d is enabled, requirements will be handed
430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // to the vidc driver appropriately
430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = client_buffers.set_buffer_req(portDefn->nBufferSize,
430911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                portDefn->nBufferCountActual);
431011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (eRet == OMX_ErrorNone) {
431111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           m_port_def = *portDefn;
431211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)",
431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   drv_ctx.op_buf.mincount, (unsigned int)buffer_size,
431511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorBadParameter;
431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else if (OMX_DirInput == portDefn->eDir) {
432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bool port_format_changed = false;
432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if ((portDefn->format.video.xFramerate >> 16) > 0 &&
432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // Frame rate only should be set if this is a "known value" or to
432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // activate ts prediction logic (arbitrary mode only) sending input
432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // timestamps with max value (LLONG_MAX).
4327fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                       m_fps_received = portDefn->format.video.xFramerate;
432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u",
432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.xFramerate >> 16);
433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.frame_rate.fps_denominator);
433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (!drv_ctx.frame_rate.fps_numerator) {
433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator = 30;
433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (drv_ctx.frame_rate.fps_denominator)
433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator = (int)
433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.frame_rate.fps_denominator = 1;
434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator;
434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (float)drv_ctx.frame_rate.fps_denominator);
434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_outputparm oparm;
434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       /*XXX: we're providing timing info as seconds per frame rather than frames
434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        * per second.*/
434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_streamparm sparm;
435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sparm.parm.output = oparm;
435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected");
435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorHardware;
435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_perf_control.request_cores(frm_int);
436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (drv_ctx.video_resolution.frame_height !=
436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           portDefn->format.video.nFrameHeight ||
436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.video_resolution.frame_width  !=
436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           portDefn->format.video.nFrameWidth) {
436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)",
436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameWidth,
436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameHeight);
437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       port_format_changed = true;
437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 frameWidth = portDefn->format.video.nFrameWidth;
437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 frameHeight = portDefn->format.video.nFrameHeight;
437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (frameHeight != 0x0 && frameWidth != 0x0) {
437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (m_smoothstreaming_mode &&
437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   ((frameWidth * frameHeight) <
437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   (m_smoothstreaming_width * m_smoothstreaming_height))) {
437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frameWidth = m_smoothstreaming_width;
437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frameHeight = m_smoothstreaming_height;
437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u "
438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       "for adaptive-playback/smooth-streaming",
438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       (unsigned int)frameWidth, (unsigned int)frameHeight);
438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
4383fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
4384fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nLeft = 0;
4385fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nTop = 0;
4386fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nWidth = frameWidth;
4387fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nHeight = frameHeight;
4388fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           update_resolution(frameWidth, frameHeight,
439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   frameWidth, frameHeight);
439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = is_video_session_supported();
439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (eRet)
439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
43942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           if (is_down_scalar_enabled) {
43952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
43962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
43972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
43982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
43992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = output_capability;
44002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               DEBUG_PRINT_LOW("DS Enabled : height = %d , width = %d",
44012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
44022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
44032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           } else {
44042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
44052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
44062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
44072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
44082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = output_capability;
44092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               DEBUG_PRINT_LOW("DS Disabled : height = %d , width = %d",
44102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
44112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
44122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
44132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = capture_capability;
44142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
44152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           }
441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Set Resolution failed");
441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else {
442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (!is_down_scalar_enabled)
442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   eRet = get_buffer_req(&drv_ctx.op_buf);
442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (m_custom_buffersize.input_buffersize
442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) {
442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d",
442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               m_custom_buffersize.input_buffersize, portDefn->nBufferSize);
442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)",
443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
4438fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                   // Buffer count can change only when port is unallocated
4439fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                   if (m_inp_mem_ptr &&
4440fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount ||
4441fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) {
444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !");
444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorInvalidState;
444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       port_format_changed = true;
445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (~(buffer_prop->alignment - 1));
445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = set_buffer_req(buffer_prop);
445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (false == port_format_changed) {
445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)",
445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size,
445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else if (portDefn->eDir ==  OMX_DirMax) {
446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (int)portDefn->nPortIndex);
446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorBadPortIndex;
446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat: {
447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                int ret=0;
447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                struct v4l2_format fmt;
447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u",
447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex);
447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                memset(&fmt, 0x0, sizeof(struct v4l2_format));
447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (1 == portFmt->nPortIndex) {
448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
44812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
44822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    if (ret < 0) {
44832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                        DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
44842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                        return OMX_ErrorBadParameter;
44852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    }
448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    enum vdec_output_fromat op_format;
448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
44882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m ||
448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
44902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView ||
449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar ||
449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
44952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC;
449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else
449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorBadParameter;
449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
45012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC;
450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12;
450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet == OMX_ErrorNone) {
450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        drv_ctx.output_format = op_format;
450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (ret) {
451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Set output format failed");
451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorUnsupportedSetting;
451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /*TODO: How to handle this case */
451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = get_buffer_req(&drv_ctx.op_buf);
451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet == OMX_ErrorNone) {
451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Set color format failed");
452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorBadParameter;
452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPortDefn: {
452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u",
453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (unsigned int)portFmt->nFramePackingFormat);
453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Input port */
453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (portFmt->nPortIndex == 0) {
4537fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // arbitrary_bytes mode cannot be changed arbitrarily since this controls how:
4538fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                //   - headers are allocated and
4539fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                //   - headers-indices are derived
4540fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // Avoid changing arbitrary_bytes when the port is already allocated
4541fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                if (m_inp_mem_ptr) {
4542fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!");
4543fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    return OMX_ErrorUnsupportedSetting;
4544fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                }
454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (secure_mode || m_input_pass_buffer_fd) {
454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = false;
454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode");
454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorUnsupportedSetting;
455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = true;
455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (portFmt->nFramePackingFormat ==
455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    arbitrary_bytes = false;
455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (atoi(property_value)) {
455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command");
456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = true;
456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u",
456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (unsigned int)portFmt->nFramePackingFormat);
456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorUnsupportedSetting;
456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    m_out_mem_region_smi = OMX_TRUE;
457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        m_use_output_pmem = OMX_TRUE;
457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_MAX_STRINGNAME_SIZE)) {
458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            arbitrary_bytes = true;
458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264");
458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole: {
458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          comp_role->cRole);
459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  if ((m_state == OMX_StateLoaded)&&
459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) {
459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_LOW("Set Parameter called in valid state");
459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else {
459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      return OMX_ErrorIncorrectStateOperation;
460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE);
460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE);
462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE);
462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE);
463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) ||
463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) ||
464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE))
464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ) {
464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) {
464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE);
464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) ||
464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE))
465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ) {
465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE);
465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE);
466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) ||
466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE);
466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else {
468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = OMX_ErrorInvalidComponentName;
468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt: {
468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             if (m_state != OMX_StateLoaded) {
469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 return OMX_ErrorIncorrectStateOperation;
469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             }
469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (unsigned int)priorityMgmtype->nGroupID);
469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (unsigned int)priorityMgmtype->nGroupPriority);
469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier: {
470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           bufferSupplierType->eBufferSupplier);
471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else
471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadPortIndex;
471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc: {
472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d",
472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263: {
473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4: {
473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg2: {
474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamLowLatencyMode: {
474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               struct v4l2_control control;
474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               int rc = 0;
474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam =
475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData;
475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (pParam->bLowLatencyMode) {
475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_HIGH("Enabling DECODE order");
475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   time_stamp_dts.set_timestamp_reorder_mode(false);
475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (rc) {
475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Set picture order failed");
475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorUnsupportedSetting;
476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDecoderPictureOrder: {
476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER);
476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     struct v4l2_control control;
476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     int pic_order,rc=0;
477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             pictureOrder->eOutputPictureOrder);
477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         time_stamp_dts.set_timestamp_reorder_mode(false);
477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     } else
477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         eRet = OMX_ErrorBadParameter;
477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (eRet == OMX_ErrorNone) {
478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         control.value = pic_order;
478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         if (rc) {
478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             DEBUG_PRINT_ERROR("Set picture order failed");
478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             eRet = OMX_ErrorUnsupportedSetting;
478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         }
478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     }
478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamConcealMBMapExtraData:
479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
479311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
479411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
479511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamFrameInfoExtraData:
479611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
479711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
479811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
479911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
480011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataFrameDimension:
480111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false,
480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamInterlaceExtraData:
480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamH264TimeInfo:
481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoFramePackingExtradata:
481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoQPExtraData:
482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_QP_EXTRADATA, false,
482311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
482411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
482511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoInputBitsInfoExtraData:
482611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
482711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
482811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
482911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
483011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexEnableExtnUserData:
483111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZipSEIExtraData:
483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDivx: {
484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          break;
484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPlatformPvt: {
484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN);
484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorUnsupportedSetting;
485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else {
485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_out_pvt_entry_pmem = OMX_TRUE;
485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_use_output_pmem = OMX_TRUE;
485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_control control;
486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       int rc;
486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.idr_only_decoding = 1;
486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (rc) {
487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Set picture order failed");
487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorUnsupportedSetting;
487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (rc) {
487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed");
487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           /*Setting sync frame decoding on driver might change buffer
488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            * requirements so update them here*/
488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (get_buffer_req(&drv_ctx.ip_buf)) {
488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements");
488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (get_buffer_req(&drv_ctx.op_buf)) {
488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamIndexExtraDataType: {
489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (extradataIndexType->bEnabled == OMX_TRUE) &&
490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (extradataIndexType->nPortIndex == 1)) {
490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamEnableSmoothStreaming: {
490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef SMOOTH_STREAMING_DISABLED
490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = enable_smoothstreaming();
491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = OMX_ErrorUnsupportedSetting;
491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  /* Need to allow following two set_parameters even in Idle
491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   * state. This is ANDROID architecture which is not in sync
491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   * with openmax standard. */
491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams);
492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
4922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
4923fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!");
4924fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                eRet = OMX_ErrorUnsupportedSetting;
4925fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                break;
4926fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           } else if (m_out_mem_ptr) {
4927fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !");
4928fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                eRet = OMX_ErrorInvalidState;
4929fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                break;
4930fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           }
493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (enableNativeBuffers) {
493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               m_enable_android_native_buffers = enableNativeBuffers->enable;
493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if !defined(FLEXYUV_SUPPORTED)
493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (m_enable_android_native_buffers) {
493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               // Use the most-preferred-native-color-format as surface-mode is hinted here
493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) {
493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   DEBUG_PRINT_ERROR("Failed to set native color format!");
493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   eRet = OMX_ErrorUnsupportedSetting;
494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams);
494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = use_android_native_buffer(hComp, paramData);
494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE
495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexAllocateNativeHandle: {
4952fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData;
4954fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams);
4955fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4956fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
4957fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!");
4958fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
4959fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
4960fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                } else if (m_inp_mem_ptr) {
4961fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !");
4962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    eRet = OMX_ErrorInvalidState;
4963fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
4964fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
4965fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (allocateNativeHandleParams != NULL) {
496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    allocate_native_handle = allocateNativeHandleParams->enable;
496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE
497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamEnableTimeStampReorder: {
497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER);
497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (reorder->bEnable == OMX_TRUE) {
497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frm_int =0;
497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               time_stamp_dts.set_timestamp_reorder_mode(true);
498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else
498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               time_stamp_dts.set_timestamp_reorder_mode(false);
498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           time_stamp_dts.set_timestamp_reorder_mode(false);
498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (reorder->bEnable == OMX_TRUE) {
498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent: {
499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (pParam) {
499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         m_profile_lvl.eProfile = pParam->eProfile;
499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         m_profile_lvl.eLevel = pParam->eLevel;
499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     }
499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoMetaBufferMode:
500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            StoreMetaDataInBuffersParams *metabuffer =
500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (StoreMetaDataInBuffersParams *)paramData;
500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!metabuffer) {
500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer);
500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_dynamic_buf_mode) {
501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled");
501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
5017fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5018fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    if (m_out_mem_ptr) {
5019fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !");
5020fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        eRet = OMX_ErrorInvalidState;
5021fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
5022fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    }
502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //set property dynamic buffer mode to driver.
502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_control control;
502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_format fmt;
502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT;
502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (metabuffer->bStoreMetaData == true) {
502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC;
502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        control.value = V4L2_MPEG_VIDC_VIDEO_STATIC;
503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!rc) {
503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("%s buffer mode",
503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               dynamic_buf_mode = metabuffer->bStoreMetaData;
503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to %s buffer mode",
503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic");
504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = OMX_ErrorUnsupportedSetting;
504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR(
504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u",
504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned int)metabuffer->nPortIndex);
504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDownScalar:
505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR);
505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData;
505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_control control;
505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rc;
505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable);
505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam && pParam->bEnable) {
505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = enable_downscalar();
506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc < 0) {
506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_force_down_scalar = pParam->bEnable;
506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = disable_downscalar();
506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc < 0) {
506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_force_down_scalar = pParam->bEnable;
507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams);
507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback");
508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            PrepareForAdaptivePlaybackParams* pParams =
508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (PrepareForAdaptivePlaybackParams *) paramData;
508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!pParams->bEnable) {
508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorNone;
508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth
508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) {
508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR(
508911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]",
509011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight,
509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight);
509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorBadParameter;
509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight);
509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR(
509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "Prepare for adaptive playback supported only on output port");
509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVideoPreferAdaptivePlayback:
510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback");
510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable;
510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_dynamic_buf_mode) {
511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set");
511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoCustomBufferSize:
511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE);
511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize");
511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData;
512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT;
512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = pParam->nBufferSize;
512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set input buffer size");
512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = get_buffer_req(&drv_ctx.ip_buf);
512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (eRet == OMX_ErrorNone) {
513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size;
513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d",
513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_custom_buffersize.input_buffersize);
513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to get buffer requirement");
513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port");
513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZIPSEIType:
514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE);
514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType");
514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam =
514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData;
514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable);
5150a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((QOMX_ENABLETYPE *)paramData)->bEnable);
515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet != OMX_ErrorNone) {
515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata");
515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
5157a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                break;
5158a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
5159a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            eRet = enable_extradata(OMX_QP_EXTRADATA, false,
516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
5161a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (eRet != OMX_ErrorNone) {
5162a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata");
5163a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                eRet = OMX_ErrorBadParameter;
5164a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
5165a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                client_extradata = client_extradata & ~OMX_QP_EXTRADATA;
5166a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                break;
5167a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
5168a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
5169a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                        ((QOMX_ENABLETYPE *)paramData)->bEnable);
5170a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (eRet != OMX_ErrorNone) {
5171a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to set FrameInfo Extradata");
5172a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                eRet = OMX_ErrorBadParameter;
5173a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
5174a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                client_extradata = client_extradata & ~OMX_QP_EXTRADATA;
5175a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                client_extradata = client_extradata & ~OMX_FRAMEINFO_EXTRADATA;
517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamPassInputBufferFd:
518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes) {
518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode");
518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable;
518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pass_buffer_fd)
519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable passing input buffer FD");
519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamForceCompressedForDPB:
519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE);
519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB");
519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam =
519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData;
519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_ubwc_mode) {
520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled");
520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!paramData) {
520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL");
520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               eRet = OMX_ErrorBadParameter;
520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_force_compressed_for_dpb = pParam->bEnable;
521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamForceUnCompressedForOPB:
521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB");
521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam =
521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData;
521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!paramData) {
521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL");
522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_disable_ubwc_mode = pParam->bEnable;
522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled");
522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
52272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QTIIndexParamVideoClientExtradata:
52282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
52292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
52302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoClientExtradata");
52312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
52322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
52332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            OMX_U32 extradata_size = VENUS_EXTRADATA_SIZE(4096, 2160);
52342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (pParam->nExtradataSize < extradata_size ||
52352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize < (extradata_size * MAX_NUM_INPUT_OUTPUT_BUFFERS) ||
52362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize < (pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS)) {
52372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: Incorrect buffer size for client extradata");
52382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                eRet = OMX_ErrorBadParameter;
52392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
52402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
52412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (!m_client_extradata_info.set_extradata_info(dup(pParam->nFd),
52422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize, pParam->nExtradataSize)) {
52432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: Setting client extradata failed.");
52442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                eRet = OMX_ErrorBadParameter;
52452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
52462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
52472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
52482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
5249af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        case OMX_QTIIndexParamDitherControl:
5250af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        {
5251af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL);
5252af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamDitherControl");
5253af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            QOMX_VIDEO_DITHER_CONTROL *pParam = (QOMX_VIDEO_DITHER_CONTROL *)paramData;
5254af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("set_parameter: Dither Config from client is: %d", pParam->eDitherType);
5255af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            if (( pParam->eDitherType < QOMX_DITHER_DISABLE ) ||
5256af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                ( pParam->eDitherType > QOMX_DITHER_ALL_COLORSPACE)) {
5257af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                DEBUG_PRINT_ERROR("set_parameter: DitherType outside the range");
5258af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                eRet = OMX_ErrorBadParameter;
5259af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                break;
5260af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            }
5261af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            m_dither_config = is_platform_tp10capture_supported() ? (dither_type)pParam->eDitherType : DITHER_ALL_COLORSPACE;
5262af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("set_parameter: Final Dither Config is: %d", m_dither_config);
5263af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            break;
5264af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        }
526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default: {
526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone)
527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex);
527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
527611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
527711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetConfig
527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Get Config Method implementation.
528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE configIndex,
529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_PTR     configData)
529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Config in Invalid State");
529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
530011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)configIndex) {
530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigInterlaced: {
530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE);
530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (configFmt->nPortIndex == 1) {
530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (configFmt->nIndex == 0) {
530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (configFmt->nIndex == 1) {
531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType =
531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (configFmt->nIndex == 2) {
531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType =
531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore Interlaced formats");
531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorNoMore;
531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (int)configFmt->nPortIndex);
532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorBadPortIndex;
532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES);
533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     decoderinstances->nNumOfInstances = 16;
533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     /*TODO: How to handle this case */
533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoFramePackingArrangement: {
533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                  (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              memcpy(configFmt, &m_frame_pack_arrangement,
534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                  sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          } else {
534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          }
534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          break;
534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigCommonOutputCrop: {
534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE);
535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u",
535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        rectangle.nLeft, rectangle.nTop,
535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        rectangle.nWidth, rectangle.nHeight);
535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigPerfLevel: {
535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL);
535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno);
536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorHardware;
536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (eRet == OMX_ErrorNone) {
537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    switch (control.value) {
537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO:
537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo;
537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        default:
537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value);
537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Fall through */
537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL:
537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            perf->ePerfLevel = OMX_QCOM_PerfLevelNominal;
537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigH264EntropyCodingCabac: {
538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE);
538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData;
538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_control control;
538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) {
539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264");
539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNotImplemented;
539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) {
539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                coding->bCabac = (OMX_BOOL)
539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC);
540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* We can't query driver at the moment for the cabac mode, so
540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * just use 0xff...f as a place holder for future improvement */
540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                coding->nCabacInitIdc = ~0;
540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedIndex;
540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
5409fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_QTIIndexConfigDescribeColorAspects:
5410fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        {
5411fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5412fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5413fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5414fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client");
5415fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal");
5416fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5417fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (params->bRequestingDataSpace) {
5418fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Does not handle dataspace request");
5419fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorUnsupportedSetting;
5420fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
5421fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) {
5422fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_LOW("Updating Client's color aspects with internal");
5423fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                memcpy(&(m_client_color_space.sAspects),
5424fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        &(m_internal_color_space.sAspects), sizeof(ColorAspects));
5425fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                m_internal_color_space.bDataSpaceChanged = OMX_FALSE;
5426fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
5427fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects));
5428fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5429fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
5430fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5431fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        case OMX_QTIIndexConfigDescribeHDRColorInfo:
5432fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        {
5433fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams);
5434fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData;
5435fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            auto_lock lock(m_hdr_info_client_lock);
5436fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5437fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "GetConfig Client HDR");
5438fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "GetConfig Internal HDR");
5439fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5440fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (m_change_client_hdr_info) {
5441fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_LOW("Updating Client's HDR Info with internal");
5442fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                memcpy(&m_client_hdr_info.sInfo,
5443fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                       &m_internal_hdr_info.sInfo, sizeof(HDRStaticInfo));
5444fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                m_change_client_hdr_info = false;
5445fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
5446fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5447fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            memcpy(&(params->sInfo), &(m_client_hdr_info.sInfo), sizeof(HDRStaticInfo));
5448fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5449fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            break;
5450fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
5451fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        default:
5452fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        {
5453fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
5454fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            eRet = OMX_ErrorBadParameter;
5455fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SetConfig
546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Set Config method implementation
546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE configIndex,
547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR        configData)
547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Config in Invalid State");
548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_VIDEO_CONFIG_NALSIZE *pNal;
548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Set Config Called");
548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (configIndex == OMX_IndexConfigVideoNalSize) {
549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control temp;
549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE);
549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (pNal->nNaluBytes) {
549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 0:
549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 2:
550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 4:
550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorUnsupportedSetting;
550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!arbitrary_bytes) {
551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* In arbitrary bytes mode, the assembler strips out nal size and replaces
551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * with start code, so only need to notify driver in frame by frame mode */
551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorHardware;
551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_length = pNal->nNaluBytes;
552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) {
552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps);
552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (config->bEnabled) {
5530fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if ((config->nFps >> 16) > 0 &&
5531fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        (config->nFps >> 16) <= MAX_SUPPORTED_FPS) {
5532fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    m_fps_received = config->nFps;
553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u",
553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)config->nFps >> 16);
553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.frame_rate.fps_denominator);
553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!drv_ctx.frame_rate.fps_numerator) {
553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator = 30;
554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.frame_rate.fps_denominator) {
554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator = (int)
554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.frame_rate.fps_denominator = 1;
554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator;
555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_outputparm oparm;
555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*XXX: we're providing timing info as seconds per frame rather than frames
555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     * per second.*/
555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_streamparm sparm;
555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sparm.parm.output = oparm;
556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                performance might be affected");
556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        ret = OMX_ErrorHardware;
556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_set_fps = true;
556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Frame rate not supported.");
556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ret = OMX_ErrorUnsupportedSetting;
557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_set_fps = false;
557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (int)config->nPortIndex);
557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = OMX_ErrorBadPortIndex;
557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) {
558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel);
558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (perf->ePerfLevel) {
559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PerfLevelNominal:
559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
5593a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_need_turbo &= ~TURBO_MODE_CLIENT_REQUESTED;
559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PerfLevelTurbo:
559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
5597a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                m_need_turbo |= TURBO_MODE_CLIENT_REQUESTED;
559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = OMX_ErrorUnsupportedSetting;
560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret == OMX_ErrorNone) {
560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) {
561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config =
561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData;
561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType);
561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE;
561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (config->eDecodeType) {
561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PictypeDecode_I:
561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON;
562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PictypeDecode_IPB:
562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF;
562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret)
563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set picture type decode");
563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexConfigPriority) {
563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData;
563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32);
563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY;
564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (priority->nU32 == 0)
564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE;
564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE;
564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set Priority");
564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = OMX_ErrorUnsupportedSetting;
564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) {
565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData;
565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16);
565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE;
565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = rate->nU32;
565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        operating_frame_rate = rate->nU32 >> 16;
566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = errno == -EBUSY ? OMX_ErrorInsufficientResources :
566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_ErrorUnsupportedSetting;
566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)",
566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno));
566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
5668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) {
5670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5672fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) {
5673fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true);
5674fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5675fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5676fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(params->sAspects), "Set Config");
5677fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams));
5678fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return ret;
5679fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeHDRColorInfo) {
5680fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams);
5681fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData;
5682fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (!DEFAULT_EXTRADATA & OMX_HDR_COLOR_INFO_EXTRADATA) {
5683fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            ret = enable_extradata(OMX_HDR_COLOR_INFO_EXTRADATA, true, true);
5684fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (ret != OMX_ErrorNone) {
5685fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_ERROR("Failed to enable OMX_HDR_COLOR_INFO_EXTRADATA");
5686fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                return ret;
5687fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
5688fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
5689fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5690fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        print_debug_hdr_color_info(&(params->sInfo), "Set Config HDR");
5691fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        memcpy(&m_client_hdr_info, params, sizeof(DescribeHDRStaticInfoParams));
5692fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return ret;
569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define extn_equals(param, extn) (!strcmp(param, extn))
569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetExtensionIndex
570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX GetExtensionIndex method implementaion.  <TBD>
570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_STRING      paramName,
571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_INDEXTYPE* indexType)
571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) {
572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) {
572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) {
572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata;
572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) {
572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement;
573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) {
573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData;
573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) {
573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData;
573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) {
573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData;
573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) {
573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) {
574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) {
574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) {
574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE
574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) {
575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle;
575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE
575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) {
575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode;
575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) {
575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) {
576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback;
576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED
576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) {
576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription;
576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) {
577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd;
577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) {
577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB;
577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) {
577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB;
577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) {
577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode;
57772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA)) {
57782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoClientExtradata;
5779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) {
5780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects;
5781fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.describeHDRStaticInfo")) {
5782fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeHDRColorInfo;
578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNotImplemented;
578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetState
579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns the state information back to the caller.<TBD>
579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Error None if everything is successful.
580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_STATETYPE* state)
580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *state = m_state;
580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentTunnelRequest
581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Component Tunnel Request method implementation. <TBD>
581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE  hComp,
582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE        peerComponent,
582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                    peerPort,
583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) peerComponent;
583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) peerPort;
583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) tunnelSetup;
583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseOutputBuffer
584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper function for Use buffer in the input pin
584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_extradata()
585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.extradata_info.buffer_size) {
585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.extradata_info.ion);
586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size, 4096,
586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.extradata_info.ion.ion_alloc_data,
586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size,
587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                PROT_READ|PROT_WRITE, MAP_SHARED,
587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to map extradata memory");
587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.extradata_info.ion);
588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_other_extradata) {
588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size);
588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_other_extradata) {
588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc memory\n");
588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_extradata()
589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.extradata_info.uaddr) {
589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_ion_memory(&drv_ctx.extradata_info.ion);
590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_other_extradata) {
590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_other_extradata);
590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_other_extradata = NULL;
590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_output_buffer(
591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned                         i= 0; // Temporary counter
592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PTR privateAppData = NULL;
592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private_handle_t *handle = NULL;
592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buff = buffer;
592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_output_headers();
593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet == OMX_ErrorNone)
593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_extradata();
593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i >= drv_ctx.op_buf.actualcount) {
594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone)
595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return eRet;
595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_out_mem_ptr + i );
595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pBuffer = NULL;
595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) {
595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enum v4l2_buf_type buf_type;
595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rr = 0;
596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) {
596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr);
596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = true;
596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("STREAMON Successful");
596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enabling Turbo mode");
597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_out_bm_count,i);
597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pAppPrivate = appData;
597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pBuffer = buffer;
597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_enable_android_native_buffers) {
598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_use_android_native_buffers) {
598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                handle = (private_handle_t *)nBuf->handle;
598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = params->pAppPrivate;
598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                handle = (private_handle_t *)buff;
598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!handle) {
599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("handle is invalid");
599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (secure_mode && secure_scaling_to_non_secure_opb) {
599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it",
599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            " expected %u, got %u",
600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.buffer_size = handle->size;
600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_use_android_native_buffers) {
601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buff =  (OMX_U8*)mmap(0, handle->size,
601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (buff == MAP_FAILED) {
601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_)
602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[i].nativehandle = handle;
602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[i].privatehandle = handle;
602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!handle) {
602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].offset = 0;
603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!ouput_egl_buffers && !m_use_output_pmem) {
603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &drv_ctx.op_buf_ion_info[i].fd_ion_data,
604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0);
604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      open (MEM_DEVICE,O_RDWR);
605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          open (MEM_DEVICE,O_RDWR);
606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.op_buf.buffer_size,
607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.op_buf.alignment)) {
607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                PROT_READ|PROT_WRITE, MAP_SHARED,
608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = 0;
609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!appData || !bytes ) {
609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!secure_mode && !buffer) {
609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry ||
610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !pmem_list->nEntries ||
610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_list->entryList->entry;
611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_info->pmem_fd);
611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].mmaped_size =
611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_out_mem_ptr + i );
612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode)
613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sizeof (vdec_bufferpayload));
613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr,
613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd );
613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = i;
614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].length = drv_ctx.op_buf.buffer_size;
614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].data_offset = 0;
614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].data_offset = 0;
615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = plane;
616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = drv_ctx.num_planes;
616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to prepare bufs");
616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enum v4l2_buf_type buf_type;
617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = true;
617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("STREAMON Successful");
617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enabling Turbo mode");
618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_enable_android_native_buffers) {
618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = buff;
619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pAppPrivate = privateAppData;
619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_out_bm_count,i);
619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::use_input_heap_buffers
620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use Buffer Heap allocation method implementation.
620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None , if everything successful.
620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
62217b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
62227b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (secure_mode) {
62237b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode");
62247b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        return OMX_ErrorUndefined;
62257b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    }
62267b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_heap_ptr)
622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.actualcount);
623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_phdr_pmem_ptr)
623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.actualcount);
623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficent memory");
623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_use_buffer = true;
624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt],
625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL, (unsigned)NULL)) {
625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_in_alloc_cnt++;
625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseBuffer
626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use Buffer method implementation.
626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None , if everything successful.
627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_buffer(
627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE error = OMX_ErrorNone;
628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) {
628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer);
628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6295fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
6296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
6297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ensure that use-buffer was called for previous allocation.
6298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // Mix-and-match of useBuffer and allocateBuffer is not allowed
6299fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (m_inp_mem_ptr && !input_use_buffer) {
6300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !");
6301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUndefined;
6302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
6304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = OMX_ErrorBadPortIndex;
630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error);
631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (error == OMX_ErrorNone) {
631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Send the callback now
631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandStateSet,OMX_StateIdle,
631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortEnable,
632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_INPUT_PORT_INDEX,
632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortEnable,
632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_OUTPUT_PORT_INDEX,
632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return error;
633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr[bufferindex].pBuffer)
634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free(m_inp_heap_ptr[bufferindex].pBuffer);
634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_bufferHdr)
634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_input_buffer(pmem_bufferHdr);
634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufferHdr - m_inp_mem_ptr;
635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    auto_lock l(buf_lock);
635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufferHdr->pInputPortPrivate = NULL;
636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) {
636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_setbuffer_cmd setbuffers;
636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof (vdec_bufferpayload));
636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!secure_mode) {
636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("unmap the input buffer size=%u  address = %p",
637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size,
637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].mmaped_size);
6376d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            }
6377d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
6378d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            if (allocate_native_handle){
637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer;
638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_close(nh);
638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_delete(nh);
6382d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            } else {
6383d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                // Close fd for non-secure and secure non-native-handle case
6384d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                close(drv_ctx.ptr_inputbuffer[index].pmem_fd);
638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
6387d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_desc_buffer_ptr[index].buf_addr);
639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_desc_buffer_ptr[index].buf_addr = NULL;
639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_desc_buffer_ptr[index].desc_data_size = 0;
639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6396a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_in_alloc_cnt--;
639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufferHdr - m_out_mem_ptr;
641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < drv_ctx.op_buf.actualcount
641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && drv_ctx.ptr_outputbuffer) {
641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index,
641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[index].bufferaddr);
641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_setbuffer_cmd setbuffers;
642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sizeof (vdec_bufferpayload));
642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!dynamic_buf_mode) {
642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (streaming[CAPTURE_PORT] &&
642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) {
642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("STREAMOFF Failed");
642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("STREAMOFF Successful");
643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_enable_android_native_buffers) {
643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[index].mmaped_size);
643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6444bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0
6445bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    && !ouput_egl_buffers && !m_use_output_pmem) {
6446bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    if (drv_ctx.op_buf_map_info[index].free_buffer) {
6447bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        if (!secure_mode) {
6448bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                            DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
6449bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                                    drv_ctx.ptr_outputbuffer[0].pmem_fd);
6450bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                            DEBUG_PRINT_LOW("unmap the ouput buffer size=%u  address = %p",
6451bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                                    (unsigned int)drv_ctx.op_buf_map_info[index].map_size,
6452bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                                    drv_ctx.op_buf_map_info[index].base_address);
6453bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                            munmap (drv_ctx.op_buf_map_info[index].base_address,
6454bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                                    drv_ctx.op_buf_map_info[index].map_size);
6455bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        }
6456bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        close (drv_ctx.ptr_outputbuffer[index].pmem_fd);
6457bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
6459bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        free_ion_memory(&drv_ctx.op_buf_ion_info[index]);
646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6461bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    } else {
6462bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        drv_ctx.op_buf_ion_info[index].ion_device_fd = -1;
6463bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        drv_ctx.op_buf_ion_info[index].ion_alloc_data.handle = 0;
6464bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        drv_ctx.op_buf_ion_info[index].fd_ion_data.fd = -1;
6465bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    }
6466bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    drv_ctx.op_buf_map_info[index].free_buffer = false;
6467bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    drv_ctx.op_buf_map_info[index].base_address = NULL;
6468bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    drv_ctx.op_buf_map_info[index].map_size = 0;
6469bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    drv_ctx.op_buf_map_info[index].offset = 0;
647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } //!dynamic_buf_mode
647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_output_done()) {
647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_extradata();
647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
647811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE **bufferHdr,
648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32              port,
648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PTR              appData,
648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32              bytes)
648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *input = NULL;
649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char *buf_addr = NULL;
649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned   i = 0;
649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Sanity Check*/
649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL) {
649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_heap_ptr == NULL) {
650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
650211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
650311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         drv_ctx.ip_buf.actualcount);
650411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
650511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
650611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          drv_ctx.ip_buf.actualcount);
650711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
650811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) {
650911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed ");
651011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
651111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Find a Free index*/
651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < drv_ctx.ip_buf.actualcount) {
652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buf_addr == NULL) {
652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_inp_heap_ptr + i);
653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input = *bufferHdr;
653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_heap_inp_bm_count,i);
653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pBuffer           = (OMX_U8 *)buf_addr;
653411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nVersion.nVersion = OMX_SPEC_VERSION;
653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pAppPrivate       = appData;
653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Add the Buffers to freeq*/
654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i],
654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL, (unsigned)NULL)) {
654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateInputBuffer
656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper function for allocate buffer in the input pin
656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
656411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes)
657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
657911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
658011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *input = NULL;
658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned   i = 0;
658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char *buf_addr = NULL;
658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int pmem_fd = -1;
658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bytes != drv_ctx.ip_buf.buffer_size) {
659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u",
659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size);
659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_mem_ptr) {
659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)",
659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ip_buf.actualcount,
659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)drv_ctx.ip_buf.buffer_size);
659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_mem_ptr == NULL) {
660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ptr_inputbuffer == NULL) {
661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ip_buf_ion_info == NULL) {
661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < drv_ctx.ip_buf.actualcount) {
663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_buffer buf;
663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_plane plane;
664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc;
664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Allocate input Buffer");
664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ?
664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED);
664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = open (MEM_DEVICE,O_RDWR);
665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd < 0) {
665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd == 0) {
666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_fd = open (MEM_DEVICE,O_RDWR);
666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pmem_fd < 0) {
666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.alignment)) {
667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(pmem_fd);
667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_addr = (unsigned char *)mmap(NULL,
667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.buffer_size,
667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buf_addr == MAP_FAILED) {
668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                close(pmem_fd);
668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_inp_mem_ptr + i);
669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode)
669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].offset = 0;
669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = i;
670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.bytesused = 0;
670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.reserved[1] = 0;
670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = &plane;
671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = 1;
671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i,
671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_inputbuffer[i].bufferaddr);
671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to prepare bufs");
672011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
672111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
672211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
672311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
672411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input = *bufferHdr;
672511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_inp_bm_count,i);
672611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
672711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_native_handle) {
672811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/);
672911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!nh) {
673011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Native handle create failed");
673111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
673211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
673311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd;
673411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer = (OMX_U8 *)nh;
673511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (secure_mode || m_input_pass_buffer_fd) {
673611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*Legacy method, pass ion fd stashed directly in pBuffer*/
673711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd;
673811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
673911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer           = (OMX_U8 *)buf_addr;
674011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
674111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
674211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nVersion.nVersion = OMX_SPEC_VERSION;
674311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
674411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pAppPrivate       = appData;
674511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
674611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
674711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
674811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.disable_dmx) {
674911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_desc_buffer(i);
675011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateOutputBuffer
676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper fn for AllocateBuffer in the output pin
676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went well.
677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes)
677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)hComp;
678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)port;
678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned                         i= 0; // Temporary counter
678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_device_fd =-1;
678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_allocation_data ion_alloc_data;
679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_fd_data fd_ion_data;
679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)",
679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount,
679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)drv_ctx.op_buf.buffer_size);
679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nBufHdrSize        = 0;
679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformEntrySize = 0;
679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformListSize  = 0;
679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPMEMInfoSize = 0;
680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufHdrSize        = drv_ctx.op_buf.actualcount *
680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_BUFFERHEADERTYPE);
680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformListSize  = drv_ctx.op_buf.actualcount *
681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,
682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPlatformListSize);
682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
6823bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        unsigned char *pmem_baseaddress_temp[MAX_NUM_INPUT_OUTPUT_BUFFERS] = {NULL};
6824bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        int pmem_fd[MAX_NUM_INPUT_OUTPUT_BUFFERS] = {-1};
6825bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        int alloc_size[MAX_NUM_INPUT_OUTPUT_BUFFERS] = {0};
6826bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        static const int block_max_size = 128 * 1024 * 1024;
6827bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        unsigned int block_buf_count = block_max_size / drv_ctx.op_buf.buffer_size;
6828bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        unsigned int last_block_buf_count = 0, block_count = 1;
6829bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        if (drv_ctx.op_buf.actualcount <= block_buf_count) {
6830bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            block_buf_count = drv_ctx.op_buf.actualcount;
6831bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        } else {
6832bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            last_block_buf_count = drv_ctx.op_buf.actualcount % block_buf_count;
6833bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            block_count = (drv_ctx.op_buf.actualcount + block_buf_count - 1) / block_buf_count;
6834bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        }
6835bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        unsigned int idx = 0;
6836bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        DEBUG_PRINT_LOW("block_count = %d block_buf_count = %d last_block_buf_count = %d",
6837bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            block_count, block_buf_count, last_block_buf_count);
683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
6839bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        struct vdec_ion op_buf_ion_info_temp[MAX_NUM_INPUT_OUTPUT_BUFFERS];
684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED;
6841bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        for (; idx < block_count; idx++) {
6842bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            int cnt = ((idx == block_count - 1) && last_block_buf_count) ?
6843bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                last_block_buf_count : block_buf_count;
6844bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            alloc_size[idx] = drv_ctx.op_buf.buffer_size * cnt;
6845bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            // Allocate output buffers as cached to improve performance of software-reading
6846bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            // of the YUVs. Output buffers are cache-invalidated in driver.
6847bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            // If color-conversion is involved, Only the C2D output buffers are cached, no
6848bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            // need to cache the decoder's output buffers
6849bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            op_buf_ion_info_temp[idx].ion_device_fd = alloc_map_ion_memory(
6850bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    alloc_size[idx],
6851bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment,
6852bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    &op_buf_ion_info_temp[idx].ion_alloc_data, &op_buf_ion_info_temp[idx].fd_ion_data,
6853bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    (secure_mode && !secure_scaling_to_non_secure_opb) ?
6854bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    SECURE_FLAGS_OUTPUT_BUFFER : cache_flag);
6855bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            if (op_buf_ion_info_temp[idx].ion_device_fd < 0) {
6856bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                DEBUG_PRINT_LOW("Failed to allocate chunk %ul size = %d", idx, alloc_size[idx]);
6857bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                break;
6858bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
6859bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            pmem_fd[idx] = op_buf_ion_info_temp[idx].fd_ion_data.fd;
6860bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            DEBUG_PRINT_LOW("Allocated chunk %ul fd = %ul size = %d", idx, pmem_fd[idx], alloc_size[idx]);
6861bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        }
6862bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        if (idx != block_count) {
6863bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            for (OMX_U32 i = 0; i < idx; i++) {
6864bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                close(pmem_fd[i]);
6865bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                free_ion_memory(&op_buf_ion_info_temp[i]);
6866bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
6869bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel
687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
6871bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        for (idx = 0; idx < block_count; idx++) {
6872bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            pmem_fd[idx] = open (MEM_DEVICE,O_RDWR);
687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6874bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            if (pmem_fd[idx] < 0) {
6875bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
6876bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        drv_ctx.op_buf.buffer_size);
6877bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                break;
6878bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
6879bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            int cnt = ((idx == block_count - 1) && last_block_buf_count) ?
6880bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                last_block_buf_count : block_buf_count;
6881bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            if (!align_pmem_buffers(pmem_fd[idx], drv_ctx.op_buf.buffer_size * cnt,
6882bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        drv_ctx.op_buf.alignment)) {
6883bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
6884bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                close(pmem_fd[idx]);
6885bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                break;
6886bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
688711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
6888bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        if (idx != block_count) {
6889bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            for (i = 0; i < idx; i++) {
6890bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                close(pmem_fd[i]);
6891bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
689211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
689311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
689411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
689511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
6896bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            idx = 0;
6897bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            for (; idx < block_count; idx++) {
6898bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                pmem_baseaddress_temp[idx] = (unsigned char *)mmap(NULL,
6899bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        alloc_size[idx],
6900bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd[idx], 0);
6901bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel
6902bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                if (pmem_baseaddress_temp[idx] == MAP_FAILED) {
6903bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    DEBUG_PRINT_ERROR("MMAP failed for Size %u for fd = %d",
6904bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                            (unsigned int)alloc_size[idx], pmem_fd[idx]);
6905bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    close(pmem_fd[idx]);
6906bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel#ifdef USE_ION
6907bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    free_ion_memory(&op_buf_ion_info_temp[idx]);
6908bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel#endif
6909bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    break;
6910bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                }
6911bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
6912bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            if (idx != block_count) {
6913bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                for (i = 0; i < idx; i++) {
6914bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    munmap(pmem_baseaddress_temp[idx], alloc_size[idx]);
6915bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    close(pmem_fd[i]);
691611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
6917bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    free_ion_memory(&op_buf_ion_info_temp[i]);
691811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6919bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                }
692011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
692111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
692211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
692311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
692411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Alloc mem for platform specific info
692511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        char *pPtr=NULL;
692611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
692711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,1);
692811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
692911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       calloc (sizeof(struct vdec_bufferpayload),
693011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               drv_ctx.op_buf.actualcount);
693111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
693211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     calloc (sizeof (struct vdec_output_frameinfo),
693311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             drv_ctx.op_buf.actualcount);
693411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
693511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer ");
693611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
693711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
693811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
693911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
694011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
694111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc (sizeof(struct vdec_ion),
694211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              drv_ctx.op_buf.actualcount);
694311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.op_buf_ion_info) {
694411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
694511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
694611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
694711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6948bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        drv_ctx.op_buf_map_info = (struct vdec_ion_map_info *)\
6949bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                      calloc (sizeof(struct vdec_ion_map_info),
6950bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                              drv_ctx.op_buf.actualcount);
6951bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        if (!drv_ctx.op_buf_map_info) {
6952bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_map_info");
6953bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            return OMX_ErrorInsufficientResources;
6954bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        }
695511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
695611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
695711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && drv_ctx.ptr_respbuffer) {
695811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[0].mmaped_size =
695911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (drv_ctx.op_buf.buffer_size *
696011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 drv_ctx.op_buf.actualcount);
696111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufHdr          =  m_out_mem_ptr;
696211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_list)  + nPlatformListSize);
696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_entry) + nPlatformEntrySize);
696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformList   = m_platform_list;
696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformEntry  = m_platform_entry;
696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPMEMInfo       = m_pmem_info;
697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Settting the entire storage nicely
697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Set the values when we determine the right HxW param
698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nAllocLen          = bytes;
698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nFilledLen         = 0;
698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pAppPrivate        = appData;
698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Platform specific PMEM Information
698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform Entry
698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->entry      = pPMEMInfo;
698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform List
699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->nEntries    = 1;
699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->entryList   = pPlatformEntry;
699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Keep pBuffer NULL till vdec is opened
699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pBuffer            = NULL;
699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOffset            = 0;
699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->pmem_fd = -1;
699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pPlatformPrivate = pPlatformList;
699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7000bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                int block_idx = i / block_buf_count;
7001bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd[block_idx];
7002bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                m_pmem_info[i].pmem_fd = pmem_fd[block_idx];
700311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
7004bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd = op_buf_ion_info_temp[block_idx].ion_device_fd;
7005bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_ion_info[i].ion_alloc_data = op_buf_ion_info_temp[block_idx].ion_alloc_data;
7006bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_ion_info[i].fd_ion_data = op_buf_ion_info_temp[block_idx].fd_ion_data;
700711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
7008bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_map_info[i].free_buffer = !(i % block_buf_count);
7009bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_map_info[i].base_address = pmem_baseaddress_temp[block_idx];
7010bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_map_info[i].map_size = alloc_size[block_idx];
7011bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.op_buf_map_info[i].offset = drv_ctx.op_buf.buffer_size * (i % block_buf_count);
701211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
701311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Create a mapping between buffers*/
701411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
701511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
701611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    &drv_ctx.ptr_outputbuffer[i];
7017bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size * (i % block_buf_count);
701811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr =
7019bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    pmem_baseaddress_temp[block_idx] + (drv_ctx.op_buf.buffer_size * (i % block_buf_count));
702011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
702111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
702211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
702311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
702411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p",
7025bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                        pmem_fd[block_idx], (unsigned int)drv_ctx.ptr_outputbuffer[i].offset,
702611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
702711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Move the buffer and buffer header pointers
702811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr++;
702911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo++;
703011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry++;
703111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList++;
703211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
703311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
703411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
703511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr, pPtr);
703611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_out_mem_ptr) {
703711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_out_mem_ptr);
703811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr = NULL;
703911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
704011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pPtr) {
704111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(pPtr);
704211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPtr = NULL;
704311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
704411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_outputbuffer) {
704511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_outputbuffer);
704611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer = NULL;
704711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
704811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_respbuffer) {
704911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_respbuffer);
705011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer = NULL;
705111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
705211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
705311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.op_buf_ion_info) {
705411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free o/p ion context");
705511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.op_buf_ion_info);
705611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info = NULL;
705711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
705811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
7059bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            free(drv_ctx.op_buf_map_info);
7060bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            drv_ctx.op_buf_map_info = NULL;
7061bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel           eRet =  OMX_ErrorInsufficientResources;
706211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
706311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet == OMX_ErrorNone)
706411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_extradata();
706511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
706611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
706711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
706811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
706911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
707011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
707111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
707211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
707311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
707411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
707511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i < drv_ctx.op_buf.actualcount) {
707611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_buffer buf;
707711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_plane plane[VIDEO_MAX_PLANES];
707811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rc;
707911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
708011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
708111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].buffer_len =
708211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.buffer_size;
708311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
708411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *bufferHdr = (m_out_mem_ptr + i );
708511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (secure_mode) {
708611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
708711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr =
708811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
708911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
709011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
709111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
709211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
709311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
709411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
709511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.index = i;
709611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
709711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.memory = V4L2_MEMORY_USERPTR;
709811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].length = drv_ctx.op_buf.buffer_size;
709911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
710011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
710111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
710211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
710311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
7104bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            plane[0].reserved[1] = drv_ctx.op_buf_map_info[i].offset;
710511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].data_offset = 0;
710611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
710711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
710811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
710911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
711011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
711111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
711211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
711311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
711411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].data_offset = 0;
711511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (extra_idx >= VIDEO_MAX_PLANES) {
711611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
711711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
711811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
711911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.m.planes = plane;
712011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.length = drv_ctx.num_planes;
712111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
712211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
712311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc) {
712411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*TODO: How to handle this case */
712511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
712611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
712711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
712811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
712911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                enum v4l2_buf_type buf_type;
713011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
713111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
713211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc) {
713311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
713411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
713511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    streaming[CAPTURE_PORT] = true;
713611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("STREAMON Successful");
713711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
713811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
713911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Enabling Turbo mode");
714011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                request_perf_level(VIDC_TURBO);
714111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
714211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
714311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
714411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pAppPrivate = appData;
714511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_out_bm_count,i);
714611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
714711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
714811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
714911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
715011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
715111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
715211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
715311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
715411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
715511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
715611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer  -- API Call
715711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
715811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
715911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateBuffer
716011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
716111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
716211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
716311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
716411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
716511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
716611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
716711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
716811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
716911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
717011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
717111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
717211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
717311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
717411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                     appData,
717511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                       bytes)
717611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
717711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i = 0;
717811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
717911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
718011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
718111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
718211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
718311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
718411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
718511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
718611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
7187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
7188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ensure that use-buffer was never called.
7189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // Mix-and-match of useBuffer and allocateBuffer is not allowed
7190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (m_inp_mem_ptr && input_use_buffer) {
7191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !");
7192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUndefined;
7193fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
719411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (arbitrary_bytes) {
719511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
719611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
719711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
719811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
719911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
720011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
720111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                appData,bytes);
720211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
720311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
720411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
720511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
720611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
720711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
720811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_done()) {
720911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
721011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Send the callback now
721111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
721211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandStateSet,OMX_StateIdle,
721311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
721411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
721511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
721611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
721711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
721811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
721911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,
722011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_CORE_INPUT_PORT_INDEX,
722111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
722211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
722311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
722411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
722511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
722611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
722711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,
722811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_CORE_OUTPUT_PORT_INDEX,
722911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
723011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
723111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
723211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
723311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
723411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
723511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
723611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
723711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call
723811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
723911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
724011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::FreeBuffer
724111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
724211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
724311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
724411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
724511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
724611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
724711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
724811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
724911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
725011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
725111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
725211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                 port,
725311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
725411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
725511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
725611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int nPortIndex;
725711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
725811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("In for decoder free_buffer");
725911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
726011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateIdle &&
726111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port);
726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port);
727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
727211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(OMX_EventError,
727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorPortUnpopulated,
727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EVENT);
727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_state != OMX_StateInvalid) {
727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(OMX_EventError,
728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorPortUnpopulated,
728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EVENT);
728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if arbitrary bytes*/
728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!arbitrary_bytes && !input_use_buffer)
728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex = buffer - m_inp_mem_ptr;
728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
729011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex = buffer - m_inp_heap_ptr;
729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.ip_buf.actualcount &&
729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) {
729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Clear the bit associated with it.
729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
729711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (input_use_buffer == true) {
729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_phdr_pmem_ptr)
730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (arbitrary_bytes) {
730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_phdr_pmem_ptr)
730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    else
730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_input_buffer(nPortIndex,NULL);
730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else
731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer(buffer);
731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bPopulated = OMX_FALSE;
731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(release_input_done())
731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                release_buffers(this, VDEC_BUFFER_TYPE_INPUT);
731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*Free the Buffer Header*/
731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_input_done()) {
731711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_input_buffer_header();
731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadPortIndex;
732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && release_input_done()) {
732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortDisable,
733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_INPUT_PORT_INDEX,
733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // check if the buffer is valid
733511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.op_buf.actualcount &&
733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) {
733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Clear the bit associated with it.
734011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
734111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bPopulated = OMX_FALSE;
734211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_buffers.free_output_buffer (buffer);
734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(release_output_done()) {
734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT);
734611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_output_done()) {
734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_output_buffer_header();
734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadPortIndex;
735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && release_output_done()) {
735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_enable_android_native_buffers) {
736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortDisable,
736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_OUTPUT_PORT_INDEX,
736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((eRet == OMX_ErrorNone) &&
737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_done()) {
7377a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            /*
7378a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel             * Reset buffer requirements here to ensure setting buffer requirement
7379a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel             * when component move to executing state from loaded state via idle.
7380a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel             */
7381a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            drv_ctx.op_buf.buffer_size = 0;
7382a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            drv_ctx.op_buf.actualcount = 0;
7383a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Send the callback now
738511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
738611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandStateSet, OMX_StateLoaded,
738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
739111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::EmptyThisBuffer
739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   This routine is used to push the encoded video frames to
740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   the video decoder.
740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went successful.
740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateExecuting &&
741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StatePause &&
741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StateIdle) {
741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_bEnabled) {
742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex);
743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!latency) {
743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dec_time.stop();
744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            latency = dec_time.processing_time_us();
744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dec_time.start();
744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufferIndex = buffer - m_inp_heap_ptr;
744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (input_use_buffer == true) {
744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBufferIndex = buffer - m_inp_heap_ptr;
7450fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
7451fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode");
7452fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorBadParameter;
7453fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = &m_inp_mem_ptr[nBufferIndex];
745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u",
745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen);
746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBufferIndex = buffer - m_inp_mem_ptr;
746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7465fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = true;
747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* The client should not set this when codec is in arbitrary bytes mode */
747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_input_pass_buffer_fd) {
747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr;
747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)",
748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen);
748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)hComp,(unsigned long)buffer,
748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB);
748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    time_stamp_dts.insert_timestamp(buffer);
748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::empty_this_buffer_proxy
749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   This routine is used to push the encoded video frames to
749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   the video decoder.
749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went successful.
750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE  hComp,
750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7510b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("ETB");
751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int push_cnt = 0,i=0;
751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_input_frameinfo frameinfo;
751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload *temp_buffer;
751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_seqheader seq_header;
751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool port_setting_changed = true;
751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Should we generate a Aync error event*/
752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7528fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (nPortIndex >= drv_ctx.ip_buf.actualcount) {
752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPortIndex);
753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers++;
7535b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return zero length and not an EOS buffer */
753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("return zero legth buffer");
754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EBD);
754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (input_flush_progress == true) {
754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Flush in progress return buffer ");
754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EBD);
755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    auto_lock l(buf_lock);
755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!temp_buffer || (temp_buffer -  drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) {
755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* If its first frame, H264 codec and reject is true, then parse the nal
756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       and get the profile. Based on this, reject the clip playback */
756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_reject_avc_1080p_mp) {
756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        first_frame = 1;
756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Parse nal to get the profile");
756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                NALU_TYPE_SPS);
756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_profile = h264_parser->get_profile();
756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = is_video_session_supported();
756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state = OMX_StateInvalid;
757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorNone;
757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7578b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-TS", buffer->nTimeStamp / 1000);
7579b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-size", buffer->nFilledLen);
758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*for use buffer we need to memcpy the data*/
758211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer->buffer_len = buffer->nFilledLen;
758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
75847b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) {
758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes) {
758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        buffer->nFilledLen);
759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.bufferaddr = temp_buffer->bufferaddr;
759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.client_data = (void *) buffer;
760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.datalen = temp_buffer->buffer_len;
760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.flags = 0;
760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.offset = buffer->nOffset;
760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.pmem_fd = temp_buffer->pmem_fd;
760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.pmem_offset = temp_buffer->offset;
760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.timestamp = buffer->nTimeStamp;
760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ETB: dmx enabled");
760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_demux_entries == 0) {
760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extract_demux_addr_offsets(buffer);
761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries);
761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        handle_demux_data(buffer);
761411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_addr = NULL;
761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_size = 0;
761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes) {
762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= buffer->nFlags;
762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
762411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (arbitrary_bytes) {
762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_timestamp_list.insert_ts(buffer->nTimeStamp);
762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_timestamp_list.insert_ts(buffer->nTimeStamp);
763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len);
763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.nFilledLen = 0;
764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_count = 0;
764811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_count = 0;
765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.mutils)
765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_frame_parser.mutils->initialize_frame_checking_environment();
765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.flush();
765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_ts = LLONG_MAX;
765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_flags = 0;
765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_entries = 0;
765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
765911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane;
766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&buf, 0, sizeof(buf));
766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&plane, 0, sizeof(plane));
766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long  print_count;
766411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
766911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = nPortIndex;
767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
767111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
767211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.bytesused = temp_buffer->buffer_len;
767311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.length = drv_ctx.ip_buf.buffer_size;
767411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
767511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)temp_buffer->offset;
767611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.reserved[0] = temp_buffer->pmem_fd;
767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.reserved[1] = temp_buffer->offset;
767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.data_offset = 0;
767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = &plane;
768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = 1;
768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frameinfo.timestamp >= LLONG_MAX) {
768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //assumption is that timestamp is in milliseconds
768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Increment codec_config buffer counter");
769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        android_atomic_inc(&m_queued_codec_config_count);
769311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver, send ETB back to client");
769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone(hComp, m_app_data, buffer);
769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorHardware;
770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = false;
770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[OUTPUT_PORT]) {
770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_buf_type buf_type;
770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret,r;
770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
770911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!ret) {
771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            streaming[OUTPUT_PORT] = true;
771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (errno == EBUSY) {
771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD");
771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)",
772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frameinfo.bufferaddr, (long long)frameinfo.timestamp,
773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)frameinfo.datalen);
773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::FillThisBuffer
773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL client uses this method to release the frame buffer
774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   after displaying them.
774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateExecuting &&
775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StatePause &&
775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StateIdle) {
775611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTB in Invalid State");
775711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
775811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_bEnabled) {
776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        private_handle_t *handle = NULL;
776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct VideoDecoderOutputMetaData *meta;
776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int nPortIndex = 0;
777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!buffer || !buffer->pBuffer) {
777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer);
777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //get the buffer type and fd info
777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer;
777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        handle = (private_handle_t *)meta->pHandle;
777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle);
778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!handle) {
778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle);
778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF
778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.op_buf.actualcount &&
778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd;
779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer;
779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           //Store private handle from GraphicBuffer
779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[nPortIndex].privatehandle = handle;
779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[nPortIndex].nativehandle = handle;
779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex);
779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite
780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //this with a more sane size so that we don't compensate in rest of code
780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //We'll restore this size later on, so that it's transparent to client
780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nAllocLen = handle->size;
780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (handle->flags & private_handle_t::PRIV_FLAGS_DISP_CONSUMER) {
780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_is_display_session = true;
780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_is_display_session = false;
781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: m_is_display_session = %d", __func__, m_is_display_session);
781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf.buffer_size = handle->size;
781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
781611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer - client_buffers.get_il_buf_hdr();
781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL ||
781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (nPortIndex >= drv_ctx.op_buf.actualcount)) {
781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex, drv_ctx.op_buf.actualcount);
782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
782211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex);
782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg);
783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::fill_this_buffer_proxy
783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL client uses this method to release the frame buffer
783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   after displaying them.
784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE        hComp,
785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7852b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("FTB");
785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE nRet = OMX_ErrorNone;
785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_fillbuffer_cmd fillbuffer;
785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7862fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) {
786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex, drv_ctx.op_buf.actualcount);
786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufferAdd, bufferAdd->pBuffer);
787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Return back the output buffer to client*/
787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true || in_reconfig) {
787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone (hComp,m_app_data,buffer);
787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0;
788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen;
788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_ref_add(nPortIndex);
788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen;
788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers++;
7886b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buffer) {
788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("err: client_buffer ptr invalid");
789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return OMX_ErrorBadParameter;
789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ptr_respbuffer) {
789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone (hComp,m_app_data,buffer);
790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pending_output_buffers--;
7902b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&buf, 0, sizeof(buf));
791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int extra_idx = 0;
791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = nPortIndex;
791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].bytesused = buffer->nFilledLen;
791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].length = buffer->nAllocLen;
791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].m.userptr =
791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].data_offset = 0;
792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].bytesused = 0;
792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].data_offset = 0;
793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra_idx >= VIDEO_MAX_PLANES) {
793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = plane;
793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = drv_ctx.num_planes;
794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d",
794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress);
794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
79468a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf to driver, error %s", strerror(errno));
794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone(hComp, m_app_data, buffer);
79488a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel        return OMX_ErrorHardware;
794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
79508a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel
79518a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel    return OMX_ErrorNone;
795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SetCallbacks
795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Set the callbacks.
796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_CALLBACKTYPE* callbacks,
797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR             appData)
797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cb       = *callbacks;
797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EventHandler,m_cb.FillBufferDone);
797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_app_data =    appData;
797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentDeInit
798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Destroys the component and release memory allocated to the heap.
798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void) hComp;
799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i = 0;
799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_StateLoaded != m_state) {
800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state);
800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if the output buffers have to be cleaned up*/
800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Output Memory");
801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_out_bm_count, i)) {
801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR(&m_out_bm_count, i);
801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_buffers.free_output_buffer (&m_out_mem_ptr[i]);
801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_output_done()) {
801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
802311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
802411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
802511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if the input buffers have to be cleaned up*/
802611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr || m_inp_heap_ptr) {
802711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Input Memory");
802811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
802911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
803011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
803111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR(&m_inp_bm_count, i);
803211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_inp_mem_ptr)
803311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer (i,&m_inp_mem_ptr[i]);
803411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
803511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer (i,NULL);
803611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
803711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
803811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_input_done()) {
803911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
804011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
804111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
804211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
804311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    free_input_buffer_header();
804411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    free_output_buffer_header();
804511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer) {
804611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(h264_scratch.pBuffer);
804711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.pBuffer = NULL;
804811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
804911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
805011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_parser) {
805111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete h264_parser;
805211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_parser = NULL;
805311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
805411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
805511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_frame_parser.mutils) {
805611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free utils parser");
805711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete (m_frame_parser.mutils);
805811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.mutils = NULL;
805911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
806011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
806111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_platform_list) {
806211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_platform_list);
806311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_platform_list = NULL;
806411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
806511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_vendor_config.pData) {
806611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_vendor_config.pData);
806711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_vendor_config.pData = NULL;
806811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
806911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
807011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Reset counters in mesg queues
807111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_size=0;
807211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_size=0;
807311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_size=0;
807411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_read = m_ftb_q.m_write =0;
807511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_read = m_cmd_q.m_write =0;
807611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_read = m_etb_q.m_write =0;
807711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
807811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
807911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_timestamp_list.reset_ts_list();
808011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
808111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
808211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
808311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
808411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
808511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // NULL);
808611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Close the driver instance");
808711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
808811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile) {
808911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.infile);
809011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = NULL;
809111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
809211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.outfile) {
809311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.outfile);
809411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = NULL;
809511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
809611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_ymeta_file) {
809711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.out_ymeta_file);
809811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_ymeta_file = NULL;
809911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
810011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_uvmeta_file) {
810111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.out_uvmeta_file);
810211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_uvmeta_file = NULL;
810311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
810411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
810511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (outputExtradataFile)
810611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose (outputExtradataFile);
810711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
810811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete");
810911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
811011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
811111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
811311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
811411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseEGLImage
811511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
811711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use EGL Image method implementation <TBD>.
811811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
812011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
812111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
812211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
812311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Not Implemented error.
812411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
812511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
812611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE     hComp,
812711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
812811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
812911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                     appData,
813011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN void*                      eglImage)
813111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
813211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) appData;
813311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
813411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
813511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
813611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
813711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
813811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
813911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EGLint fd = -1, offset = 0,pmemPtr = 0;
814011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
814111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fd = -1, offset = 0;
814211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
814311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("use EGL image support for decoder");
814411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
814511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid EGL image");
814611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
814711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
814811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_display_id == NULL) {
814911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
815011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
815111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
815211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
815311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eglGetProcAddress("eglQueryImageKHR");
815411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd);
815511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset);
815611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr);
815711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //with OMX test app
815811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct temp_egl {
815911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pmem_fd;
816011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int offset;
816111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
816211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct temp_egl *temp_egl_id = NULL;
816311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void * pmemPtr = (void *) eglImage;
816411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_egl_id = (struct temp_egl *)eglImage;
816511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_egl_id != NULL) {
816611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = temp_egl_id->pmem_fd;
816711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        offset = temp_egl_id->offset;
816811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
816911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
817011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
817111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
817211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
817311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
817411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_info.pmem_fd = (OMX_U32) fd;
817511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_info.offset = (OMX_U32) offset;
817611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_entry.entry = (void *) &pmem_info;
817711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
817811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_list.entryList = &pmem_entry;
817911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_list.nEntries = 1;
818011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers = true;
818111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
818211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
818311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_U8 *)pmemPtr)) {
818411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
818511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
818611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
818711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
818811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
818911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
819011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
819111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
819211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentRoleEnum
819311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
819411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
819511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Component Role Enum method implementation.
819611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
819711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
819811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
819911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
820111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything is successful.
820211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
820311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
820411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_U8*        role,
820511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32        index)
820611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
820711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
820811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
820911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
821011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
821111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
821211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
821311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
821411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
821511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
821611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
821711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
821811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
821911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
822011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
822111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
822211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
822311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
822411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
822511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
822611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
822711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
822811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
822911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
823011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
823111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
823211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
823311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
823411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
823511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
823611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) {
823711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
823811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
823911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
824011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
824111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
824211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
824311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
824411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
824511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
824611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
824711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
824811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
824911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
825011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
825111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
825211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
825311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
825411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
825511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
825611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
825711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
825811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
825911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
826011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
826111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
826211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
826311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s", role);
826411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
826511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
826611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
826711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
826811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
826911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
827011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ) {
827111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
827211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
827311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
827411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
827511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
827611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
827711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
827811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
827911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
828011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
828111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
828211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
828311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
828411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
828511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
828611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
828711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
828811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
828911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
829011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
829111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
829211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
829311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
829411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
829511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
829611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
829711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
829811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
829911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
830011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
830511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
830611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateDone
830711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
830911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if entire buffer pool is allocated by IL Client or not.
831011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Need this to move to IDLE state.
831111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
831211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
831311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
831411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
831511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
831611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
831711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
831811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
831911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_done(void)
832011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
832111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
832211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet_In = false;
832311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet_Out = false;
832411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
832511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet_In = allocate_input_done();
832611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet_Out = allocate_output_done();
832711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
832811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bRet_In && bRet_Out) {
832911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
833011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
833111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
833211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
833311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
833411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
833511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
833611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateInputDone
833711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
833811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
833911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if I/P buffer pool is allocated by IL Client or not.
834011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
834211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
834311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
834511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
834611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
834811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_input_done(void)
834911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
835011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
835111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0;
835211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
835311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr == NULL) {
835411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bRet;
835511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
835611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr ) {
835711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; i<drv_ctx.ip_buf.actualcount; i++) {
835811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
835911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
836011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
836111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
836211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
836311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i == drv_ctx.ip_buf.actualcount) {
836411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
836511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
836611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
836711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
836811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_bPopulated = OMX_TRUE;
836911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
837011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
837111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
837211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
837311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
837411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateOutputDone
837511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
837611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
837711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if entire O/P buffer pool is allocated by IL Client or not.
837811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
837911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
838011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
838111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
838211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
838311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
838411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
838511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
838611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_output_done(void)
838711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
838811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
838911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned j=0;
839011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
839111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr == NULL) {
839211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bRet;
839311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
839411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
839511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
839611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j < drv_ctx.op_buf.actualcount; j++) {
839711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
839811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
839911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
840011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
840111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
840211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
840311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (j == drv_ctx.op_buf.actualcount) {
840411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
840511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
840611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_bEnabled)
840711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bPopulated = OMX_TRUE;
840811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
840911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
841011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
841111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
841211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
841311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
841411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
841511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseDone
841611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
841711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
841811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
841911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
842011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
842111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
842211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
842311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
842411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
842511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
842611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
842711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_done(void)
842811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
842911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
843011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
843111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (release_input_done()) {
843211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_output_done()) {
843311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
843411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
843511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
843611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
843711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
843811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
843911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
844011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
844111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
844211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseOutputDone
844311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
844411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
844511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
844611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
844711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
844811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
844911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
845011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
845111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
845211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
845311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
845411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_output_done(void)
845511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
845611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
845711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0,j=0;
845811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
845911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr);
846011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
846111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j < drv_ctx.op_buf.actualcount ; j++) {
846211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
846311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
846411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
846511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
846611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (j == drv_ctx.op_buf.actualcount) {
846711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bm_count = 0;
846811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
846911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
847011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
847111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_bm_count = 0;
847211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
847311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
847411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
847511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
847611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
847711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
847811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseInputDone
847911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
848011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
848111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
848211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
848311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
848411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
848511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
848611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
848711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
848811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
848911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
849011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_input_done(void)
849111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
849211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
849311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0,j=0;
849411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
849511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
849611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr) {
849711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j<drv_ctx.ip_buf.actualcount; j++) {
849811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
849911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
850011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
850111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
850211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (j==drv_ctx.ip_buf.actualcount) {
850311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
850411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
850511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
850611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
850711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
850811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
850911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
851011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
851111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
851211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE * buffer)
851311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8514b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("FBD");
851511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
851611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) {
851711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
851811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
851911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (output_flush_progress) {
852011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
852111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
852211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nTimeStamp = 0;
852311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
852411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
852511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
852611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
852711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
852811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_extradata) {
852911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
853011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
853111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received");
853211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
853311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
853411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
853511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
853611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
853711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
853811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
853911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
854011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
854111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
854211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
854311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld",
854411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp);
854511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers --;
8546b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
854711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
854811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
854911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Output EOS has been reached");
855011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!output_flush_progress)
855111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event((unsigned)NULL, (unsigned)NULL,
855211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EOS_DONE);
855311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
855411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame) {
855511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
855611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
855711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
855811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame) {
855911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen = 0;
856011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL,
856111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL);
856211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = NULL;
856311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
856411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
856511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
856611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
856711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (outputExtradataFile) {
856811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int buf_index = buffer - m_out_mem_ptr;
856911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr);
857011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
857111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
857211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)
857311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3));
857411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
857511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) {
857611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x",
857711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    p_extra->nSize, p_extra->eType);
857811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
857911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
858011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (p_extra->eType == OMX_ExtraDataNone) {
858111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
858211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
858311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
858411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
858511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
858611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
858711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
858811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* For use buffer we need to copy the data */
858911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!output_flush_progress) {
859011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* This is the error check for non-recoverable errros */
859111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_duplicate_ts_valid = true;
859211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
859311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
859411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (output_capability == V4L2_PIX_FMT_MPEG4 ||
859511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_MPEG2 ||
859611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_DIVX ||
859711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_DIVX_311)
859811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            is_duplicate_ts_valid = false;
859911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
860011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((output_capability == V4L2_PIX_FMT_H264 ||
860111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_H264_MVC) &&
860211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                is_interlaced) {
860311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) {
860411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                is_interlaced = false;
860511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
860611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
860711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
860811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen > 0) {
860911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            time_stamp_dts.get_next_timestamp(buffer,
861011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_interlaced && is_duplicate_ts_valid);
861111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_debug_timestamp) {
861211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
861311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_TICKS expected_ts = 0;
861411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_timestamp_list.pop_min_ts(expected_ts);
861511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (is_interlaced && is_duplicate_ts_valid) {
861611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_timestamp_list.pop_min_ts(expected_ts);
861711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
861811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
861911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            buffer->nTimeStamp, expected_ts);
862011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
862111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (buffer->nTimeStamp != expected_ts) {
862211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
862311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
862411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
862511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
862611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
862711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
8628b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FBD-TS", buffer->nTimeStamp / 1000);
862911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
863011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_cb.FillBufferDone) {
863111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen > 0) {
863211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes)
863311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                adjust_timestamp(buffer->nTimeStamp);
863411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
863511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                set_frame_rate(buffer->nTimeStamp);
863611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8637fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            proc_frms++;
863811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (perf_flag) {
8639fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (1 == proc_frms) {
864011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dec_time.stop();
864111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    latency = dec_time.processing_time_us() - latency;
864211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
864311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dec_time.start();
864411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fps_metrics.start();
864511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
864611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
864711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U64 proc_time = 0;
864811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fps_metrics.stop();
864911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    proc_time = fps_metrics.processing_time_us();
865011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)",
865111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)proc_frms, (float)proc_time / 1e6,
865211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (float)(1e6 * proc_frms) / proc_time);
865311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
865411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
865511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
865611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
865711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            prev_ts = LLONG_MAX;
865811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rst_prev_ts = true;
8659fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            proc_frms = 0;
866011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
866111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
866211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
866311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
866411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             buffer->pPlatformPrivate)->entryList->entry;
866511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
866611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *il_buffer;
866711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        il_buffer = client_buffers.get_il_buf_hdr(buffer);
866811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator);
866911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (il_buffer && m_last_rendered_TS >= 0) {
867111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS);
867211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Current frame can be send for rendering if
867411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (a) current FPS is <=  60
867511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (b) is the next frame after the frame with TS 0
867611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (c) is the first frame after seek
867711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (d) the delta TS b\w two consecutive frames is > 16 ms
867811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (e) its TS is equal to previous frame TS
867911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (f) if marked EOS
868011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
868111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(current_framerate <= 60 || m_last_rendered_TS == 0 ||
868211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               il_buffer->nTimeStamp == 0 || ts_delta >= 16000 ||
868311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
868411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               m_last_rendered_TS = il_buffer->nTimeStamp;
868511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
868611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               //mark for droping
868711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               buffer->nFilledLen = 0;
868811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
868911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
869011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)",
869111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS,
869211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              il_buffer->nTimeStamp,ts_delta);
869311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
869411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //above code makes sure that delta b\w two consecutive frames is not
869511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //greater than 16ms, slow-mo feature, so cap fps to max 60
869611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (current_framerate > 60 ) {
869711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                current_framerate = 60;
869811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
869911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
870011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
870111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // add current framerate to gralloc meta data
8702af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        if ((buffer->nFilledLen > 0) && m_enable_android_native_buffers && m_out_mem_ptr) {
8703af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            // If valid fps was received, directly send it to display for the 1st fbd.
8704af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            // Otherwise, calculate fps using fbd timestamps
8705fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            float refresh_rate = m_fps_prev;
8706fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (m_fps_received) {
8707fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (1 == proc_frms) {
8708fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    refresh_rate = m_fps_received / (float)(1<<16);
8709fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
8710fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            } else {
8711af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                // check if dynamic refresh rate change feature enabled or not
8712af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                if (m_drc_enable) {
8713af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // set coarse fps when 2 fbds received and
8714af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // set fps again when 30 fbds received as it should be
8715af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // more accurate than the one set when only 2 fbds received.
8716af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    if (2 == proc_frms || 30 == proc_frms) {
8717af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        if (drv_ctx.frame_rate.fps_denominator) {
8718af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                            refresh_rate = drv_ctx.frame_rate.fps_numerator /
8719af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                                    (float) drv_ctx.frame_rate.fps_denominator;
8720af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        }
8721af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    }
8722af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                } else {
8723af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // calculate and set refresh rate for every frame from second frame onwards
8724af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // display will assume the default refresh rate for first frame (which is 60 fps)
8725af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    if (m_fps_prev) {
8726af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        if (drv_ctx.frame_rate.fps_denominator) {
8727af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                            refresh_rate = drv_ctx.frame_rate.fps_numerator /
8728af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                                    (float) drv_ctx.frame_rate.fps_denominator;
8729af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        }
8730af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    }
8731fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
8732fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
8733fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (refresh_rate > 60) {
8734fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                refresh_rate = 60;
8735fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
8736fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_LOW("frc set refresh_rate %f, frame %d", refresh_rate, proc_frms);
873711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 buf_index = buffer - m_out_mem_ptr;
873811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
8739fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         UPDATE_REFRESH_RATE, (void*)&refresh_rate);
8740fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_fps_prev = refresh_rate;
874111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
874211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
874311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen && m_enable_android_native_buffers && m_out_mem_ptr) {
874411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 buf_index = buffer - m_out_mem_ptr;
874511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("stereo_output_mode = %d",stereo_output_mode);
874611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
874711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               S3D_FORMAT, (void*)&stereo_output_mode);
874811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
874911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
875011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (il_buffer) {
875111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            log_output_buffers(il_buffer);
875211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dynamic_buf_mode) {
875311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int nPortIndex = 0;
875411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
875511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
875611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Since we're passing around handles, adjust nFilledLen and nAllocLen
875711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // to size of the handle. Do it _after_ log_output_buffers which
875811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // requires the respective sizes to be accurate.
875911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
876011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
876111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer->nFilledLen = buffer->nFilledLen ?
876211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sizeof(struct VideoDecoderOutputMetaData) : 0;
876311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
876411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //Clear graphic buffer handles in dynamic mode
876511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (nPortIndex < drv_ctx.op_buf.actualcount &&
876611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
876711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_buffer[nPortIndex].privatehandle = NULL;
876811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_buffer[nPortIndex].nativehandle = NULL;
876911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
877011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex);
877111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
877211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
877311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
877411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
877511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
877611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
877711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
877811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
877911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
878011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
878111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
878211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
878311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
878411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
878511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_smoothstreaming_mode && m_out_mem_ptr) {
878611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 buf_index = buffer - m_out_mem_ptr;
878711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BufferDim_t dim;
878811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        private_handle_t *private_handle = NULL;
878911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dim.sliceWidth = framesize.nWidth;
879011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dim.sliceHeight = framesize.nHeight;
879111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buf_index < drv_ctx.op_buf.actualcount &&
879211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
879311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[buf_index].privatehandle)
879411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private_handle = native_buffer[buf_index].privatehandle;
879511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (private_handle) {
879611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d",
879711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dim.sliceWidth, dim.sliceHeight);
879811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
879911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
880011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
880111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
880211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
880311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
880411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
880511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
880611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
880711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE* buffer)
880811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8809b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("EBD");
881011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int nBufferIndex = buffer - m_inp_mem_ptr;
881111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8812fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) {
881311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
881411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
881511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
881611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
881711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x",
881811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nFlags);
881911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers--;
8820b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
882111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
882211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
882311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame == NULL && input_flush_progress == false) {
882411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
882511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = buffer;
882611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nFilledLen = 0;
882711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nTimeStamp = LLONG_MAX;
882811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            push_input_buffer (hComp);
882911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
883011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
883111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nFilledLen = 0;
883211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_input_free_q.insert_entry((unsigned long)buffer,
883311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned)NULL, (unsigned)NULL)) {
883411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
883511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
883611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
883711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_cb.EmptyBufferDone) {
883811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
883911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (input_use_buffer == true) {
884011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
884111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
884211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
884311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Restore the FD that we over-wrote in ETB */
884411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pass_buffer_fd) {
884511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd;
884611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
884711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
884811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
884911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
885011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
885111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
885211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
885311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::async_message_process (void *context, void* message)
885411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
885511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec* omx = NULL;
885611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_msginfo *vdec_msg = NULL;
885711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
885811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer *v4l2_buf_ptr = NULL;
885911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane *plane = NULL;
886011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo *output_respbuf = NULL;
886111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc=1;
886211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (context == NULL || message == NULL) {
886311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
886411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
886511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
886611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vdec_msg = (struct vdec_msginfo *)message;
886711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
886811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = reinterpret_cast<omx_vdec*>(context);
886911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
887011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (vdec_msg->msgcode) {
887111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
887211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_ERROR:
887311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
887411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
887511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
887611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
887711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_OVERLOAD:
887811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
887911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
888011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
888111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
888211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_UNSUPPORTED:
888311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
888411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
888511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
888611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
888711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_START_DONE:
888811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
888911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_START_DONE);
889011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
889111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
889211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_STOP_DONE:
889311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
889411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_STOP_DONE);
889511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
889611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
889711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_RESUME_DONE:
889811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
889911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_RESUME_DONE);
890011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
890111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
890211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_PAUSE_DONE:
890311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
890411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
890511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
890611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
890711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
890811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
890911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
891011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
891111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
891211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
891311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
891411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
891511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_INPUT_FLUSHED:
891611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
891711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
891811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
891911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               vdec_msg->msgdata.input_frame_clientdata; */
892011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
892111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
892211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL ||
892311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) {
892411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr = NULL;
892511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg->status_code = VDEC_S_EFATAL;
892611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
892711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
892811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
892911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index;
893011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
893111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
893211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Unsupported input");
893311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
893411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
893511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
893611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
893711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
893811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
893911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
894011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
894111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
894211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Decrement codec_config buffer counter");
894311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                android_atomic_dec(&omx->m_queued_codec_config_count);
894411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) &&
894511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) {
894611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer");
894711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post(&omx->m_safe_flush);
894811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
894911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
895011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME ||
895111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
895211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
895311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
895411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code,
895511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
895611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
895711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
895811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int64_t *timestamp;
895911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            timestamp = (int64_t *) malloc(sizeof(int64_t));
896011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (timestamp) {
896111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
896211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned long)timestamp, vdec_msg->status_code,
896311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
896411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
896511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (long long)vdec_msg->msgdata.output_frame.time_stamp);
896611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
896711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
896811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
896911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
897011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
897111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
897211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL ||
897311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) {
897411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omxhdr = NULL;
897511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               vdec_msg->status_code = VDEC_S_EFATAL;
897611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
897711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
897811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           plane = v4l2_buf_ptr->m.planes;
897911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index;
898011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
898111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (omxhdr && omxhdr->pOutputPortPrivate &&
898211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) &&
898311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
898411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) {
898511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
898611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
898711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
898811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
898911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
899011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFlags = 0;
899111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
899211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
899311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
899411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //rc = -1;
899511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
899611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen) {
899711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
899811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
899911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
900011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
900111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   } else {
900211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
900311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
900411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
900511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
900611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
900711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
900811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
900911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
901011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) {
901111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF;
901211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
901311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) {
901411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY;
901511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d",
901611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd);
901711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
901811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
901911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
902011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !omx->output_flush_progress &&
902111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
902211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) {
902311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->time_stamp_dts.remove_time_stamp(
902411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omxhdr->nTimeStamp,
902511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
902611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               ?true:false);
902711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9028bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                       omxhdr->nFilledLen = 0;
9029bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                       omx->pending_output_buffers--;
9030bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                       omx->post_event ((unsigned long)NULL,(unsigned long)omx->client_buffers.get_il_buf_hdr(omxhdr),
9031bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                               OMX_COMPONENT_GENERATE_FTB);
903211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       break;
903311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
903411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
903511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
903611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
903711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
903811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf = (struct vdec_output_frameinfo *)\
903911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            omxhdr->pOutputPortPrivate;
904011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (!output_respbuf) {
904111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("async_message_process: invalid output buf received");
904211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     return -1;
904311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
904411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf->len = vdec_msg->msgdata.output_frame.len;
904511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
904611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
904711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
904811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_I;
904911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
905011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
905111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_P;
905211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
905311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
905411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_B;
905511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
905611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
905711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (vdec_msg->msgdata.output_frame.len) {
905842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                       if (!omx->output_flush_progress && (omxhdr->nFilledLen > 0)) {
905942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // set the default colorspace advised by client, since the bitstream may be
906042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // devoid of colorspace-info.
906142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           if (omx->m_enable_android_native_buffers) {
906242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               ColorSpace_t color_space = ITU_R_601;
906342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
906442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Disabled ?
906542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // WA for VP8. Vp8 encoder does not embed color-info (yet!).
906642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Encoding RGBA results in 601-LR for all resolutions.
906742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // This conflicts with the client't defaults which are based on resolution.
906842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           //   Eg: 720p will be encoded as 601-LR. Client will say 709.
906942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Re-enable this code once vp8 encoder generates color-info and hence the
907042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // decoder will be able to override with the correct source color.
907142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#if 0
907242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               switch (omx->m_client_color_space.sAspects.mPrimaries) {
907342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT601_6_625:
907442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT601_6_525:
907542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
907642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space = omx->m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ?
907742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                               ITU_R_601_FR : ITU_R_601;
907842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
907942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
908042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT709_5:
908142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
908242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space = ITU_R_709;
908342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
908442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
908542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   default:
908642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
908742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
908842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
908942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               }
909042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif
909142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)",
909242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
909342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               omx->set_colorspace_in_handle(color_space, omxhdr - omx->m_out_mem_ptr);
909442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           }
909542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                       }
909642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
909711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_LOW("Processing extradata");
909811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->handle_extradata(omxhdr);
909911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
910011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (omx->m_extradata_info.output_crop_updated) {
910111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_LOW("Read FBD crop from output extra data");
910211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left = omx->m_extradata_info.output_crop_rect.nLeft;
910311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top = omx->m_extradata_info.output_crop_rect.nTop;
910411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right = omx->m_extradata_info.output_crop_rect.nWidth;
910511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom = omx->m_extradata_info.output_crop_rect.nHeight;
910611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_width = omx->m_extradata_info.output_width;
910711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_height = omx->m_extradata_info.output_height;
910811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else {
910911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields");
911011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left = plane[0].reserved[2];
911111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top = plane[0].reserved[3];
911211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right = plane[0].reserved[2] + plane[0].reserved[4];
911311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom = plane[0].reserved[3] + plane[0].reserved[5];
911411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
911511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
9116fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
9117fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           /* Copy these values back to OMX internal variables to make both handlign same*/
9118fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
9119fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
9120fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nTop = vdec_msg->msgdata.output_frame.framesize.top;
9121fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
9122fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
9123fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
9124fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
912511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
912611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
912711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
912811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   vdec_msg->msgdata.output_frame.bufferaddr =
912911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
913011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                   if (vdec_msg->msgdata.output_frame.len)
9132fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                       memcpy(&omx->drv_ctx.frame_size,
9133fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               &vdec_msg->msgdata.output_frame.framesize,
9134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               sizeof(struct vdec_framesize));
913511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9136fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                   DEBUG_PRINT_LOW("[RespBufDone] Fd(%d) Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x)"
9137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                           " FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)",
9138fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                           omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd,
913911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp,
914011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags,
914111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned int)vdec_msg->msgdata.output_frame.len,
914211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left,
914311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top,
914411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right,
914511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom);
914611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
914711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* Post event if resolution OR crop changed */
914811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* filled length will be changed if resolution changed */
914911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* Crop parameters can be changed even without resolution change */
915011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen
915111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       && ((omx->prev_n_filled_len != omxhdr->nFilledLen)
915211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left)
915311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top)
915411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right)
915511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom)
915611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width)
915711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) {
915811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
915911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_HIGH("Parameters 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",
916011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->prev_n_filled_len,
916111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.video_resolution.frame_width,
916211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.video_resolution.frame_height,
916311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top,
916411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom,
916511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width,
916611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_height,
916711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.left,
916811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.top,
916911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.right,
917011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.bottom);
917111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
917211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.video_resolution.frame_width =
917311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_width;
917411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.video_resolution.frame_height =
917511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_height;
917611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
917711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.stride =
917811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width);
917911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
918011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height);
918111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
918211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.stride =
918311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width);
918411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
918511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height);
9186b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                       } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
9187b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                           omx->drv_ctx.video_resolution.stride =
9188b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_width);
9189b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
9190b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_height);
9191b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        }
919211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
919311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX,
919411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_IndexConfigCommonOutputCrop,
919511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
919611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
919711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
919811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen)
919911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->prev_n_filled_len = omxhdr->nFilledLen;
920011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9201a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                   if (omxhdr && omxhdr->nFilledLen && !omx->m_need_turbo) {
920211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx->request_perf_level(VIDC_NOMINAL);
920311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
920411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omx->output_use_buffer && omxhdr->pBuffer &&
920511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       vdec_msg->msgdata.output_frame.bufferaddr)
920611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       memcpy ( omxhdr->pBuffer, (void *)
920711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
920811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned long)vdec_msg->msgdata.output_frame.offset),
920911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.len);
921011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               } else {
921111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u",
921211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned int)vdec_msg->msgdata.output_frame.len,
921311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omxhdr->nAllocLen, omx->prev_n_filled_len);
921411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFilledLen = 0;
921511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
921611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
921711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code,
921811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_FBD);
921911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
922011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) {
922111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned long)NULL, vdec_msg->status_code,
922211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EOS_DONE);
922311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
922411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
922511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
922611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
922711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
922811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_CONFIG_CHANGED:
922911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Port settings changed");
923011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
923111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
923211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
923311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
9234a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (!omx->m_need_turbo) {
923511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->request_perf_level(VIDC_NOMINAL);
923611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
923711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
923811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
923911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
924011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
924111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
924211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
924311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
924411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
924511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_HANDLETYPE hComp,
924611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *buffer
924711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
924811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
924911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned address,p2,id;
925011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Empty this arbitrary");
925111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
925211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
925311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
925411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
925511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
925611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld",
925711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp);
925811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
925911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return zero length and not an EOS buffer */
926011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return buffer if input flush in progress */
926111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
926211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
926311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
926411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
926511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
926611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
926711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
926811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (psource_frame == NULL) {
926911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
927011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = buffer;
927111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
927211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        push_input_buffer (hComp);
927311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
927411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
927511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL,
927611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL)) {
927711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
927811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
927911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
928011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
928111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
928211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = false;
928311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
928411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
928511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
928611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
928711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
928811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
928911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address,p2,id;
929011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
929111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
929211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pdest_frame == NULL || psource_frame == NULL) {
929311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if we have a destination buffer*/
929411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame == NULL) {
929511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
929611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_free_q.m_size) {
929711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_free_q.pop_entry(&address,&p2,&id);
929811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
929911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen = 0;
930011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nTimeStamp = LLONG_MAX;
930111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
930211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
930311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
930411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
930511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if we have a destination buffer*/
930611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame == NULL) {
930711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Get a source buffer from the queue");
930811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pending_q.m_size) {
930911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_pending_q.pop_entry(&address,&p2,&id);
931011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
931111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
931211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        psource_frame->nTimeStamp);
931311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
931411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
931511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
931611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
931711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
931811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
931911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
932011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
932111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
932211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_type_parse) {
932311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_MPEG4:
932411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_H263:
932511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_MPEG2:
932611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret =  push_input_sc_codec(hComp);
932711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
932811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_H264:
932911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_h264(hComp);
933011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
933111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_HEVC:
933211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_hevc(hComp);
933311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
933411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_VC1:
933511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_vc1(hComp);
933611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
933711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
933811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
933911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
934011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret != OMX_ErrorNone) {
934111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
934211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx_report_error ();
934311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
934411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
934511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
934611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
934711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
934811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
934911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
935011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
935111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
935211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
935311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
935411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address = 0, p2 = 0, id = 0;
935511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
935611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld",
935711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame,psource_frame->nTimeStamp);
935811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_frame_parser.parse_sc_frame(psource_frame,
935911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame,&partial_frame) == -1) {
936011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
936111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
936211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
936311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
936411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
936511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Frame size %u source %p frame count %d",
936611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count);
936711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
936811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
936911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp);
937011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*First Parsed buffer will have only header Hence skip*/
937111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frame_count == 0) {
937211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
937311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
937411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
937511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    codec_type_parse == CODEC_TYPE_DIVX) {
937611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                mp4StreamType psBits;
937711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
937811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psBits.numBytes = pdest_frame->nFilledLen;
937911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                mp4_headerparser.parseHeader(&psBits);
938011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
938111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
938211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_count++;
938311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
938411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
938511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame->nFilledLen) {
938611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
938711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
938811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
938911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
939011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
939111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
939211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
939311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_input_free_q.m_size) {
939411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_input_free_q.pop_entry(&address,&p2,&id);
939511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
939611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFilledLen = 0;
939711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
939811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
939911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
940011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL,
940111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned)NULL);
940211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
940311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
940411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
940511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
940611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen);
940711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if Destination Buffer is full*/
940811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame->nAllocLen ==
940911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen + pdest_frame->nOffset) {
941011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
941111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
941211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
941311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
941411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
941511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (psource_frame->nFilledLen == 0) {
941611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
941711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
941811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFlags |= psource_frame->nFlags;
9419fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
942011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld",
942111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
942211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
942311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
942411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
942511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
942611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
942711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
942811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
942911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
943011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
943111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
943211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
943311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
943411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
943511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (generate_ebd) {
943611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
943711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
943811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
943911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
944011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pending_q.m_size) {
944111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
944211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_pending_q.pop_entry(&address,&p2,&id);
944311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
944411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
944511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        psource_frame->nTimeStamp);
944611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
944711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
944811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
944911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
945011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
945111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
945211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
945311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
945411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
945511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
945611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
945711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address = 0, p2 = 0, id = 0;
945811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL isNewFrame = OMX_FALSE;
945911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
946011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
946111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer == NULL) {
946211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
946311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
946411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
946511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u "
946611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal);
946711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen);
946811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.nFilledLen && look_ahead_nal) {
946911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
947011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
947111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen) {
947211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
947311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
947411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
947511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
947611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFilledLen = 0;
947711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
947811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
947911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
948011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
948111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
948211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
948311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result
948411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       in EOS flag getting associated with the destination
948511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    */
948611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) &&
948711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen) {
948811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'");
948911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        generate_ebd = OMX_FALSE;
949011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
949111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
949211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nal_length == 0) {
949311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
949411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_sc_frame(psource_frame,
949511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
949611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
949711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
949811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
949911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
950011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
950111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_h264_nallength(psource_frame,
950211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
950311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
950411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
950511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
950611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
950711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
950811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
950911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
951011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
951111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nal_count++;
951211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
951311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFlags = psource_frame->nFlags;
951411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
951511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen);
951611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (h264_scratch.nFilledLen) {
951711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
951811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        NALU_TYPE_SPS);
951911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
952011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
952111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
952211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
952311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
952411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // If timeinfo is present frame info from SEI is already processed
952511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
952611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
952711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
952811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
952911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_count++;
953011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
953111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nTimeStamp = h264_last_au_ts;
953211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFlags = h264_last_au_flags;
953311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef PANSCAN_HDLR
953411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
953511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_parser->update_panscan_data(h264_last_au_ts);
953611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
953711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
953811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
953911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
954011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_ts = h264_scratch.nTimeStamp;
954111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_flags = h264_scratch.nFlags;
954211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
954311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
954411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
954511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (!VALID_TS(h264_last_au_ts))
954611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_last_au_ts = ts_in_sei;
954711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
954811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
954911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else
955011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_ts = LLONG_MAX;
955111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
955211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
955311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!isNewFrame) {
955411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
955511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen) {
955611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u",
955711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)h264_scratch.nFilledLen);
955811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
955911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
956011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
956111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
956211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
956311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nFilledLen = 0;
956411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
956511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
956611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
956711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
956811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if(h264_scratch.nFilledLen) {
956911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                look_ahead_nal = true;
957011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu",
957111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
957211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
957311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
957411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
957511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pdest_frame->nFilledLen == 0) {
957611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
957711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    look_ahead_nal = false;
957811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
957911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen) {
958011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
958111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
958211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
958311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen = 0;
958411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
958511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
958611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
958711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
958811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
958911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
959011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Reset the EOS Flag");
959111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
959211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
959311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*Push the frame to the Decoder*/
959411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
959511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
959611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
959711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //frame_count++;
959811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = NULL;
959911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_input_free_q.m_size) {
960011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_input_free_q.pop_entry(&address,&p2,&id);
960111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
960211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
960311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen = 0;
960411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags = 0;
960511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = LLONG_MAX;
960611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
960711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
960811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
960911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
961011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
961111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen);
961211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if Destination Buffer is full*/
961311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (h264_scratch.nAllocLen ==
961411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen + h264_scratch.nOffset) {
961511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
961611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
961711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
961811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
961911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
962011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen) {
962111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
962211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
962311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
962411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
962511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
962611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
962711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen) {
962811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(pdest_frame->nFilledLen == 0) {
962911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        /* No residual frame from before, send whatever
963011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         * we have left */
963111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
963211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                h264_scratch.pBuffer, h264_scratch.nFilledLen);
963311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
963411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen = 0;
963511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
963611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
963711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
963811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if(!isNewFrame) {
963911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Have a residual frame, but we know that the
964011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * AU in this frame is belonging to whatever
964111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * frame we had left over.  So append it */
964211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
964311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
964411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
964511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             h264_scratch.nFilledLen = 0;
964611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             if (h264_last_au_ts != LLONG_MAX)
964711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 pdest_frame->nTimeStamp = h264_last_au_ts;
964811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else {
964911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Completely new frame, let's just push what
965011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * we have now.  The resulting EBD would trigger
965111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * another push */
965211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            generate_ebd = OMX_FALSE;
965311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pdest_frame->nTimeStamp = h264_last_au_ts;
965411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_last_au_ts = h264_scratch.nTimeStamp;
965511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
965611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
965711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
965811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
965911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
966011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
966111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
966211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Iff we coalesced two buffers, inherit the flags of both bufs */
966311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(generate_ebd == OMX_TRUE) {
966411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
966511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
966611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
966711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu",
966811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
966911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
967011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
967111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
967211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
967311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!VALID_TS(pdest_frame->nTimeStamp))
967411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = ts_in_sei;
967511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
967611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
967711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
967811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
967911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
968011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
968111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
968211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
968311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
968411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
968511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
968611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
968711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
968811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
968911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
969011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (generate_ebd && !psource_frame->nFilledLen) {
969111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
969211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = NULL;
969311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pending_q.m_size) {
969411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
969511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&address,&p2,&id);
969611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
969711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u",
969811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
969911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
970011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
970111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
970211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
970311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
970411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
970511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
970611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE rc = OMX_ErrorNone;
970711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
970811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
970911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pDst->nTimeStamp == LLONG_MAX) {
971011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pDst->nTimeStamp = pSrc->nTimeStamp;
971111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp);
971211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
971311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pDst->nFilledLen += pSrc->nFilledLen;
971411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pSrc->nFilledLen = 0;
971511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
971611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
971711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = OMX_ErrorBadParameter;
971811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
971911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
972011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
972111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
972211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp)
972311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
972411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
972511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address,p2,id;
972611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL isNewFrame = OMX_FALSE;
972711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
972811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE rc = OMX_ErrorNone;
972911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer == NULL) {
973011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
973111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
973211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
973311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
973411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \
973511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame nFilledLen %u nTimeStamp %lld",
973611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
973711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
973811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.nFilledLen && look_ahead_nal) {
973911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
974011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = copy_buffer(pdest_frame, &h264_scratch);
974111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc != OMX_ErrorNone) {
974211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
974311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
974411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
974511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
974611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nal_length == 0) {
974711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_sc_frame(psource_frame,
974811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
974911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
975011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
975111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
975211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
975311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
975411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_h264_nallength(psource_frame,
975511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
975611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
975711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
975811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
975911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
976011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
976111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
976211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
976311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
976411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nal_count++;
976511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
976611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFlags = psource_frame->nFlags;
976711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
976811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen);
976911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (h264_scratch.nFilledLen) {
977011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame);
977111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_count++;
977211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
977311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
977411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!isNewFrame) {
977511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \
977611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld",
977711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp,
977811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
977911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = copy_buffer(pdest_frame, &h264_scratch);
978011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc != OMX_ErrorNone) {
978111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return rc;
978211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
978311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
978411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                look_ahead_nal = true;
978511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pdest_frame->nFilledLen == 0) {
978611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    look_ahead_nal = false;
978711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
978811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc = copy_buffer(pdest_frame, &h264_scratch);
978911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (rc != OMX_ErrorNone) {
979011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
979111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
979211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
979311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
979411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
979511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
979611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \
979711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            nTimeStamp %lld, look_ahead_nal in h264_scratch \
979811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            nFilledLen %u nTimeStamp %lld",
979911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            frame_count++, (unsigned int)pdest_frame->nFilledLen,
980011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen,
980111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nTimeStamp);
980211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
980311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
980411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
980511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = NULL;
980611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_input_free_q.m_size) {
980711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_input_free_q.pop_entry(&address, &p2, &id);
980811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
980911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame);
981011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen = 0;
981111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags = 0;
981211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = LLONG_MAX;
981311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
981411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
981511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
981611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
981711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
981811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \
981911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \
982011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nFilledLen %u nTimeStamp %lld",
982111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp,
982211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp,
982311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
982411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
982511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (h264_scratch.nAllocLen ==
982611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen + h264_scratch.nOffset) {
982711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
982811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
982911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
983011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
983111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
983211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen) {
983311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame);
983411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
983511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
983611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
983711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = copy_buffer(pdest_frame, &h264_scratch);
983811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( rc != OMX_ErrorNone ) {
983911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return rc;
984011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
984111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
984211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
984311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld",
984411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
984511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
984611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
984711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
984811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
984911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
985011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
985111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
985211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
985311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
985411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
985511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
985611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
985711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
985811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (generate_ebd && !psource_frame->nFilledLen) {
985911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame);
986011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = NULL;
986111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pending_q.m_size) {
986211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&address, &p2, &id);
986311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = (OMX_BUFFERHEADERTYPE *)address;
986411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld",
986511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp);
986611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
986711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
986811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
986911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
987011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
987111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp)
987211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
987311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buf, *pdest;
987411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
987511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 buf_len, dest_len;
987611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
987711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (first_frame == 0) {
987811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        first_frame = 1;
987911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
988011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_vendor_config.pData) {
988111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
988211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf = psource_frame->pBuffer;
988311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_len = psource_frame->nFilledLen;
988411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
988511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
988611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VC1_SP_MP_START_CODE) {
988711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_vc1_profile = VC1_SP_MP_RCV;
988811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
988911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_vc1_profile = VC1_AP;
989011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
989111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
989211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorStreamCorrupt;
989311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
989411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
989511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
989611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nOffset;
989711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
989811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nOffset);
989911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
990011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dest_len < m_vendor_config.nDataSize) {
990111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Destination buffer full");
990211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
990311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
990411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
990511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
990611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
990711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
990811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
990911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
991011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (m_vc1_profile) {
991111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VC1_AP:
991211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
991311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
991411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
991511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
991611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
991711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
991811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
991911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VC1_SP_MP_RCV:
992011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
992111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
992211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
992311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
992411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
992511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
992611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
992711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef USE_ION
992811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
992911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 alignment)
993011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
993111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem_allocation allocation;
993211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocation.size = buffer_size;
993311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocation.align = clip2(alignment);
993411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocation.align < 4096) {
993511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocation.align = 4096;
993611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
993711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
993811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
993911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                allocation.align, allocation.size);
994011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
994111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
994211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
994311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
994411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
994511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
994611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
994711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
994811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_fd_data *fd_data, int flag)
994911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
995011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fd = -EINVAL;
995111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = -EINVAL;
995211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_dev_flag;
995311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion ion_buf_info;
995411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!alloc_data || buffer_size <= 0 || !fd_data) {
995511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
995611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -EINVAL;
995711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
995811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ion_dev_flag = O_RDONLY;
995911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd = open (MEM_DEVICE, ion_dev_flag);
996011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
996111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
996211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return fd;
996311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
996411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
996511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->flags = flag;
996611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->len = buffer_size;
996711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->align = clip2(alignment);
996811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (alloc_data->align < 4096) {
996911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->align = 4096;
997011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
997111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
997211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
997311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (secure_mode && (alloc_data->flags & ION_SECURE)) {
997411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
997511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
997611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
997711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Use secure display cma heap for obvious reasons. */
997811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) {
997911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID);
998011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
998111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
998211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
998311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc || !alloc_data->handle) {
998411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION ALLOC memory failed");
998511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->handle = 0;
998611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(fd);
998711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = -ENOMEM;
998811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return fd;
998911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
999011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd_data->handle = alloc_data->handle;
999111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(fd,ION_IOC_MAP,fd_data);
999211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
999311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION MAP failed ");
999411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.ion_alloc_data = *alloc_data;
999511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.ion_device_fd = fd;
999611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.fd_ion_data = *fd_data;
999711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_ion_memory(&ion_buf_info);
999811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd_data->fd =-1;
999911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = -ENOMEM;
1000011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1000111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1000211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return fd;
1000311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1000411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1000511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
1000611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1000711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1000811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buf_ion_info) {
1000911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
1001011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1001111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1001211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
1001311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &buf_ion_info->ion_alloc_data.handle)) {
1001411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION: free failed" );
1001511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1001611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(buf_ion_info->ion_device_fd);
1001711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->ion_device_fd = -1;
1001811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->ion_alloc_data.handle = 0;
1001911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->fd_ion_data.fd = -1;
1002011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1002111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1002211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_output_buffer_header()
1002311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1002411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
1002511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_use_buffer = false;
1002611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers = false;
1002711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1002811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
1002911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (m_out_mem_ptr);
1003011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = NULL;
1003111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1003211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1003311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_platform_list) {
1003411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_platform_list);
1003511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_platform_list = NULL;
1003611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1003711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1003811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_respbuffer) {
1003911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_respbuffer);
1004011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = NULL;
1004111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1004211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_outputbuffer) {
1004311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_outputbuffer);
1004411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = NULL;
1004511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1004611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1004711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.op_buf_ion_info) {
1004811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free o/p ion context");
1004911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(drv_ctx.op_buf_ion_info);
1005011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = NULL;
1005111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1005211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
10053bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel    free(drv_ctx.op_buf_map_info);
10054bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel    drv_ctx.op_buf_map_info = NULL;
1005511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ref_remove();
1005611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1005711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1005811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_input_buffer_header()
1005911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1006011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_use_buffer = false;
1006111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
1006211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr) {
1006311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free input Heap Pointer");
1006411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free (m_inp_heap_ptr);
1006511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_heap_ptr = NULL;
1006611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1006711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1006811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_phdr_pmem_ptr) {
1006911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free input pmem header Pointer");
1007011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free (m_phdr_pmem_ptr);
1007111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_phdr_pmem_ptr = NULL;
1007211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1007311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1007411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr) {
1007511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free input pmem Pointer area");
1007611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (m_inp_mem_ptr);
1007711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = NULL;
1007811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1007911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* We just freed all the buffer headers, every thing in m_input_free_q,
1008011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * m_input_pending_q, pdest_frame, and psource_frame is now invalid */
1008111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_input_free_q.m_size) {
1008211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long address, p2, id;
1008311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_input_free_q.pop_entry(&address, &p2, &id);
1008411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1008511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_input_pending_q.m_size) {
1008611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long address, p2, id;
1008711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_input_pending_q.pop_entry(&address, &p2, &id);
1008811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1008911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pdest_frame = NULL;
1009011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    psource_frame = NULL;
1009111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_inputbuffer) {
1009211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Driver Context pointer");
1009311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_inputbuffer);
1009411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer = NULL;
1009511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1009611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1009711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ip_buf_ion_info) {
1009811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free ion context");
1009911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(drv_ctx.ip_buf_ion_info);
1010011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info = NULL;
1010111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1010211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1010311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1010411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1010511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::stream_off(OMX_U32 port)
1010611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1010711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_buf_type btype;
1010811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
1010911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_ports v4l2_port = OUTPUT_PORT;
1011011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1011111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
1011211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1011311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        v4l2_port = OUTPUT_PORT;
1011411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
1011511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1011611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        v4l2_port = CAPTURE_PORT;
1011711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_ALL) {
1011811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
1011911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
1012011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1012111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc_input)
1012211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc_input;
1012311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1012411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc_output;
1012511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1012611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1012711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[v4l2_port]) {
1012811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // already streamed off, warn and move on
1012911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
1013011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " which is already streamed off", v4l2_port);
1013111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
1013211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1013311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1013411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
1013511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1013611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
1013711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
1013811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
1013911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
1014011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1014111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[v4l2_port] = false;
1014211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1014311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1014411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
1014511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1014611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1014711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
1014811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1014911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1015011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
1015111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0;
1015211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int final_extra_data_size = 0;
1015311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
1015411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = 0;
1015511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
1015611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1015711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
1015811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = 1;
1015911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1016011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1016111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1016211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
1016311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
1016411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1016511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1016611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1016711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1016811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
1016911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1017011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet==OMX_ErrorNone) {
1017111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1017211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1017311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
1017411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
1017511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
1017611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
1017711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1017811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1017911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_res_1080p_or_below = (drv_ctx.video_resolution.frame_width <= 1920 &&
1018011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     drv_ctx.video_resolution.frame_height <= 1088) ||
1018111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (drv_ctx.video_resolution.frame_height <= 1088 &&
1018211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      drv_ctx.video_resolution.frame_width <= 1920);
1018311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1018411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int fps = drv_ctx.frame_rate.fps_numerator / (float)drv_ctx.frame_rate.fps_denominator;
1018511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool fps_above_180 =  (fps >= 180 || operating_frame_rate >= 180) ? true : false;
1018611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool increase_output = (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) && (bufreq.count >= 16);
1018711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1018811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (increase_output && fps_above_180 &&
1018911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            output_capability == V4L2_PIX_FMT_H264 &&
1019011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            is_res_1080p_or_below) {
10191a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            m_need_turbo |= TURBO_MODE_HIGH_FPS;
1019211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("High fps - fps = %d operating_rate = %d", fps, operating_frame_rate);
1019311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("getbufreq[output]: Increase buffer count (%d) to (%d) to support high fps",
1019411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            bufreq.count, bufreq.count + 10);
1019511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count += 10;
1019611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1019711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
1019811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("(Failed to set updated buffer count to driver");
1019911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
1020011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return eRet;
1020111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1020211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("new buf count = %d set to driver", bufreq.count);
1020311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
1020411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1020511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1020611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->actualcount = bufreq.count;
1020711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->mincount = bufreq.count;
1020811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
1020911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1021011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
1021111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1021211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1021311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1021411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1021511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
1021611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
1021711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
1021811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1021911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
1022011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
1022111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
1022211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
1022311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1022411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int extra_idx = 0;
1022511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1022611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = is_video_session_supported();
1022711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet)
1022811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return eRet;
1022911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1023011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
1023111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = buffer_prop->buffer_size;
1023211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
1023311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
1023411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
1023511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (extra_idx >= VIDEO_MAX_PLANES) {
1023611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
1023711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
1023811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1023911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1024011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default_extra_data_size = VENUS_EXTRADATA_SIZE(
1024111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height,
1024211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_width);
1024311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        final_extra_data_size = extra_data_size > default_extra_data_size ?
1024411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size : default_extra_data_size;
1024511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1024611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) &
1024711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (~(buffer_prop->alignment - 1));
1024811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1024911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size;
1025011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.count = buffer_prop->actualcount;
1025111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.buffer_size = final_extra_data_size;
1025211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
1025311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)",
1025411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size);
1025511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_data_size)
1025611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)",
1025711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size);
1025811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1025911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (in_reconfig) // BufReq will be set to driver when port is disabled
1026011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->buffer_size = buf_size;
1026111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (buf_size != buffer_prop->buffer_size) {
1026211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->buffer_size = buf_size;
1026311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = set_buffer_req(buffer_prop);
1026411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1026511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1026611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)",
1026711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1026811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1026911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1027011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1027111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
1027211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1027311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1027411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned buf_size = 0;
102752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_format fmt, c_fmt;
1027611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
102772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    int ret = 0;
1027811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)",
1027911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1028011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
1028111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buf_size != buffer_prop->buffer_size) {
1028211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)",
1028311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)buffer_prop->buffer_size, buf_size);
1028411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
1028511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1028611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
102872601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        memset(&c_fmt, 0x0, sizeof(struct v4l2_format));
1028811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1028911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1029011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
1029111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1029211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1029311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1029411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fmt.fmt.pix_mp.pixelformat = output_capability;
102952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1029611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
102972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
102982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.fmt.pix_mp.pixelformat = capture_capability;
102992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &c_fmt);
103002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
103012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &c_fmt);
1030211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1030311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
1030411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1030511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1030611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
1030711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
1030811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
1030911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1031011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1031111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1031211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
1031311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = buffer_prop->actualcount;
1031411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1031511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1031611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
1031711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1031811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1031911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
1032011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1032111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1032211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet==OMX_ErrorNone) {
1032311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1032411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1032511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1032611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
1032711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
1032811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
1032911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1033011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (bufreq.count < buffer_prop->actualcount) {
1033111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
1033211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
1033311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buffer_prop->actualcount, bufreq.count);
1033411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1033511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1033611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!client_buffers.update_buffer_req()) {
1033711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
1033811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
1033911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1034011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1034111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1034211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1034311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1034411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1034511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_picture_resolution()
1034611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1034711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1034811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1034911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1035011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1035111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
1035211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1035311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1035411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
1035511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!portDefn) {
1035611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1035711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1035811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
1035911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
1036011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1036111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->eDomain    = OMX_PortDomainVideo;
1036211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
1036311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (0 == portDefn->nPortIndex) {
1036411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir =  OMX_DirInput;
1036511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
1036611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
1036711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
1036811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
1036911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eCompressionFormat = eCompressionFormat;
10370fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        //for input port, always report the fps value set by client,
10371fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        //to distinguish whether client got valid fps from parser.
10372fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        portDefn->format.video.xFramerate = m_fps_received;
1037311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bEnabled   = m_inp_bEnabled;
1037411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bPopulated = m_inp_bPopulated;
1037511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1037611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1037711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
103782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1037911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (1 == portDefn->nPortIndex) {
1038011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int buf_size = 0;
1038111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret = 0;
10382a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       if (in_reconfig && !is_down_scalar_enabled) {
103832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
103842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
103852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.fmt.pix_mp.pixelformat = capture_capability;
103862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
103872601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
103882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel       }
103892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1039011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1039111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       fmt.fmt.pix_mp.pixelformat = capture_capability;
1039211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1039311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (ret) {
1039411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Get Resolution failed");
1039511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           return OMX_ErrorHardware;
1039611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1039711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       drv_ctx.op_buf.buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
1039811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (!client_buffers.update_buffer_req()) {
1039911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
1040011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           return OMX_ErrorHardware;
1040111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1040211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1040311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.get_buffer_req(buf_size)) {
1040411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("update buffer requirements");
1040511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
1040611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1040711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferSize = buf_size;
1040811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir =  OMX_DirOutput;
1040911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
1041011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
1041111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
10412fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (drv_ctx.frame_rate.fps_denominator > 0)
10413fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator /
10414fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format
10415fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        else {
10416fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_ERROR("Error: Divide by zero");
10417fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            return OMX_ErrorBadParameter;
10418fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
1041911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bEnabled   = m_out_bEnabled;
1042011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bPopulated = m_out_bPopulated;
1042111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
1042211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error in getting color format");
1042311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
1042411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1042511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1042611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1042711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1042811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir = OMX_DirMax;
1042911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
1043011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (int)portDefn->nPortIndex);
1043111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
1043211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
104332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
104342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
104352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1043611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
1043711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
1043811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
1043911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
1044011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1044111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
1044211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
1044311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16);
1044411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height;
1044511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1044611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d "
1044711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u",
1044811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nPortIndex,
1044911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameWidth,
1045011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameHeight,
1045111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (int)portDefn->format.video.nStride,
1045211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nSliceHeight,
1045311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.eColorFormat,
1045411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nBufferSize,
1045511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nBufferCountActual);
1045611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1045711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1045811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1045911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1046011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_headers()
1046111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1046211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1046311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
1046411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i= 0;
1046511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1046611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
1046711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
1046811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nBufHdrSize        = 0;
1046911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformEntrySize = 0;
1047011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformListSize  = 0;
1047111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPMEMInfoSize = 0;
1047211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
1047311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
1047411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
1047511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1047611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
1047711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
1047811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufHdrSize        = drv_ctx.op_buf.actualcount *
1047911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_BUFFERHEADERTYPE);
1048011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1048111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
1048211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
1048311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformListSize  = drv_ctx.op_buf.actualcount *
1048411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
1048511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
1048611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
1048711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1048811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
1048911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
1049011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,
1049111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPlatformListSize);
1049211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize,
1049311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_bm_count);
1049411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
1049511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Alloc mem for platform specific info
1049611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        char *pPtr=NULL;
1049711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
1049811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,1);
1049911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
1050011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       calloc (sizeof(struct vdec_bufferpayload),
1050111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               drv_ctx.op_buf.actualcount);
1050211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
1050311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     calloc (sizeof (struct vdec_output_frameinfo),
1050411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             drv_ctx.op_buf.actualcount);
1050511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
1050611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer");
1050711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1050811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1050911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1051011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1051111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
1051211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
1051311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.op_buf_ion_info) {
1051411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
1051511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1051611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1051711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1051811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dynamic_buf_mode) {
1051911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            out_dynamic_list = (struct dynamic_buf_list *) \
1052011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount);
1052111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (out_dynamic_list) {
1052211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++)
1052311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  out_dynamic_list[i].dup_fd = -1;
1052411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1052511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1052611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1052711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
1052811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && drv_ctx.ptr_respbuffer) {
1052911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufHdr          =  m_out_mem_ptr;
1053011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
1053111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
1053211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_list)  + nPlatformListSize);
1053311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
1053411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_entry) + nPlatformEntrySize);
1053511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformList   = m_platform_list;
1053611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformEntry  = m_platform_entry;
1053711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPMEMInfo       = m_pmem_info;
1053811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1053911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
1054011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1054111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Settting the entire storage nicely
1054211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
1054311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr,pPlatformEntry);
1054411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
1054511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
1054611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
1054711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
1054811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Set the values when we determine the right HxW param
1054911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nAllocLen          = 0;
1055011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nFilledLen         = 0;
1055111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pAppPrivate        = NULL;
1055211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
1055311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1055411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->entry      = pPMEMInfo;
1055511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform List
1055611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->nEntries    = 1;
1055711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->entryList   = pPlatformEntry;
1055811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Keep pBuffer NULL till vdec is opened
1055911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pBuffer            = NULL;
1056011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->offset          =  0;
1056111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->pmem_fd = -1;
1056211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pPlatformPrivate = pPlatformList;
1056311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
1056411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1056511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
1056611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1056711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Create a mapping between buffers*/
1056811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
1056911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
1057011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    &drv_ctx.ptr_outputbuffer[i];
1057111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Move the buffer and buffer header pointers
1057211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr++;
1057311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo++;
1057411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry++;
1057511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList++;
1057611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1057711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1057811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
1057911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr, pPtr);
1058011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_out_mem_ptr) {
1058111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_out_mem_ptr);
1058211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr = NULL;
1058311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1058411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pPtr) {
1058511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(pPtr);
1058611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPtr = NULL;
1058711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1058811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_outputbuffer) {
1058911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_outputbuffer);
1059011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer = NULL;
1059111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1059211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_respbuffer) {
1059311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_respbuffer);
1059411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer = NULL;
1059511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1059611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1059711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.op_buf_ion_info) {
1059811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free o/p ion context");
1059911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.op_buf_ion_info);
1060011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info = NULL;
1060111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1060211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
10603bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            free(drv_ctx.op_buf_map_info);
10604bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            drv_ctx.op_buf_map_info = NULL;
1060511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet =  OMX_ErrorInsufficientResources;
1060611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1060711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1060811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet =  OMX_ErrorInsufficientResources;
1060911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1061011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1061111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1061211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1061311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::complete_pending_buffer_done_cbs()
1061411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1061511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1, p2, ident;
1061611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue tmp_q, pending_bd_q;
1061711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1061811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pop all pending GENERATE FDB from ftb queue
1061911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_ftb_q.m_size) {
1062011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.pop_entry(&p1,&p2,&ident);
1062111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_FBD) {
1062211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_bd_q.insert_entry(p1,p2,ident);
1062311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1062411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            tmp_q.insert_entry(p1,p2,ident);
1062511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1062611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1062711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return all non GENERATE FDB to ftb queue
1062811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (tmp_q.m_size) {
1062911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tmp_q.pop_entry(&p1,&p2,&ident);
1063011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.insert_entry(p1,p2,ident);
1063111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1063211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pop all pending GENERATE EDB from etb queue
1063311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_etb_q.m_size) {
1063411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.pop_entry(&p1,&p2,&ident);
1063511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_EBD) {
1063611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_bd_q.insert_entry(p1,p2,ident);
1063711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1063811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            tmp_q.insert_entry(p1,p2,ident);
1063911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1064011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1064111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return all non GENERATE FDB to etb queue
1064211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (tmp_q.m_size) {
1064311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tmp_q.pop_entry(&p1,&p2,&ident);
1064411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.insert_entry(p1,p2,ident);
1064511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1064611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
1064711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // process all pending buffer dones
1064811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (pending_bd_q.m_size) {
1064911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pending_bd_q.pop_entry(&p1,&p2,&ident);
1065011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (ident) {
1065111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_EBD:
1065211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
1065311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
1065411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
1065511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1065611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1065711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1065811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_FBD:
1065911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
1066011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
1066111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
1066211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1066311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1066411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1066511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1066611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1066711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1066811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
1066911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1067011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 new_frame_interval = 0;
1067111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
1067211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && llabs(act_timestamp - prev_ts) > 2000) {
1067311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ?
1067411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual);
1067511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (new_frame_interval != frm_int || frm_int == 0) {
1067611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frm_int = new_frame_interval;
1067711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (frm_int) {
1067811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.frame_rate.fps_numerator = 1e6;
1067911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.frame_rate.fps_denominator = frm_int;
1068011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
1068111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
1068211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (float)drv_ctx.frame_rate.fps_denominator);
1068311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_perf_control.request_cores(frm_int);
1068411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* We need to report the difference between this FBD and the previous FBD
1068511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * back to the driver for clock scaling purposes. */
1068611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_outputparm oparm;
1068711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*XXX: we're providing timing info as seconds per frame rather than frames
1068811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * per second.*/
1068911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
1069011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
1069111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1069211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_streamparm sparm;
1069311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1069411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sparm.parm.output = oparm;
1069511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
1069611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
1069711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            performance might be affected");
1069811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1069911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1070011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1070111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1070211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1070311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts = act_timestamp;
1070411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1070511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1070611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
1070711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1070811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rst_prev_ts && VALID_TS(act_timestamp)) {
1070911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = act_timestamp;
1071011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts_actual = act_timestamp;
1071111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = false;
1071211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (VALID_TS(prev_ts)) {
1071311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool codec_cond = (drv_ctx.timestamp_adjust)?
1071411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) :
1071511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual);
1071611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             prev_ts_actual = act_timestamp; //unadjusted previous timestamp
1071711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frm_int > 0 && codec_cond) {
1071811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
1071911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            act_timestamp = prev_ts + frm_int;
1072011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
1072111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            prev_ts = act_timestamp;
1072211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1072311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) {
1072411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // ensure that timestamps can never step backwards when in display order
1072511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                act_timestamp = prev_ts;
1072611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1072711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            set_frame_rate(act_timestamp);
1072811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1072911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (frm_int > 0)          // In this case the frame rate was set along
1073011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {                               // with the port definition, start ts with 0
1073111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
1073211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
1073311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1073411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1073511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1073611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::get_omx_output_buffer_header(int index)
1073711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1073811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_out_mem_ptr + index;
1073911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1074011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10741fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
10742fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects)
10743fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
10744fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (primaries) {
10745fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT709_5:
10746fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            *color_space = ITU_R_709;
10747fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
10748fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10749fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT470_6_M:
10750fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT470_6M;
10751fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10752fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT601_6_625:
10753fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT601_6_525:
10756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            *color_space = range ? ITU_R_601_FR : ITU_R_601;
10757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525;
10758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_GENERIC_FILM:
10760fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesGenericFilm;
10761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT2020:
10763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_UNSPECIFIED:
10766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default
10767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mPrimaries = ColorAspects::PrimariesOther;
10769fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
10774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (transfer) {
10776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT709_5:
10777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625:
10778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_470_6_M:
10781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferGamma22;
10782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_470_6_BG:
10784fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferGamma28;
10785fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_SMPTE_240M:
10787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10788fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_LINEAR:
10790fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferLinear;
10791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_IEC_61966:
10793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferXvYCC;
10794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_1361:
10796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferBT1361;
10797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_SRGB:
10799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSRGB;
10800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10802fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mTransfer = ColorAspects::TransferOther;
10803fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = m_client_color_space.sAspects.mTransfer;
10804fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10805fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10806fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10807fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (matrix) {
10808fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_709_5:
10809fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10810fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10811fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_FCC_47:
10812fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M;
10813fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_601_6_625:
10815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_601_6_525:
10816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_SMPTE_240M:
10819fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M;
10820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_2020:
10822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_2020_CONST:
10825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant;
10826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) {
10835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d",
10836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs);
10837fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10838fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10839a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelvoid omx_vdec::prepare_color_aspects_metadata(OMX_U32 primaries, OMX_U32 range,
10840a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                              OMX_U32 transfer, OMX_U32 matrix,
10841a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                              ColorMetaData *color_mdata)
10842a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel{
10843a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
10844a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    /* ColorAspects in qdMetaData */
10845a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    color_mdata->colorPrimaries = (enum ColorPrimaries) primaries;
10846a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    color_mdata->range = (enum ColorRange)range;
10847a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    color_mdata->transfer = (enum GammaTransfer)transfer;
10848a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    color_mdata->matrixCoefficients = (enum MatrixCoEfficients)matrix;
10849a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel}
10850a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
10851a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelbool omx_vdec::handle_color_space_info(void *data,
10852a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                       ColorSpace_t *color_space,
10853a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                       ColorMetaData *color_mdata,
10854a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                       bool& set_color_aspects_only)
10855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
10856fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorAspects tempAspects;
10857fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&tempAspects, 0x0, sizeof(ColorAspects));
10858fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorAspects *aspects = &tempAspects;
10859fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10860a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    /* Set default ColorAspects */
10861a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    prepare_color_aspects_metadata(ColorPrimaries_BT601_6_625, Range_Full,
10862a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                           Transfer_SMPTE_170M, MatrixCoEff_BT601_6_625,
10863a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                           color_mdata);
10864a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
10865fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch(output_capability) {
10866fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_MPEG2:
10867fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10868fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
10869fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data;
10870fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10871fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to
10872fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * understand this code */
10873fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10874fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (seqdisp_payload && seqdisp_payload->color_descp) {
10875fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10876fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(seqdisp_payload->color_primaries, 1,
10877fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
10878a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                            color_space,aspects);
10879fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    m_disp_hor_size = seqdisp_payload->disp_width;
10880fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    m_disp_vert_size = seqdisp_payload->disp_height;
10881a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    set_color_aspects_only = true;
10882a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    prepare_color_aspects_metadata(seqdisp_payload->color_primaries, 1,
10883a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                    seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
10884a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                    color_mdata);
10885fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10886fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10887fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10888fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_H264:
10889fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_HEVC:
10890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vui_display_info_payload *display_info_payload;
10892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                display_info_payload = (struct msm_vidc_vui_display_info_payload*)data;
10893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10894fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */
10895fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10896fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (display_info_payload->video_signal_present_flag &&
10897fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        display_info_payload->color_description_present_flag) {
10898fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(display_info_payload->color_primaries,
10899fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->video_full_range_flag,
10900fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->transfer_characteristics,
10901fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->matrix_coefficients,
10902a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                            color_space,aspects);
10903a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    set_color_aspects_only = true;
10904a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    prepare_color_aspects_metadata(display_info_payload->color_primaries,
10905a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   display_info_payload->video_full_range_flag,
10906a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   display_info_payload->transfer_characteristics,
10907a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   display_info_payload->matrix_coefficients,
10908a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   color_mdata);
10909fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10910fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10911fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10912fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VC1_ANNEX_G:
10913fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VC1_ANNEX_L:
10914fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10915fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload;
10916fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data;
10917fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23
10919fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * SMPTE 421M to understand this code */
10920fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10921fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (m_enable_android_native_buffers &&
10922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        vc1_seq_disp_payload->color_primaries) {
10923fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10924fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(vc1_seq_disp_payload->color_primaries,
10925fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            1,
10926fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            vc1_seq_disp_payload->transfer_char,
10927fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            vc1_seq_disp_payload->matrix_coeffs,
10928a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                            color_space,aspects);
10929a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    set_color_aspects_only = true;
10930a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    prepare_color_aspects_metadata(vc1_seq_disp_payload->color_primaries,
10931a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   1,
10932a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   vc1_seq_disp_payload->transfer_char,
10933a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   vc1_seq_disp_payload->matrix_coeffs,
10934a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                   color_mdata);
10935fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10936fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10937fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10938fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VP8:
10939fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10940fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10941fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10942a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                set_color_aspects_only = false;
10943fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011
10944fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * to understand this code */
10945fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10946fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (vpx_color_space_payload->color_space == 0) {
10947a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    *color_space = ITU_R_601;
10948fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                } else {
10949fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Unsupported Color space for VP8");
10950fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
10951fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10952fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10953fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10954fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VP9:
10955fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10956fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10957fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10958a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                set_color_aspects_only = false;
10959fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016
10960fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * to understand this code */
10961fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch(vpx_color_space_payload->color_space) {
10963fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_601:
10964fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10965fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10966fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_709:
10970a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                        *color_space = ITU_R_709;
10971fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10972fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10973fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries =  ColorAspects::PrimariesBT709_5;
10974fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10975fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10976fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_SMPTE_170:
10977fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10978fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10979fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10980fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10981fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10982fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_SMPTE_240:
10983fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10984fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10987fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10988fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_2020:
10989fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10990fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects:: TransferSMPTE170M;
10991fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10992fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10993fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10994fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_RESERVED:
10995fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10996fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferOther;
10997fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10998fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10999fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
11000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_RGB:
11001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
11002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
11003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesOther;
11004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
11005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
11006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
11007fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
11008fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
11009fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11010fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
11011fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
11012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
11013fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
11014a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11015fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    print_debug_color_aspects(aspects, "Bitstream");
11016fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11017fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries ||
11018fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mTransfer != aspects->mTransfer ||
11019fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs ||
11020fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mRange != aspects->mRange) {
11021fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects));
11022fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_internal_color_space.bDataSpaceChanged = OMX_TRUE;
11023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11024a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        m_color_mdata.colorPrimaries = color_mdata->colorPrimaries;
11025a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        m_color_mdata.range = color_mdata->range;
11026a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        m_color_mdata.transfer = color_mdata->transfer;
11027a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        m_color_mdata.matrixCoefficients = color_mdata->matrixCoefficients;
11028a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11029fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to Color Aspects Change");
11030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal");
11031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(m_client_color_space.sAspects), "Client");
11032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        post_event(OMX_CORE_OUTPUT_PORT_INDEX,
11034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_QTIIndexConfigDescribeColorAspects,
11035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
11036fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return true;
11037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
11038fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return false;
11039fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
11040fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) {
11042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    private_handle_t *private_handle = NULL;
11043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (buf_index < drv_ctx.op_buf.actualcount &&
11044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
11045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            native_buffer[buf_index].privatehandle) {
11046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        private_handle = native_buffer[buf_index].privatehandle;
11047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
11048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (private_handle) {
11049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space);
11050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
11051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
11052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11053fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelvoid omx_vdec::print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix)
11054fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
11055fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (!hdr_info->mID) {
11056fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mR.x = %d mR.y = %d", prefix,
11057fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mR.x, hdr_info->sType1.mR.y);
11058fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mG.x = %d mG.y = %d", prefix,
11059fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mG.x, hdr_info->sType1.mG.y);
11060fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mB.x = %d mB.y = %d", prefix,
11061fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mB.x, hdr_info->sType1.mB.y);
11062fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mW.x = %d mW.y = %d", prefix,
11063fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mW.x, hdr_info->sType1.mW.y);
11064fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: maxDispLum = %d minDispLum = %d", prefix,
11065fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mMaxDisplayLuminance, hdr_info->sType1.mMinDisplayLuminance);
11066fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo CLL: CLL = %d FLL = %d", prefix,
11067fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        hdr_info->sType1.mMaxContentLightLevel, hdr_info->sType1.mMaxFrameAverageLightLevel);
11068fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
11069fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11070fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
11071fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11072a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelvoid omx_vdec::print_debug_hdr_color_info_mdata(ColorMetaData* color_mdata)
11073a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel{
11074a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    DEBUG_PRINT_LOW("setMetaData COLOR_METADATA : color_primaries = %u, range = %u, transfer = %u, matrix = %u",
11075a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->colorPrimaries, color_mdata->range,
11076a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->transfer, color_mdata->matrixCoefficients);
11077a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11078a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    for(uint8_t i = 0; i < 3; i++) {
11079a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        for(uint8_t j = 0; j < 2; j++) {
11080a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_LOW("setMetadata COLOR_METADATA : rgbPrimaries[%d][%d] = %d", i, j, color_mdata->masteringDisplayInfo.primaries.rgbPrimaries[i][j]);
11081a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
11082a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
11083a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11084a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    DEBUG_PRINT_LOW("setMetadata COLOR_METADATA : whitepoint[0] = %d whitepoint[1] = %d",
11085a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->masteringDisplayInfo.primaries.whitePoint[0],
11086a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->masteringDisplayInfo.primaries.whitePoint[1]);
11087fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11088a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    DEBUG_PRINT_LOW("setMetadata COLOR_METADATA : maxDispLum = %d minDispLum = %d",
11089a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->masteringDisplayInfo.maxDisplayLuminance,
11090a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->masteringDisplayInfo.minDisplayLuminance);
11091fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11092a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    DEBUG_PRINT_LOW("setMetadata COLOR_METADATA : maxCLL = %d maxFLL = %d",
11093a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->contentLightLevel.maxContentLightLevel,
11094a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_mdata->contentLightLevel.minPicAverageLightLevel);
11095a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11096a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11097a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel}
11098a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11099a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelbool omx_vdec::handle_content_light_level_info(void* data, ContentLightLevel* light_level_mdata)
11100fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
11101fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    struct msm_vidc_content_light_level_sei_payload *light_level_payload =
11102fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (msm_vidc_content_light_level_sei_payload*)(data);
11103fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11104a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    light_level_mdata->lightLevelSEIEnabled = true;
11105a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    light_level_mdata->maxContentLightLevel = light_level_payload->nMaxContentLight;
11106a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    light_level_mdata->minPicAverageLightLevel = light_level_payload->nMaxPicAverageLight;
11107a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11108fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if ((m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel != light_level_payload->nMaxContentLight) ||
11109fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel != light_level_payload->nMaxPicAverageLight)) {
11110fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel = light_level_payload->nMaxContentLight;
11111fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel = light_level_payload->nMaxPicAverageLight;
11112fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return true;
11113fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
11114fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return false;
11115fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
11116fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11117a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelbool omx_vdec::handle_mastering_display_color_info(void* data, MasteringDisplay* mastering_display_mdata)
11118fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
11119fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    struct msm_vidc_mastering_display_colour_sei_payload *mastering_display_payload =
11120fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (msm_vidc_mastering_display_colour_sei_payload*)(data);
11121fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    HDRStaticInfo* hdr_info = &m_internal_hdr_info.sInfo;
11122fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool internal_disp_changed_flag = false;
11123fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11124a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    mastering_display_mdata->colorVolumeSEIEnabled = true;
11125a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    for (uint8_t i = 0; i < 3; i++) {
11126a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        mastering_display_mdata->primaries.rgbPrimaries[i][0] = mastering_display_payload->nDisplayPrimariesX[i];
11127a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        mastering_display_mdata->primaries.rgbPrimaries[i][1] = mastering_display_payload->nDisplayPrimariesY[i];
11128a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
11129a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    mastering_display_mdata->primaries.whitePoint[0] = mastering_display_payload->nWhitePointX;
11130a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    mastering_display_mdata->primaries.whitePoint[1] = mastering_display_payload->nWhitePointY;
11131a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    mastering_display_mdata->maxDisplayLuminance = mastering_display_payload->nMaxDisplayMasteringLuminance;
11132a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    mastering_display_mdata->minDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance;
11133a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11134a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mR.x != mastering_display_payload->nDisplayPrimariesX[0]) ||
11135fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mR.y != mastering_display_payload->nDisplayPrimariesY[0]);
11136fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mG.x != mastering_display_payload->nDisplayPrimariesX[1]) ||
11137fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mG.y != mastering_display_payload->nDisplayPrimariesY[1]);
11138fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mB.x != mastering_display_payload->nDisplayPrimariesX[2]) ||
11139fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mB.y != mastering_display_payload->nDisplayPrimariesY[2]);
11140fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11141fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mW.x != mastering_display_payload->nWhitePointX) ||
11142fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mW.y != mastering_display_payload->nWhitePointY);
11143fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11144af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    /* Maximum Display Luminance from the bitstream is in 0.0001 cd/m2 while the HDRStaticInfo extension
11145af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel       requires it in cd/m2, so dividing by 10000 and rounding the value after division
11146af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    */
11147af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    uint16_t max_display_luminance_cd_m2 =
11148af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        static_cast<int>((mastering_display_payload->nMaxDisplayMasteringLuminance / LUMINANCE_DIV_FACTOR) + 0.5);
11149af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mMaxDisplayLuminance != max_display_luminance_cd_m2) ||
11150fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mMinDisplayLuminance != mastering_display_payload->nMinDisplayMasteringLuminance);
11151fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11152fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (internal_disp_changed_flag) {
11153fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mR.x = mastering_display_payload->nDisplayPrimariesX[0];
11154fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mR.y = mastering_display_payload->nDisplayPrimariesY[0];
11155fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mG.x = mastering_display_payload->nDisplayPrimariesX[1];
11156fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mG.y = mastering_display_payload->nDisplayPrimariesY[1];
11157fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mB.x = mastering_display_payload->nDisplayPrimariesX[2];
11158fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mB.y = mastering_display_payload->nDisplayPrimariesY[2];
11159fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mW.x = mastering_display_payload->nWhitePointX;
11160fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mW.y = mastering_display_payload->nWhitePointY;
11161fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11162af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        hdr_info->sType1.mMaxDisplayLuminance = max_display_luminance_cd_m2;
11163fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mMinDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance;
11164fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
11165fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11166fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return internal_disp_changed_flag;
11167fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
11168fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11169a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelvoid omx_vdec::set_colormetadata_in_handle(ColorMetaData *color_mdata, unsigned int buf_index)
11170a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel{
11171a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    private_handle_t *private_handle = NULL;
11172a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (buf_index < drv_ctx.op_buf.actualcount &&
11173a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
11174a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        native_buffer[buf_index].privatehandle) {
11175a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        private_handle = native_buffer[buf_index].privatehandle;
11176a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
11177a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (private_handle) {
11178a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        setMetaData(private_handle, COLOR_METADATA, (void*)color_mdata);
11179a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
11180a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel}
11181a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
1118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
111842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_client_extra = NULL;
111852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_U8 *pBuffer = NULL;
1118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_conceal_MB = 0;
1118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_TICKS time_stamp = 0;
1118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 frame_rate = 0;
1118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long consumed_len = 0;
1119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_MB_in_frame;
1119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 recovery_sei_flags = 1;
1119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int enable = OMX_InterlaceFrameProgressive;
11193fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool internal_hdr_info_changed_flag = false;
11194fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool color_event = false;
11195a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    ColorMetaData color_mdata;
11196a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    memset(&color_mdata, 0x0, sizeof(ColorMetaData));
11197a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    bool set_disp_color_aspects_only = false;
11198a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    ColorSpace_t color_space = ITU_R_601;
11199a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int buf_index = p_buf_hdr - m_out_mem_ptr;
1120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buf_index >= drv_ctx.extradata_info.count) {
1120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
1120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf_index, drv_ctx.extradata_info.count);
1120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
1120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) {
1120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL");
1121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!drv_ctx.extradata_info.uaddr) {
1121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
1121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) {
1121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data");
1121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
1122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
112222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (!secure_mode) {
112232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        pBuffer = (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[buf_index].buffer_len,
112242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, drv_ctx.ptr_outputbuffer[buf_index].pmem_fd, 0);
112252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (pBuffer == MAP_FAILED) {
112262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_ERROR("handle_extradata output buffer mmap failed - errno: %d", errno);
112272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            return;
112282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)
1123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
112312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    } else
1123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = m_other_extradata;
112332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
112342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    AutoUnmap autounmap(pBuffer, drv_ctx.ptr_outputbuffer[buf_index].buffer_len);
112352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (m_client_extradata_info.getBase() &&
112362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        m_client_extradata_info.getSize() >= drv_ctx.extradata_info.buffer_size) {
112372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (m_client_extradata_info.getBase() +
112382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            buf_index * m_client_extradata_info.getSize());
112392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
112402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
1124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
1124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
1124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata_info.output_crop_updated = OMX_FALSE;
1124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
1125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (data && p_extra) {
1125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
1125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
1125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) {
1125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Invalid extra data size");
1125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra = NULL;
1126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
1126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return;
1126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType);
1126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch ((unsigned long)data->eType) {
1126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
1126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_interlace_payload *payload;
1126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U32 interlace_color_format;
1126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    payload = (struct msm_vidc_interlace_payload *)(void *)data->data;
1127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (payload) {
1127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        enable = OMX_InterlaceFrameProgressive;
1127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (payload->format) {
1127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE:
1127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST:
1127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                enable = OMX_InterlaceInterleaveFrameTopFieldFirst;
1127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST:
1128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
1128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                enable = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            default:
1128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("default case - set to progressive");
1128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (payload->color_format) {
1128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12:
1129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
1129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC:
1129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
1129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
1129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           default:
1129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame");
1129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_enable_android_native_buffers) {
1130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d",
1130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         payload->format, interlace_color_format ,enable,
1130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false);
1130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
1130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               PP_PARAM_INTERLACED, (void*)&enable);
1130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
1131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
1131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               LINEAR_FORMAT, (void*)&interlace_color_format);
11312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        } else if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
11313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
11314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               LINEAR_FORMAT, NULL);
1131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_INTERLACE_EXTRADATA) {
1131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_interlace_extradata(p_extra, payload->format);
113192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
113202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
113212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_interlace_extradata(p_client_extra, payload->format);
113222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *)
113232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                (((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4));
113242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_RATE:
1132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_framerate_payload *frame_rate_payload;
1132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data;
1133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frame_rate = frame_rate_payload->frame_rate;
1133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_TIMESTAMP:
1133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_ts_payload *time_stamp_payload;
1133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data;
1133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp = time_stamp_payload->timestamp_lo;
1133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
1133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    p_buf_hdr->nTimeStamp = time_stamp;
1133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
1134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
1134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data;
1134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
1134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_INDEX:
1134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int *etype;
1134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    etype  = (int *)(void *)data->data;
1134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) {
1135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
1135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
1135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (aspect_ratio_payload) {
1135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((struct vdec_output_frameinfo *)
1135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
1135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((struct vdec_output_frameinfo *)
1135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
1135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else if (etype && *etype == MSM_VIDC_EXTRADATA_OUTPUT_CROP) {
1135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct msm_vidc_output_crop_payload *output_crop_payload;
1136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        output_crop_payload = (struct msm_vidc_output_crop_payload *)(++etype);
1136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (output_crop_payload) {
1136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nLeft = output_crop_payload->left;
1136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nTop = output_crop_payload->top;
1136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nWidth = output_crop_payload->left + output_crop_payload->display_width;
1136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nHeight = output_crop_payload->top + output_crop_payload->display_height;
1136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_width = output_crop_payload->width;
1136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_height = output_crop_payload->height;
1136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_updated = OMX_TRUE;
1136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
1137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
1137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data;
1137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    recovery_sei_flags = recovery_sei_payload->flags;
1137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
1137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
1137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("***************************************************");
1137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
1138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("***************************************************");
1138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
1138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data;
1138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) {
1138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Panscan windows are more than supported\n");
1138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n",
1138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows);
1138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return;
1139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP:
11393fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO:
11394fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VC1_SEQDISP:
11395fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO:
11396a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    color_event = handle_color_space_info((void *)data->data, &color_space, &color_mdata, set_disp_color_aspects_only);
1139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING:
1139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload;
1140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data;
1140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    switch (s3d_frame_packing_payload->fpa_type) {
1140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case MSM_VIDC_FRAMEPACK_SIDE_BY_SIDE:
1140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (s3d_frame_packing_payload->content_interprtation_type == 1)
1140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_3D_SIDE_BY_SIDE_L_R;
1140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            else if (s3d_frame_packing_payload->content_interprtation_type == 2)
1140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_3D_SIDE_BY_SIDE_R_L;
1140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            else {
1140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_ERROR("Unsupported side-by-side framepacking type");
1140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_NO_3D;
1141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
1141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
1141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case MSM_VIDC_FRAMEPACK_TOP_BOTTOM:
1141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            stereo_output_mode = HAL_3D_TOP_BOTTOM;
1141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
1141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        default:
1141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Unsupported framepacking type");
1141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            stereo_output_mode = HAL_NO_3D;
1141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("setMetaData FRAMEPACKING : fpa_type = %u, content_interprtation_type = %u, stereo_output_mode= %d",
1142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        s3d_frame_packing_payload->fpa_type, s3d_frame_packing_payload->content_interprtation_type, stereo_output_mode);
1142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
1142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_framepack_extradata(p_extra, s3d_frame_packing_payload);
114232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
114242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
114252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_framepack_extradata(p_client_extra, s3d_frame_packing_payload);
114262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
114272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_QP:
1143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_frame_qp_payload *qp_payload;
1143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data;
1143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_QP_EXTRADATA) {
1143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_qp_extradata(p_extra, qp_payload);
114352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
114362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
114372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_qp_extradata(p_client_extra, qp_payload);
114382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
114392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO:
1144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_frame_bits_info_payload *bits_info_payload;
1144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data;
1144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_BITSINFO_EXTRADATA) {
1144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_bitsinfo_extradata(p_extra, bits_info_payload);
114472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
114482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
114492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_bitsinfo_extradata(p_client_extra, bits_info_payload);
114502601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
114512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_STREAM_USERDATA:
1145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
1145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_user_extradata(p_extra, data);
114572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
114582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
114592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_user_extradata(p_client_extra, data);
114602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
114612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_VQZIP_SEI:
1146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_vqzip_sei_payload *vqzip_payload;
1146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data;
1146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_VQZIPSEI_EXTRADATA) {
1146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_vqzip_extradata(p_extra, vqzip_payload);
114702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
114712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
114722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_vqzip_extradata(p_client_extra, vqzip_payload);
114732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
114742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
11477fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                case MSM_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI:
11478a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
11479a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    internal_hdr_info_changed_flag |= handle_content_light_level_info((void*)data->data,
11480a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                                                      &(color_mdata.contentLightLevel));
11481fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    break;
11482fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                case MSM_VIDC_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI:
11483a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    internal_hdr_info_changed_flag |= handle_mastering_display_color_info((void*)data->data,
11484a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                                                                          &(color_mdata.masteringDisplayInfo));
11485fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    break;
1148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
1148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Unrecognized extradata");
1148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    goto unrecognized_extradata;
1148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            consumed_len += data->nSize;
1149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
1149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
1149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            append_frame_info_extradata(p_extra,
11496a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    num_conceal_MB, recovery_sei_flags, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
1149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
1149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
114992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
115002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (p_client_extra) {
115012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                append_frame_info_extradata(p_client_extra,
11502a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                        num_conceal_MB, recovery_sei_flags, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
115032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
115042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
115052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
115062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
1150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) {
1150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            append_frame_dimension_extradata(p_extra);
115102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
115112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (p_client_extra) {
115122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                append_frame_dimension_extradata(p_client_extra);
115132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
115142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
1151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
11516fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11517fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if(internal_hdr_info_changed_flag) {
11518fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "Internal");
11519fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "Client");
11520a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            memcpy(&m_color_mdata, &color_mdata, sizeof(ColorMetaData));
11521fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            auto_lock lock(m_hdr_info_client_lock);
11522fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_change_client_hdr_info = true;
11523fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if(!color_event) {
11524fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to HDR Info Change");
11525fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                post_event(OMX_CORE_OUTPUT_PORT_INDEX,
11526fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           OMX_QTIIndexConfigDescribeHDRColorInfo,
11527fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           OMX_COMPONENT_GENERATE_PORT_RECONFIG);
11528fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
11529fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
11530fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11531a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (m_enable_android_native_buffers) {
11532a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (set_disp_color_aspects_only) {
11533a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                print_debug_hdr_color_info_mdata(&m_color_mdata);
11534a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                set_colormetadata_in_handle(&m_color_mdata, buf_index);
11535a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            } else {
11536a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                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);
11537a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                set_colorspace_in_handle(color_space, buf_index);
11538a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
11539a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
11540a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
1154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunrecognized_extradata:
1154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (client_extradata && p_extra) {
1154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        append_terminator_extradata(p_extra);
115462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (p_client_extra) {
115472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            append_terminator_extradata(p_client_extra);
115482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (secure_mode && p_extradata && m_other_extradata) {
1155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_output_frameinfo  *ptr_extradatabuff = NULL;
1155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size);
1155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate;
1155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata;
1155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size;
1155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.fd = drv_ctx.extradata_info.ion.fd_ion_data.fd;
1155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.offset = buf_index * drv_ctx.extradata_info.buffer_size;
1155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.buffer_size = drv_ctx.extradata_info.size;
1155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11563fa202b9b18f17f7835fd602db5fff530e61112b4Thierry StrudelOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U64 requested_extradata,
1156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_internal, bool enable)
1156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
1156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
1156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateLoaded) {
1156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
1157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
1157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d",
1157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal);
1157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!is_internal) {
1157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (enable)
1157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= requested_extradata;
1157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata = client_extradata & ~requested_extradata;
1158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable) {
1158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
1158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
1158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
1158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        " Quality of interlaced clips might be impacted.");
1158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
1159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
1159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
1159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
1159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
1160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
1160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
1160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
1160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
1161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_MPEG2) {
1161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
1162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
1162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
1162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
1163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && (requested_extradata & OMX_FRAMEPACK_EXTRADATA)) {
1163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_H264) {
1163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA");
1163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value =  V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING;
1163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata");
1163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only");
1164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_QP_EXTRADATA) {
1164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
1164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set QP extradata");
1164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_BITSINFO_EXTRADATA) {
1165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO;
1165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set frame bits info extradata");
1165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && (requested_extradata & OMX_EXTNUSER_EXTRADATA)) {
1165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA;
1166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set stream userdata extradata");
1166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) {
1166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI;
1166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata");
1167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= OMX_VQZIPSEI_EXTRADATA;
1167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
1167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set QP extradata");
1167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= OMX_QP_EXTRADATA;
1167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) {
1168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_OUTPUT_CROP;
1168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Enable output crop extra data");
1168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set output crop extradata");
1168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
11688fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) {
11689fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
11690fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            switch(output_capability) {
11691fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_H264:
11692fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_HEVC:
11693fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
11694fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11695fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case CODEC_TYPE_MPEG2:
11696fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
11697fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VP8:
11699fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VP9:
11700fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE;
11701fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11702fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VC1_ANNEX_G:
11703fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VC1_ANNEX_L:
11704fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP;
11705fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11706fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                default:
11707fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind);
11708fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    return ret;
11709fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11710fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11711fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11712fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_HIGH("Failed to set Display info extradata");
11713fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11714fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
11715fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (requested_extradata & OMX_HDR_COLOR_INFO_EXTRADATA) {
11716fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
11717fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (output_capability == V4L2_PIX_FMT_H264 ||
11718fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                output_capability == V4L2_PIX_FMT_HEVC) {
11719fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_DISPLAY_COLOUR_SEI;
11720fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11721fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    DEBUG_PRINT_HIGH("Failed to set Display Colour SEI extradata");
11722fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
11723fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI;
11724fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11725fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    DEBUG_PRINT_HIGH("Failed to set Content Light Level SEI extradata");
11726fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
11727fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
11728fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
1172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = get_buffer_req(&drv_ctx.op_buf);
1173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
1173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
1173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *data_ptr = extra->data, data = 0;
1173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (byte_count < extra->nDataSize) {
1173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data = *data_ptr;
1174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (data) {
1174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            num_MB += (data&0x01);
1174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data >>= 1;
1174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data_ptr++;
1174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        byte_count++;
1174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
1175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_debug_extradata || !extra)
1175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH(
1175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "============== Extra Data ==============\n"
1176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "           Size: %u\n"
1176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "        Version: %u\n"
1176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "      PortIndex: %u\n"
1176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "           Type: %x\n"
1176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "       DataSize: %u",
1176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion,
1176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize);
1176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
1176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "------ Interlace Format ------\n"
1177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                Size: %u\n"
1177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             Version: %u\n"
1177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           PortIndex: %u\n"
1177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " Is Interlace Format: %d\n"
1177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   Interlace Formats: %u\n"
1177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "=========== End of Interlace ===========",
1177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex,
1177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats);
1178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
1178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "-------- Frame Format --------\n"
1178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             Picture Type: %d\n"
1178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Interlace Type: %d\n"
1178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " Pan Scan Total Frame Num: %u\n"
1178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   Concealed Macro Blocks: %u\n"
11789a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                "        Recovery SEI Flag: %u\n"
1179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               frame rate: %u\n"
1179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               Time Stamp: %llu\n"
1179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Aspect Ratio X: %u\n"
1179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Aspect Ratio Y: %u",
1179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->ePicType,
1179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->interlaceType,
1179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->panScan.numWindows,
1179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->nConcealedMacroblocks,
11798a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                (unsigned int)fminfo->nRecoverySeiFlag,
1179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->nFrameRate,
1180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->nTimeStamp,
1180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->aspectRatio.aspectRatioX,
1180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->aspectRatio.aspectRatioY);
1180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
1180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH(
1180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "------------------------------"
1180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "     Pan Scan Frame Num: %u\n"
1180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "            Rectangle x: %d\n"
1180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "            Rectangle y: %d\n"
1181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "           Rectangle dx: %d\n"
1181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "           Rectangle dy: %d",
1181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y,
1181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy);
1181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
1181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) {
1181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
1181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "------------------ Framepack Format ----------\n"
1182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                           id: %u \n"
1182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                  cancel_flag: %u \n"
1182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                         type: %u \n"
1182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " quincunx_sampling_flagFormat: %u \n"
1182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "  content_interpretation_type: %u \n"
1182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "        spatial_flipping_flag: %u \n"
1182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "          frame0_flipped_flag: %u \n"
1182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             field_views_flag: %u \n"
1182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " current_frame_is_frame0_flag: %u \n"
1183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   frame0_self_contained_flag: %u \n"
1183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   frame1_self_contained_flag: %u \n"
1183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame0_grid_position_x: %u \n"
1183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame0_grid_position_y: %u \n"
1183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame1_grid_position_x: %u \n"
1183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame1_grid_position_y: %u \n"
1183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                reserved_byte: %u \n"
1183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "            repetition_period: %u \n"
1183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               extension_flag: %u \n"
1183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "================== End of Framepack ===========",
1184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->id,
1184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->cancel_flag,
1184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->type,
1184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->quincunx_sampling_flag,
1184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->content_interpretation_type,
1184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->spatial_flipping_flag,
1184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_flipped_flag,
1184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->field_views_flag,
1184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->current_frame_is_frame0_flag,
1184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_self_contained_flag,
1185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_self_contained_flag,
1185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_grid_position_x,
1185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_grid_position_y,
1185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_grid_position_x,
1185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_grid_position_y,
1185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->reserved_byte,
1185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->repetition_period,
1185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->extension_flag);
1185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) {
1185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
1186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "---- QP (Frame quantization parameter) ----\n"
1186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Frame QP: %u \n"
1186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "================ End of QP ================\n",
1186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)qp->nQP);
1186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) {
1186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data;
1186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------- Input bits information --------\n"
1186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Header bits: %u \n"
1187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "     Frame bits: %u \n"
1187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "===== End of Input bits information =====\n",
1187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits);
1187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) {
1187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data;
1187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *data_ptr = (OMX_U8 *)userdata->data;
1187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type);
1187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 i = 0;
1187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------------  Userdata  -------------\n"
1188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Stream userdata type: %u\n"
1188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "          userdata size: %u\n"
1188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    STREAM_USERDATA:",
1188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)userdata->type, (unsigned int)userdata_size);
1188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                for (i = 0; i < userdata_size; i+=4) {
1188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("        %x %x %x %x",
1188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        data_ptr[i], data_ptr[i+1],
1188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        data_ptr[i+2], data_ptr[i+3]);
1188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "=========== End of Userdata ===========");
1189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) {
1189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
1189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------------  VQZip  -------------\n"
1189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Size: %u\n",
1189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)vq->nSize);
1189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH( "=========== End of VQZip ===========");
1189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == OMX_ExtraDataNone) {
1189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
1190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
1190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 interlaced_format_type)
1190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STREAMINTERLACEFORMAT *interlace_format;
1190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
1191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!extra) {
1191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input");
1191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return;
1191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
1191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
1192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
1192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
1192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_FALSE;
1192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) {
1193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_TRUE;
1193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
1193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) {
1193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_TRUE;
1193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
1193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //default case - set to progressive
1194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_FALSE;
1194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension;
1195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) {
1195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE;
1195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension;
1195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION);
1195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data;
1196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nDecWidth = rectangle.nLeft;
1196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nDecHeight = rectangle.nTop;
1196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nActualWidth = rectangle.nWidth;
1196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nActualHeight = rectangle.nHeight;
1196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::fill_aspect_ratio_info(
1196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_aspectratioinfo *aspect_ratio_info,
1196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
1196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata = frame_info;
1197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
1197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
1197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX,
1197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)m_extradata->aspectRatio.aspectRatioY);
1197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
11978a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        OMX_U32 num_conceal_mb, OMX_U32 recovery_sei_flag, OMX_U32 picture_type, OMX_U32 frame_rate,
1197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload,
1198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_aspectratioinfo *aspect_ratio_info)
1198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
1198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_panscan_window *panscan_window;
1198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
1198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
1198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
1199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
1199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (picture_type) {
1199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_I:
1199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
1199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_P:
1199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
1199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_B:
1200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
1200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
1200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
1200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
1200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
1201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
1201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
1201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
1201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nConcealedMacroblocks = num_conceal_mb;
12014a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    frame_info->nRecoverySeiFlag = recovery_sei_flag;
1201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nFrameRate = frame_rate;
1201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nTimeStamp = time_stamp;
1201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->panScan.numWindows = 0;
1201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (output_capability == V4L2_PIX_FMT_MPEG2) {
1201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disp_hor_size && m_disp_vert_size) {
1202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
1202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
1202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayHorizontalSize = 0;
1202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayVerticalSize = 0;
1202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (panscan_payload) {
1202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
1203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        panscan_window = &panscan_payload->wnd[0];
1203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
1203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
1203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
1203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
1203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
1203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            panscan_window++;
1203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
1204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
1204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
1204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
1205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data;
1205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *portDefn = m_port_def;
1205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u "
1205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight,
1205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameWidth,
1205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nStride,
1205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nSliceHeight);
1205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload)
1206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack;
1206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) {
1206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("frame packing size mismatch");
1206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE;
1206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement;
1207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
1207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nVersion.nVersion = OMX_SPEC_VERSION;
1207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&framepack->id, s3d_frame_packing_payload,
1207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sizeof(struct msm_vidc_s3d_frame_packing_payload));
1207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&m_frame_pack_arrangement, framepack,
1208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
1208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct msm_vidc_frame_qp_payload *qp_payload)
1208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_QP * qp = NULL;
1208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!qp_payload) {
1208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("QP payload is NULL");
1209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_QP_EXTRADATA_SIZE;
1209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP;
1209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP);
1209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
1209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    qp->nQP = qp_payload->frame_qp;
1209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct msm_vidc_frame_bits_info_payload *bits_payload)
1210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL;
1210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bits_payload) {
1210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("bits info payload is NULL");
1210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_BITSINFO_EXTRADATA_SIZE;
1211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo;
1211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO);
1211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data;
1211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits->frame_bits = bits_payload->frame_bits;
1211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits->header_bits = bits_payload->header_bits;
1211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_OTHER_EXTRADATATYPE *p_user)
1212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int userdata_size = 0;
1212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_stream_userdata_payload *userdata_payload = NULL;
1212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    userdata_payload =
1212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data;
1212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    userdata_size = p_user->nDataSize;
1212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size;
1213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
1213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = userdata_size;
1213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize))
1213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy(extra->data, p_user->data, extra->nDataSize);
1213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!client_extradata) {
1214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
1214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = OMX_ExtraDataNone;
1214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = 0;
1214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->data[0] = 0;
1214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct msm_vidc_vqzip_sei_payload *vqzip_payload)
1215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL;
1215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size;
1215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI;
1216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size;
1216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
1216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vq->nSize = vqzip_payload->size;
1216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(vq->data, vqzip_payload->data, vqzip_payload->size);
1216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
1217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index >= drv_ctx.ip_buf.actualcount) {
1217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
1217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr == NULL) {
1217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_desc_buffer_ptr = (desc_buffer_hdr*) \
1218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    calloc( (sizeof(desc_buffer_hdr)),
1218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.ip_buf.actualcount);
1218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_desc_buffer_ptr == NULL) {
1218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
1218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
1218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
1219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
1219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
1219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries);
1220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_demux_entries < 8192) {
1220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_offsets[m_demux_entries++] = address_offset;
1220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
1220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
1220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
1221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 index = 0;
1221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
1221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (index < bytes_to_parse) {
1221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
1221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (buf[index+2] == 0x01)) ) {
1221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Found start code, insert address offset
1222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            insert_demux_addr_offset(index);
1222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buf[index+2] == 0x01) // 3 byte start code
1222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                index += 3;
1222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else                      //4 byte start code
1222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                index += 4;
1222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            index++;
1222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries);
1222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
1223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //fix this, handle 3 byte start code, vc1 terminator entry
1223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *p_demux_data = NULL;
1223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 desc_data = 0;
1223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 start_addr = 0;
1223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nal_size = 0;
1223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 suffix_byte = 0;
1224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 demux_index = 0;
1224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 buffer_index = 0;
1224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr == NULL) {
1224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
1224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
1224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_index > drv_ctx.ip_buf.actualcount) {
1225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index);
1225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
1225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( ((OMX_U8*)p_demux_data == NULL) ||
1225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
1225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
1225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; demux_index < m_demux_entries; demux_index++) {
1226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0;
1226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            start_addr = m_demux_offsets[demux_index];
1226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
1226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
1226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
1226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (demux_index < (m_demux_entries - 1)) {
1227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
1227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
1227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)",
1227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)start_addr,
1227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)suffix_byte,
1227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)nal_size,
1227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)demux_index);
1227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = (start_addr >> 3) << 1;
1228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data |= (start_addr & 7) << 21;
1228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data |= suffix_byte << 24;
1228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
1228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_demux_data += 16;
1228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_type_parse == CODEC_TYPE_VC1) {
1229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VC1 terminator entry");
1229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0;
1229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0x82 << 24;
1229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
1229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_demux_data += 16;
1229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_demux_entries++;
1230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Add zero word to indicate end of descriptors
1230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(p_demux_data, 0, sizeof(OMX_U32));
1230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
1230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size);
1230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
1230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
1230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Demux table complete!");
1231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level)
1231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
1231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
1231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.turbo", property_value, "0");
1231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0, sizeof(v4l2_control));
1232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
1232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (perf_level) {
1232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VIDC_NOMINAL:
1232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value))
1232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
1232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
1232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VIDC_TURBO:
1232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
1233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     default:
1233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requested PERF level not supported");
1233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig)
1233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("changing performance level to %d", control.value);
1233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        current_perf_level = control.value;
1234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set PERF level");
1234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
1234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enabled = false;
1234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = NULL;
1235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_members();
1235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ColorFormat = OMX_COLOR_FormatMax;
1235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dest_format = YCbCr420P;
1235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_width = 0;
1235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_height = 0;
1235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
1235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = reinterpret_cast<omx_vdec*>(client);
1236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::init_members()
1236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocated_count = 0;
1236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_size_req = 0;
1236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_alignment_req = 0;
1236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_width = m_c2d_height = 0;
1236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
1236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
1237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
1237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
1237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
1237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (int i = 0; i < MAX_COUNT; i++)
1237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd[i] = -1;
1237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
1238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2d.destroy();
1238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
1238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int src_size = 0, destination_size = 0;
123882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    unsigned int height, width;
123892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_format fmt;
1239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_COLOR_FORMATTYPE drv_color_format;
123912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid client in color convert");
1239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
1239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("No color conversion required");
1239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return status;
1239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
124022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
124032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
124042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.pixelformat = omx->capture_capability;
124052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
124062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    width = fmt.fmt.pix_mp.width;
124072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    height =  fmt.fmt.pix_mp.height;
124082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
124092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    bool resolution_upgrade = (height > m_c2d_height ||
124102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            width > m_c2d_width);
1241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (resolution_upgrade) {
1241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // resolution upgraded ? ensure we are yet to allocate;
1241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // failing which, c2d buffers will never be reallocated and bad things will happen
1241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocated_count > 0) {
1241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Cannot change C2D buffer requirements with %d active allocations",
1241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    allocated_count);
1241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto fail_update_buf_req;
1241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
1242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
1242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
1242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
1242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto fail_update_buf_req;
1242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2d.close();
124292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    status = c2d.open(height,
124302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            width,
1243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            NV12_128m,dest_format);
1243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
1243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = c2d.get_buffer_size(C2D_INPUT,src_size);
1243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (status)
1243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
1243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
1243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
1243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !destination_size) {
1244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
1244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "driver size %u destination size %d",
1244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size,
1244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    destination_size);
1244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            c2d.close();
1244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req = 0;
1244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // TODO: make this fatal. Driver is not supposed to quote size
1244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //  smaller than what C2D needs !!
1244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req = destination_size;
124512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            m_c2d_height = height;
124522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            m_c2d_width = width;
1245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_update_buf_req:
1245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::set_color_format(
1246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE dest_color_format)
1246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
12463b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool status = true, drv_colorformat_c2d_enable = false;
12464b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool dest_color_format_c2d_enable = false;
12465b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    OMX_COLOR_FORMATTYPE drv_color_format = OMX_COLOR_FormatUnused;
1246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid client in color convert");
1246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
1246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
1247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
1247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
1247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
1247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
1247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
1247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         drv_color_format = (OMX_COLOR_FORMATTYPE)
1248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
12481b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel     } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
12482b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
12483b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed;
1248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     } else {
1248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Incorrect color format");
1248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
1248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
12488b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    drv_colorformat_c2d_enable = (drv_color_format != dest_color_format) &&
12489b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12490b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView) &&
12491b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12492b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) &&
12493b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12494b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed);
12495b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
12496b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    dest_color_format_c2d_enable = (dest_color_format != (OMX_COLOR_FORMATTYPE)
12497b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) &&
12498b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            (dest_color_format != (OMX_COLOR_FORMATTYPE)
12499b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed);
12500b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
12501b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (status && drv_colorformat_c2d_enable && dest_color_format_c2d_enable) {
1250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Enabling C2D");
1250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) &&
1250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) {
1250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
1250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat = dest_color_format;
1250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ?
1251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    YCbCr420P : YCbCr420SP;
1251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (enabled)
1251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                c2d.destroy();
1251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enabled = false;
1251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!c2d.init()) {
1251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("open failed for c2d");
1251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
1251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else
1251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                enabled = true;
1251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (enabled)
1252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            c2d.destroy();
1252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enabled = false;
1252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
1253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->m_out_mem_ptr;
1253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_out_mem_ptr_client;
1253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
1254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd)
1254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bufadd;
1254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index = 0;
1255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufadd - omx->m_out_mem_ptr;
1255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < omx->drv_ctx.op_buf.actualcount) {
1255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
1255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
1255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool status;
1255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
1255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_lock(&omx->c_lock);
1255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            cache_clean_buffer(index);
1255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
12560bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    omx->drv_ctx.op_buf_map_info[index].base_address, bufadd->pBuffer, pmem_fd[index],
1256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_baseaddress[index], pmem_baseaddress[index]);
1256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!status) {
1256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
1256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr_client[index].nFilledLen = 0;
1256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_unlock(&omx->c_lock);
1256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return &m_out_mem_ptr_client[index];
1256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int filledLen = 0;
1256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                c2d.get_output_filled_length(filledLen);
1257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr_client[index].nFilledLen = filledLen;
1257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cache_clean_invalidate_buffer(index);
1257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_unlock(&omx->c_lock);
1257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_mem_ptr_client[index].nFilledLen = 0;
1257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return &m_out_mem_ptr_client[index];
1257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
1257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
1258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
1258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd)
1258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bufadd;
1259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index = 0;
1259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufadd - m_out_mem_ptr_client;
1259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < omx->drv_ctx.op_buf.actualcount) {
1259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return &omx->m_out_mem_ptr[index];
1259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
1259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
1259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
1260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(unsigned int &buffer_size)
1260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_size = omx->drv_ctx.op_buf.buffer_size;
1260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
1260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
1260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Get buffer size failed");
1260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto fail_get_buffer_size;
1261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_get_buffer_size:
1261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::set_buffer_req(
1261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 buffer_size, OMX_U32 actual_count) {
1262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 expectedSize = enabled ? buffer_size_req : omx->drv_ctx.op_buf.buffer_size;
1262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_size < expectedSize) {
1262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("OP Requirements: Client size(%u) insufficient v/s requested(%u)",
1262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer_size, expectedSize);
1262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (actual_count < omx->drv_ctx.op_buf.actualcount) {
1262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("OP Requirements: Client count(%u) insufficient v/s requested(%u)",
1262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                actual_count, omx->drv_ctx.op_buf.actualcount);
1263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool reqs_updated = false;
1263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled) {
1263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // disallow changing buffer size/count while we have active allocated buffers
1263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocated_count > 0) {
1263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Cannot change C2D buffer size from %u to %u with %d active allocations",
1263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buffer_size_req, buffer_size, allocated_count);
1263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInvalidState;
1264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_size_req = buffer_size;
1264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_size > omx->drv_ctx.op_buf.buffer_size) {
1264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->drv_ctx.op_buf.buffer_size = buffer_size;
1264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            reqs_updated = true;
1264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (actual_count > omx->drv_ctx.op_buf.actualcount) {
1265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.op_buf.actualcount = actual_count;
1265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        reqs_updated = true;
1265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (reqs_updated) {
1265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.extradata_info.count = omx->drv_ctx.op_buf.actualcount;
1265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.extradata_info.size = omx->drv_ctx.extradata_info.count *
1265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->drv_ctx.extradata_info.buffer_size;
1265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->set_buffer_req(&(omx->drv_ctx.op_buf));
1266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
1266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *bufhdr)
1266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
1266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->free_output_buffer(bufhdr);
1267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled && omx->is_component_secure())
1267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
1267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!allocated_count || !bufhdr) {
1267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
1267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufhdr - m_out_mem_ptr_client;
1267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index >= omx->drv_ctx.op_buf.actualcount) {
1267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
1268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_fd[index] >= 0) {
1268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        munmap(pmem_baseaddress[index], buffer_size_req);
1268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(pmem_fd[index]);
1268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_fd[index] = -1;
1268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx->free_ion_memory(&op_buf_ion_info[index]);
1268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr[index].video_heap_ptr = NULL;
1269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocated_count > 0)
1269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocated_count--;
1269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
1269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocated_count = 0;
1269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!allocated_count) {
1269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&omx->c_lock);
1269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        c2d.close();
1269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        init_members();
1269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&omx->c_lock);
1270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
1270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
1270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
1270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
1271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled && omx->is_component_secure()) {
1271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
1271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->is_component_secure());
1271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
1271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bufferHdr || bytes > buffer_size_req) {
1271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
1271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u",
1272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)buffer_size_req, (unsigned int)bytes);
1272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
1272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
1272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
1272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
1272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            port,appData,omx->drv_ctx.op_buf.buffer_size);
1273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
1273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
1273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
1273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (int)omx->drv_ctx.op_buf.actualcount) {
1273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid header index %ld",
1273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               (long int)(temp_bufferHdr - omx->m_out_mem_ptr));
1273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
1273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int i = allocated_count;
1274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Allocate color-conversion buffers as cached to improve software-reading
1274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // performance of YUV (thumbnails). NOTE: These buffers will need an explicit
1274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // cache invalidation.
1274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
1274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req,buffer_alignment_req,
1274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
1274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ION_FLAG_CACHED);
1274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
1275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (op_buf_ion_info[i].ion_device_fd < 0) {
1275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
1275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
1275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
1275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_baseaddress[i] == MAP_FAILED) {
1275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
1275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(pmem_fd[i]);
1276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->free_ion_memory(&op_buf_ion_info[i]);
1276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
1276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
1276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
1276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get();
1276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info_client[i].offset = 0;
1276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
1277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list_client[i].nEntries = 1;
1277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
1277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
1277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
1277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nFilledLen = 0;
1277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nFlags = 0;
1277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
1277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
1278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
1278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
1278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pAppPrivate = appData;
1278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *bufferHdr = &m_out_mem_ptr_client[i];
1278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr);
1278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocated_count++;
1278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::is_component_secure()
1279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return secure_mode;
1279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
1279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
1279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
1280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dest_color_format = (OMX_COLOR_FORMATTYPE)
1280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
1280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
1280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){
1280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
12806b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC){
12807b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed;
1280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
1281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
1281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = ColorFormat;
1281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops(
1282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int index, unsigned int cmd)
1282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
1282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx || index >= omx->drv_ctx.op_buf.actualcount) {
1282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Invalid param", __func__);
1282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_flush_data flush_data;
1283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_custom_data custom_data;
1283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&flush_data, 0x0, sizeof(flush_data));
1283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&custom_data, 0x0, sizeof(custom_data));
1283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.vaddr = pmem_baseaddress[index];
1283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd;
1284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle;
1284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.length = buffer_size_req;
1284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    custom_data.cmd = cmd;
1284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    custom_data.arg = (unsigned long)&flush_data;
1284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d",
1284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
1284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            flush_data.fd, flush_data.handle, flush_data.vaddr,
1284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            flush_data.length);
1284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data);
1285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret < 0) {
1285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Cache %s failed: %s\n",
1285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
1285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                strerror(errno));
1285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
1285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_add(int nPortIndex)
1286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long i = 0;
1286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool buf_present = false;
1286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
1286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
1286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dynamic_buf_mode || !out_dynamic_list) {
1286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //check the buffer fd, offset, uv addr with list contents
1287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //If present increment reference.
1287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((out_dynamic_list[i].fd == fd) &&
1287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (out_dynamic_list[i].offset == offset)) {
1287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u",
1287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (!secure_mode) {
1287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr;
1288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
1288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               buf_present = true;
1288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
1288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buf_present) {
1288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //search for a entry to insert details of the new buffer
1288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (out_dynamic_list[i].dup_fd < 0) {
1288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].fd = fd;
1289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].offset = offset;
1289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].dup_fd = dup(fd);
1289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].ref_count++;
1289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u",
1289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
1289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr =
1289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len,
1289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          PROT_READ|PROT_WRITE, MAP_SHARED,
1290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0);
1290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //mmap returns (void *)-1 on failure and sets error code in errno.
1290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) {
1290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno);
1290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL;
1290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
1290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr;
1290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len;
1290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
1291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   pthread_mutex_unlock(&m_lock);
1291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_remove()
1291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long i = 0;
1292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dynamic_buf_mode || !out_dynamic_list) {
1292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) {
1292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
1293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap(out_dynamic_list[i].buffaddr,
1293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        out_dynamic_list[i].mapped_size);
1293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u",
1293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         close(out_dynamic_list[i].dup_fd);
1293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         out_dynamic_list[i].dup_fd = -1;
1293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
1294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (out_dynamic_list) {
1294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(out_dynamic_list);
1294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        out_dynamic_list = NULL;
1294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
1294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::send_codec_config() {
1294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag) {
1295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p1 = 0; // Parameter - 1
1295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p2 = 0; // Parameter - 2
1295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long ident = 0;
1295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&m_lock);
1295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n");
1295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (m_etb_q.m_size) {
1295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_etb_q.pop_entry(&p1,&p2,&ident);
1295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
1295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
1296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
1296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
1296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx_report_error();
1296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
1296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
1296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
1296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
1296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
1297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
1297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
1297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx_report_error ();
1297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
1297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pending_input_buffers++;
12977b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
1297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
1297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
1298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
1298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
1298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
1298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_BUFFERHEADERTYPE *)p1);
1298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
1298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&m_lock);
1298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::perf_control()
1299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lib = NULL;
1299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_handle = 0;
1299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock_acquire = NULL;
1299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock_release = NULL;
1299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::~perf_control()
1300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_handle != 0 && m_perf_lock_release) {
1300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("NOTE2: release perf lock");
1300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release(m_perf_handle);
1300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib) {
1300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(m_perf_lib);
1300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0};
1301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock;
1301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state)
1301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (load_lib() == false) {
1301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return;
1302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock.lock();
1302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* 0x4401 maps to video decode playback hint
1302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * in perflock, enum number is 44 and state
1302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * being sent on perflock acquire is 01 (true)
1302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
1302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int arg = 0x4401;
1302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (state == true) {
1302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_inst_count++;
1303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (state == false) {
1303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_inst_count--;
1303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) {
1303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int));
1303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_acquired = true;
1303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Video slvp perflock acquired");
1303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) {
1303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release(mpctl_obj.vid_disp_handle);
1304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_acquired = false;
1304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Video slvp perflock released");
1304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock.unlock();
1304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::request_cores(int frame_duration_us)
1304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) {
1304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool retVal = load_lib();
1305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (retVal && m_perf_lock_acquire && m_perf_handle == 0) {
1305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int arg = 0x700 /*base value*/ + 2 /*cores*/;
1305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int));
1305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_handle) {
1305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("perf lock acquired");
1305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::perf_control::load_lib()
1306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char perf_lib_path[PROPERTY_VALUE_MAX] = {0};
1306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib)
1306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
1306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) {
1306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library");
1306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto handle_err;
1307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) {
1307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror());
1307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto handle_err;
1307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq");
1307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_lock_acquire == NULL) {
1307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq");
1307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto handle_err;
1308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel");
1308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_lock_release == NULL) {
1308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel");
1308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto handle_err;
1308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
1308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelhandle_err:
1309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib) {
1309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(m_perf_lib);
1309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lib = NULL;
1309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return false;
1309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth,
1309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            unsigned long nMaxFrameHeight)
1309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = 0;
1310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long min_res_buf_count = 0;
1310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    eRet = enable_smoothstreaming();
1310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone) {
1310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver");
1310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu",
1311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             nMaxFrameWidth,
1311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             nMaxFrameHeight);
1311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_mode = true;
1311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_width = nMaxFrameWidth;
1311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_height = nMaxFrameHeight;
1311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     //Get upper limit buffer count for min supported resolution
1311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     struct v4l2_format fmt;
1312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.height = m_decoder_capability.min_height;
1312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.width = m_decoder_capability.min_width;
1312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.pixelformat = output_capability;
1312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (ret) {
1312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u",
1312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_decoder_capability.min_height,
1312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_decoder_capability.min_width);
1313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return OMX_ErrorUnsupportedSetting;
1313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req");
1313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     min_res_buf_count = drv_ctx.op_buf.mincount;
1314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u",
1314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width);
1314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13143fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nLeft = 0;
13144fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nTop = 0;
13145fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nWidth = m_smoothstreaming_width;
13146fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nHeight = m_smoothstreaming_height;
13147fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     update_resolution(m_smoothstreaming_width, m_smoothstreaming_height,
1314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       m_smoothstreaming_width, m_smoothstreaming_height);
1315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = is_video_session_supported();
1315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("video session is not supported");
1315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     //Get upper limit buffer size for max smooth streaming resolution set
1315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.pixelformat = output_capability;
1316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (ret) {
1316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback");
1316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return OMX_ErrorUnsupportedSetting;
1316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req!!");
1317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u",
1317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)drv_ctx.op_buf.buffer_size);
1317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.mincount = min_res_buf_count;
1317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.actualcount = min_res_buf_count;
1317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size;
1317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = set_buffer_req(&drv_ctx.op_buf);
1317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to set_buffer_req");
1318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req!!!");
1318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u",
1319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size);
1319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     return eRet;
1319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//static
1319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) {
1319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef FLEXYUV_SUPPORTED
1319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorUndefined;
1319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
1320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pParam == NULL) {
1320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("describeColorFormat: invalid params");
1320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam;
1320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MediaImage *img = &(params->sMediaImage);
1320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch(params->eColorFormat) {
1321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m:
1321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
1321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
1321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mNumPlanes = 3;
1321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // mWidth and mHeight represent the W x H of the largest plane
1321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // In our case, this happens to be the Stride x Scanlines of Y plane
1321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mWidth = params->nFrameWidth;
1321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mHeight = params->nFrameHeight;
1321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight);
1322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mBitDepth = 8;
1322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 0 (Y)
1322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mOffset = 0;
1322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mColInc = 1;
1322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride
1322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mHorizSubsampling = 1;
1322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mVertSubsampling = 1;
1322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 1 (U)
1322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight;
1322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mColInc = 2;           //interleaved UV
1323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mRowInc =
1323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mHorizSubsampling = 2;
1323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mVertSubsampling = 2;
1323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 2 (V)
1323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1;
1323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mColInc = 2;           //interleaved UV
1323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mRowInc =
1323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mHorizSubsampling = 2;
1324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mVertSubsampling = 2;
1324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420Planar:
1324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420SemiPlanar:
1324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // We need not describe the standard OMX linear formats as these are
1324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // understood by client. Fail this deliberately to let client fill-in
1324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorUnsupportedSetting;
1324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
1325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Rest all formats which are non-linear cannot be described
1325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat);
1325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
1325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorNone;
1325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
1325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat);
1325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("  FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight);
1325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("  YWidth x YHeight : %d x %d", img->mWidth, img->mHeight);
1326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (size_t i = 0; i < img->mNumPlanes; ++i) {
1326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("  Plane[%zu] : offset=%d / xStep=%d / yStep = %d",
1326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc);
1326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //FLEXYUV_SUPPORTED
1326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::prefetchNewBuffers() {
1326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_decoder_cmd dec;
1327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t prefetch_count;
1327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t prefetch_size;
1327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t want_size;
1327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t have_size;
1327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int color_fmt, rc;
1327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_calculated_size;
1327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_buffer_size;
1327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_buffer_count;
1327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t old_buffer_size;
1328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t old_buffer_count;
1328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&dec, 0 , sizeof(dec));
1328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Old size : %zu, count : %d, width : %u, height : %u\n",
1328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount,
1328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
1328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height);
1328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT;
1328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
1328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno);
1329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n",
1329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dec.raw.data[0], dec.raw.data[1]);
1329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)drv_ctx.output_format) {
1329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VDEC_YUV_FORMAT_NV12:
1329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = COLOR_FMT_NV12;
1329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VDEC_YUV_FORMAT_NV12_UBWC:
1330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = COLOR_FMT_NV12_UBWC;
1330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
13302b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case VDEC_YUV_FORMAT_NV12_TP10_UBWC:
13303b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        color_fmt = COLOR_FMT_NV12_BPP10_UBWC;
13304b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
1330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = -1;
1330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Color format : %x not supported for secure memory prefetching\n", drv_ctx.output_format);
1330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height);
1331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n",
1331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_reconfig_width, m_reconfig_height, new_calculated_size);
1331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size;
1331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_count = dec.raw.data[1];
1331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    old_buffer_size = drv_ctx.op_buf.buffer_size;
1331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    old_buffer_count = drv_ctx.op_buf.actualcount;
1331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count;
1332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prefetch_count = new_buffer_count;
1332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prefetch_size = new_buffer_size - old_buffer_size;
1332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    want_size = new_buffer_size * new_buffer_count;
1332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    have_size = old_buffer_size * old_buffer_count;
1332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (want_size > have_size) {
1332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size);
1332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size);
1332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ion_fd = open(MEM_DEVICE, O_RDONLY);
1333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ion_fd < 0) {
1333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd);
1333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return;
1333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data));
1333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data));
1333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions));
1333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count);
1334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) {
1334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("prefetch data allocation failed");
1334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto prefetch_exit;
1334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (uint32_t i = 0; i < prefetch_count; i++) {
1334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizes[i] = prefetch_size;
1334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].nr_sizes = prefetch_count;
1335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].sizes = sizes;
1335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].vmid = ION_FLAG_CP_PIXEL;
1335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->nr_regions = 1;
1335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->regions = regions;
1335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID);
1335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        custom_data->cmd = ION_IOC_PREFETCH;
1335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        custom_data->arg = (unsigned long )prefetch_data;
1336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data);
1336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
1336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno);
1336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelprefetch_exit:
1336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(ion_fd);
1336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(sizes);
1336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(regions);
1337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(prefetch_data);
1337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(custom_data);
1337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
13374