111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2010 - 2016, 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
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef _ANDROID_
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/ioctl.h>
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/mman.h>
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //_ANDROID_
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h>
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef USE_EGL_IMAGE_GPU
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <qdMetaData.h>
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ANDROID_JELLYBEAN_MR2
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "QComOMXMetadata.h"
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <EGL/egl.h>
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <EGL/eglQCOM.h>
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EGL_BUFFER_HANDLE 0x4F00
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EGL_BUFFER_OFFSET 0x4F01
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BUFFER_LOG_LOC "/data/misc/media"
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFILE *outputExtradataFile;
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelchar output_extradata_filename [] = "/data/misc/media/extradata";
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_FPS 30
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_SUPPORTED_FPS 240
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_WIDTH_ALIGNMENT 128
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_HEIGHT_ALIGNMENT 32
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE        0xC5000000
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE_MASK   0xFF000000
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_AP_SEQ_START_CODE       0x0F010000
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_PROFILE_MASK   0xF0
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_LEVEL_MASK     0xE0000000
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE          0
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_MAIN_PROFILE            1
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_ADVANCE_PROFILE         3
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_LOW_LEVEL  0
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_MED_LEVEL  2
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_LEN            4
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_POS            8
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_A_POS            12
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_POS            24
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SEQ_LAYER_SIZE          36
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define POLL_TIMEOUT 0x7fffffff
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_DEVICE "/dev/ion"
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C" {
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include<utils/Log.h>
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif//_ANDROID_
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_1M 0x100000
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1))
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
127fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_FRAMEPACK_EXTRADATA | OMX_OUTPUTCROP_EXTRADATA \
128fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           | OMX_DISPLAY_INFO_EXTRADATA | OMX_HDR_COLOR_INFO_EXTRADATA)
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_BITSTREAM
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_BITSTREAM 0
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_PIXEL
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_PIXEL 0
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MASTER_SIDE_CP
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_SECURE_HEAP_ID
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_4K
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER (ION_SECURE | ION_FLAG_CP_BITSTREAM)
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER (ION_SECURE | ION_FLAG_CP_PIXEL)
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //SLAVE_SIDE_CP
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_1M
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER ION_SECURE
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
151af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel#define LUMINANCE_DIV_FACTOR 10000.0
152af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingWidth = 1920;
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingHeight = 1088;
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input)
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *buffer;
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pollfd pfds[2];
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event dqevent;
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].events = POLLIN | POLLERR;
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].fd = omx->drv_ctx.video_driver_fd;
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].fd = omx->m_poll_efd;
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->async_thread_force_stop) {
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = poll(pfds, 2, POLL_TIMEOUT);
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc) {
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Poll timedout");
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (rc < 0 && errno != EINTR && errno != EAGAIN) {
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno);
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) {
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited");
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) {
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_msginfo vdec_msg;
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&vdec_msg, 0, sizeof(vdec_msg));
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = omx->drv_ctx.num_planes;
19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (uint64_t)v4l2_buf.timestamp.tv_usec;
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) {
20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_msginfo vdec_msg;
20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = 1;
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pfds[0].revents & POLLPRI) {
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent);
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0];
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1];
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient");
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(ptr[2] & V4L2_EVENT_BITDEPTH_FLAG) {
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->dpb_bit_depth = ptr[3];
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", ptr[3]);
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(ptr[2] & V4L2_EVENT_PICSTRUCT_FLAG) {
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->m_progressive = ptr[4];
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig PicStruct change - %d", ptr[4]);
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
242af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                if(ptr[2] & V4L2_EVENT_COLOUR_SPACE_FLAG) {
243af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    if (ptr[5] == MSM_VIDC_BT2020) {
244af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        omx->m_color_space = omx_vdec::BT2020;
245af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    } else {
246af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        omx->m_color_space = omx_vdec::EXCEPT_BT2020;
247af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    }
248af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig ColorSpace change - %d", omx->m_color_space);
249af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                }
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved");
25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved");
26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) {
27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD;
27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Overload received");
27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) {
28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED;
28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Unsupported received");
28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR;
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code = VDEC_S_SUCCESS;
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("SYS Error Recieved");
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) {
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]);
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) {
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]);
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.memory = V4L2_MEMORY_USERPTR;
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.length = omx->drv_ctx.num_planes;
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.m.planes = plane;
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.index = ptr[5];
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.flags = 0;
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code = VDEC_S_SUCCESS;
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf;
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.len = 0;
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2];
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) +
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (uint64_t)ptr[4];
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exitedn");
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                continue;
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread_dec(void *input)
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char id;
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int n;
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd_set readFds;
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int res = 0;
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct timeval tv;
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->message_thread_stop) {
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tv.tv_sec = 2;
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tv.tv_usec = 0;
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FD_ZERO(&readFds);
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FD_SET(omx->m_pipe_in, &readFds);
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv);
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (res < 0) {
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno));
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (res == 0 /*timeout*/ || omx->message_thread_stop) {
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        n = read(omx->m_pipe_in, &id, 1);
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (0 == n) {
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (1 == n) {
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->process_event_cb(omx, id);
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((n < 0) && (errno != EINTR)) {
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_vdec *omx, unsigned char id)
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret_value;
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret_value = write(omx->m_pipe_out, &id, 1);
38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret_value <= 0) {
38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno));
38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::~omx_cmd_queue()
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Nothing to do
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id)
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].id       = id;
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].param1   = p1;
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].param2   = p2;
41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_write++;
41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_size ++;
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_write = 0;
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id)
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_size > 0) {
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *id = m_q[m_read].id;
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *p1 = m_q[m_read].param1;
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *p2 = m_q[m_read].param2;
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Move the read pointer ahead
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ++m_read;
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        --m_size;
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_read = 0;
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue
44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_q[m_read].id;
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::ts_arr_list()
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //initialize timestamps array
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::~ts_arr_list()
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //free m_ts_arr_list?
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool duplicate_ts = false;
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //insert at the first available empty location
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_ts_arr_list[idx].valid) {
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //found invalid or empty entry, save timestamp
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_ts_arr_list[idx].valid = true;
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_ts_arr_list[idx].timestamp = ts;
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ts, idx);
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int min_idx = -1;
49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_TICKS min_ts = 0;
49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_ts_arr_list[idx].valid) {
49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //found valid entry, save index
49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (min_idx < 0) {
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //first valid entry
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_ts = m_ts_arr_list[idx].timestamp;
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_idx = idx;
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_ts = m_ts_arr_list[idx].timestamp;
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_idx = idx;
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (min_idx < 0) {
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //no valid entries found
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts = 0;
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts = m_ts_arr_list[min_idx].timestamp;
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ts_arr_list[min_idx].valid = false;
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ts, min_idx);
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::reset_ts_list()
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ts_arr_list[idx].valid = false;
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// factory function executed by the core to create instances
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void)
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (new omx_vdec);
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_user_handle_t handle, int ionMapfd)
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) devicefd;
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) size;
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) base;
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) handle;
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) ionMapfd;
55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int fd, size_t size, void* base)
56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // dup file descriptor, map once, use pmem
56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init(dup(fd), base, size, 0 , MEM_DEVICE);
56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
567b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
568b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool is_platform_tp10capture_supported()
569b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{
570b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    char platform_name[PROPERTY_VALUE_MAX] = {0};
571b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    property_get("ro.board.platform", platform_name, "0");
572af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    if (!strncmp(platform_name, "msm8998", 9)) {
573b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_HIGH("TP10 on capture port is supported");
574b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        return true;
575b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
576b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    DEBUG_PRINT_HIGH("TP10 on capture port is not supported");
577b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    return false;
578b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel}
579b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::omx_vdec
58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Constructor
58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None
58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_vdec(): m_error_propogated(false),
59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_state(OMX_StateInvalid),
59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_app_data(NULL),
59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_mem_ptr(NULL),
59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr(NULL),
59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_flush_progress (false),
59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_flush_progress (false),
60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_use_buffer (false),
60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_use_buffer (false),
60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers(false),
60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_output_pmem(OMX_FALSE),
60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_region_smi(OMX_FALSE),
60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_pvt_entry_pmem(OMX_FALSE),
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers(0),
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers(0),
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bm_count(0),
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bm_count(0),
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bPopulated(OMX_FALSE),
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bPopulated(OMX_FALSE),
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_flags(0),
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr(NULL),
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bEnabled(OMX_TRUE),
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bEnabled(OMX_TRUE),
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_in_alloc_cnt(0),
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list(NULL),
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry(NULL),
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info(NULL),
62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_parser(NULL),
62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    arbitrary_bytes (true),
62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    psource_frame (NULL),
62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pdest_frame (NULL),
62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_heap_ptr (NULL),
62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_phdr_pmem_ptr(NULL),
62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_inp_bm_count (0),
62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    codec_type_parse ((codec_type)0),
63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame_meta (true),
63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_count (0),
63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nal_count (0),
63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nal_length(0),
63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    look_ahead_nal (false),
63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame(0),
63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_buffer(NULL),
63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame_size (0),
63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_device_file_ptr(NULL),
63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_vc1_profile((vc1_profile_type)0),
64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_last_au_ts(LLONG_MAX),
64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_last_au_flags(0),
64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disp_hor_size(0),
64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disp_vert_size(0),
64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts(LLONG_MAX),
64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts_actual(LLONG_MAX),
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rst_prev_ts(true),
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frm_int(0),
648fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_fps_received(0),
649fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_fps_prev(0),
650fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_drc_enable(0),
65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    in_reconfig(false),
65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_display_id(NULL),
65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_extradata(0),
65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reject_avc_1080p_mp (0),
65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_enable_android_native_buffers(OMX_FALSE),
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_android_native_buffers(OMX_FALSE),
65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_desc_buffer_ptr(NULL),
66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_mode(false),
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocate_native_handle(false),
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_other_extradata(NULL),
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_profile(0),
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_set_fps(false),
66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    stereo_output_mode(HAL_NO_3D),
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_last_rendered_TS(-1),
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_queued_codec_config_count(0),
66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL),
66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_scaling_to_non_secure_opb(false),
670b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_force_compressed_for_dpb(true),
67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_is_display_session(false)
67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_in = -1;
67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_out = -1;
67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = -1;
67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_driver_fd = -1;
67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.extradata_info.ion.fd_ion_data.fd = -1;
67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Assumption is that , to begin with , we have all the frames with decoder */
67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8);
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_debug,0,sizeof(m_debug));
68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.level", property_value, "1");
684b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    debug_level = strtoul(property_value, NULL, 16);
68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.perf", property_value, "0");
69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    perf_flag = atoi(property_value);
69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec_time.start();
69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
695fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    proc_frms = latency = 0;
69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_n_filled_len = 0;
69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.ts", property_value, "0");
69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_timestamp = atoi(property_value);
70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        time_stamp_dts.set_timestamp_reorder_mode(true);
70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        time_stamp_dts.enable_debug_print(true);
70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.concealedmb", property_value, "0");
70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_concealedmb = atoi(property_value);
70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.profile.check", property_value, "0");
71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reject_avc_1080p_mp = atoi(property_value);
71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.log.in", property_value, "0");
71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.in_buffer_log = atoi(property_value);
71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.log.out", property_value, "0");
72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_buffer_log = atoi(property_value);
72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.meta.log.out", property_value, "0");
72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_meta_buffer_log = atoi(property_value);
72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.log.loc", property_value, "");
73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (*property_value)
73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.120fps.enabled", property_value, "0");
73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //if this feature is not enabled then reset this value -ve
73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(atoi(property_value)) {
74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("feature 120 FPS decode enabled");
74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_last_rendered_TS = 0;
74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.dyn.disabled", property_value, "0");
74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_dynamic_buf_mode = atoi(property_value);
74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode);
74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    property_value[0] = '\0';
750fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    property_get("vidc.dec.drc.enable", property_value, "0");
751fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (atoi(property_value)) {
752fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_drc_enable = true;
753fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_HIGH("DRC enabled");
754fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
755fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_
75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0");
75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_ubwc_mode = atoi(property_value);
76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled");
76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_ubwc_mode = true;
76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_cmp,0,sizeof(m_cmp));
76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_cb,0,sizeof(m_cb));
76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&drv_ctx,0,sizeof(drv_ctx));
76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams));
773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams));
774fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    memset(&m_client_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams));
775fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    memset(&m_internal_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams));
77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    msg_thread_id = 0;
77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_id = 0;
77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    msg_thread_created = false;
78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_created = false;
78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_force_stop = false;
78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    message_thread_stop = false;
78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* invalidate m_frame_pack_arrangement */
78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_frame_pack_arrangement.cancel_flag = 1;
79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.timestamp_adjust = false;
79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_vendor_config.pData = NULL;
79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&m_lock, NULL);
79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&c_lock, NULL);
79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&buf_lock, NULL);
79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_init(&m_cmd_lock,0,0);
79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_init(&m_safe_flush, 0, 0);
79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    streaming[CAPTURE_PORT] =
80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[OUTPUT_PORT] = false;
80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char extradata_value[PROPERTY_VALUE_MAX] = {0};
80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.extradata", extradata_value, "0");
80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_extradata = atoi(extradata_value);
80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_buffers.set_vdec_client(this);
80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dynamic_buf_mode = false;
81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    out_dynamic_list = NULL;
81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = false;
81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_downscalar_width = 0;
81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_downscalar_height = 0;
81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_force_down_scalar = 0;
81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reconfig_height = 0;
81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reconfig_width = 0;
81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_mode = false;
81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_width = 0;
81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_height = 0;
82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_q6_platform = false;
82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_control.send_hint_to_mpctl(true);
82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_input_pass_buffer_fd = false;
82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_extradata_info, 0, sizeof(m_extradata_info));
824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams);
836fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
837fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_client_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
838fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_internal_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
839fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_change_client_hdr_info = false;
840fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    pthread_mutex_init(&m_hdr_info_client_lock, NULL);
841af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel
842af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    char dither_value[PROPERTY_VALUE_MAX] = {0};
843af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    property_get("vidc.dec.dither", dither_value, "0");
844af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    if ((atoi(dither_value) > DITHER_ALL_COLORSPACE) ||
845af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        (atoi(dither_value) < DITHER_DISABLE)) {
846af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        m_dither_config = DITHER_ALL_COLORSPACE;
847af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    } else {
848af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        m_dither_config = is_platform_tp10capture_supported() ? (dither_type)atoi(dither_value) : DITHER_ALL_COLORSPACE;
849af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    }
850af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel
851af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    DEBUG_PRINT_HIGH("Dither config is %d", m_dither_config);
852b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_color_space = EXCEPT_BT2020;
85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = {
85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT,
86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE,
86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER,
86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_SYS_ERROR,
86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_HW_OVERLOAD,
86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED
86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd)
86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < array_sz) {
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (--i; i >=0 ; i--) {
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&sub, 0, sizeof(sub));
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sub.type = event_type[i];
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::~omx_vdec
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Destructor
93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::~omx_vdec()
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info = NULL;
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (msg_thread_created) {
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread");
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        message_thread_stop = true;
94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_message(this, OMX_COMPONENT_CLOSE_MSG);
94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_join(msg_thread_id,NULL);
94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_pipe_in);
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_pipe_out);
95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_in = -1;
95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_out = -1;
95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(eventfd_write(m_poll_efd, 1)) {
95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno);
95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         async_thread_force_stop = true;
95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (async_thread_created)
95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_join(async_thread_id,NULL);
96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsubscribe_to_events(drv_ctx.video_driver_fd);
96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_poll_efd);
96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(drv_ctx.video_driver_fd);
96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&m_lock);
96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&c_lock);
96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&buf_lock);
96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_destroy(&m_cmd_lock);
967fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    pthread_mutex_destroy(&m_hdr_info_client_lock);
96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec_time.end();
97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd);
97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_control.send_hint_to_mpctl(false);
97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = 0;
98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) {
98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = 0;
98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format)
99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[2];
99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s",
100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         is_split_mode ? "split" : "combined",
100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc":
100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc":
100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb":
100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "unknown",
100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         capture_capability == V4L2_PIX_FMT_NV12 ? "nv12":
100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc":
1008b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel         capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC ? "nv12_10bit_ubwc":
100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "unknown");
101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE;
101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (is_split_mode) {
101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY;
101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY;
101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT;
101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].value = dpb_color_format;
102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 2;
102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls);
102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc);
102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1034b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt)
103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
1039b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool cpu_access = (capture_capability != V4L2_PIX_FMT_NV12_UBWC) &&
1040b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        capture_capability != V4L2_PIX_FMT_NV12_TP10_UBWC;
1041b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool tp10_enable = !cpu_access &&
1042b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10;
1043b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool dither_enable = true;
1044b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1045b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    switch (m_dither_config) {
1046b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_DISABLE:
1047b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = false;
1048b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1049b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_COLORSPACE_EXCEPTBT2020:
1050b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = (m_color_space == EXCEPT_BT2020);
1051b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1052b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_ALL_COLORSPACE:
1053b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = true;
1054b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1055b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    default:
1056b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_ERROR("Unsupported dither configuration:%d", m_dither_config);
1057b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1058b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1059b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (tp10_enable && !dither_enable) {
1060b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_TP10_UBWC;
1061b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        capture_capability = V4L2_PIX_FMT_NV12_TP10_UBWC;
1062b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1063b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
1064b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1065b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1066b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1067b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("%s: Failed get format on capture mplane", __func__);
1068b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return OMX_ErrorUnsupportedSetting;
1069b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1070b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1071b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1072b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1073b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
1074b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return OMX_ErrorUnsupportedSetting;
1075b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1076b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1077b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1078b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_IDLE_PENDING) &&
108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Invalid state to decide on dpb-opb split");
108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cpu_access) {
108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Disabled split mode for VP9. In split mode the DPB buffers are part of the internal
109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * scratch buffers and the driver does not does the reference buffer management for
109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * scratch buffers. In case of VP9 with spatial scalability, when a sequence changed
109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * event is received with the new resolution, and when a flush is sent by the driver, it
109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * releases all the references of internal scratch buffers. However as per the VP9
109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * spatial scalability, even after the flush, the buffers which have not yet received
109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * release reference event should not be unmapped and freed. Currently in driver,
109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * reference buffer management of the internal scratch buffer is not implemented
109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * and hence the DPB buffers get unmapped. For other codecs it does not matter
109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * as with the new SPS/PPS, the DPB is flushed.
109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             */
1100b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bool is_not_vp9 = eCompressionFormat != OMX_VIDEO_CodingVP9;
1101b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bool eligible_for_split_dpb_ubwc =
1102b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               m_progressive == MSM_VIDC_PIC_STRUCT_PROGRESSIVE &&     //@ Due to Venus limitation for Interlaced, Split mode enabled only for Progressive.
1103b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               is_not_vp9                                       &&     //@ Split mode disabled for VP9.
1104b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               !drv_ctx.idr_only_decoding                       &&     //@ Split mode disabled for Thumbnail usecase.
1105b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               !m_disable_split_mode;                                  //@ Set prop to disable split mode
1106b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1107b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            //Since opb is linear, dpb should also be linear.
1108b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (split_opb_dpb_with_same_color_fmt) {
1109b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eligible_for_split_dpb_ubwc = false;
1110b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            }
1111b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1112b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (eligible_for_split_dpb_ubwc) {
111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //split DPB-OPB
111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB -> UBWC , OPB -> Linear
111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
1116b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            } else if (split_opb_dpb_with_same_color_fmt) {
111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //DPB -> Linear, OPB -> Linear
111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //DPB-OPB combined linear
112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //split DPB-OPB
112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //DPB -> UBWC, OPB -> Linear
112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else { //no cpu access
112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
1130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (split_opb_dpb_with_same_color_fmt) {
113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //split DPB-OPB
113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB -> UBWC, OPB -> UBWC
113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB-OPB combined UBWC
113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
1139b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (dither_enable) {
1140b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //split DPB-OPB
1141b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //DPB -> TP10UBWC, OPB -> UBWC
1142b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1143b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            } else {
1144b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //combined DPB-OPB
1145b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //DPB -> TP10UBWC, OPB -> TP10UBWC
1146b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1147b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            }
114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet) {
115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet);
115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1154b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::enable_downscalar()
116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (is_down_scalar_enabled) {
116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: already enabled", __func__);
116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec::enable_downscalar");
117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = decide_dpb_buffer_mode(true);
117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__);
117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = true;
117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0x0, sizeof(struct v4l2_control));
117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO;
118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__);
118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::disable_downscalar()
119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!is_down_scalar_enabled) {
119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled");
119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = decide_dpb_buffer_mode(false);
120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__);
120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = false;
120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::decide_downscalar()
121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum color_fmts color_format;
12152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_U32 width, height;
121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1217b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC) {
1218b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = disable_downscalar();
1219b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1220b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("Disable downscalar failed!");
1221b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return rc;
1222b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1223b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        return 0;
1224b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1225b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if  (!m_downscalar_width || !m_downscalar_height) {
122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: downscalar not supported", __func__);
122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_force_down_scalar) {
123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar);
123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return rc;
124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    height = fmt.fmt.pix_mp.height;
12462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    width = fmt.fmt.pix_mp.width;
12472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d m_is_display_session = %d", __func__,
124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height, m_is_display_session);
125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height >= m_downscalar_width * m_downscalar_height) &&
125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         m_is_display_session) {
125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = enable_downscalar();
125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc < 0) {
125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        width = m_downscalar_width > fmt.fmt.pix_mp.width ?
126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fmt.fmt.pix_mp.width : m_downscalar_width;
12612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        height = m_downscalar_height > fmt.fmt.pix_mp.height ?
126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fmt.fmt.pix_mp.height : m_downscalar_height;
126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (capture_capability) {
126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12:
126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12;
126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_UBWC:
126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_UBWC;
126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_TP10_UBWC:
127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_BPP10_UBWC;
127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Color format not recognized\n");
127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = OMX_ErrorUndefined;
127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return rc;
127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = disable_downscalar();
128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc < 0) {
128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
12892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.height = height;
12902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.width = width;
129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = get_buffer_req(&drv_ctx.op_buf);
129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__);
130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::OMXCntrlProcessMsgCb
131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL Client callbacks are generated through this routine. The decoder
131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   provides the thread context for this routine.
131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ctxt -- Context information related to the self.
131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   id   -- Event identifier. This could be any of the following:
131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   1. Command completion event
131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   2. Buffer done callback event
132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   3. Frame done callback event
132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1; // Parameter - 1
132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2; // Parameter - 2
133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident;
133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned qsize=0; // qsize
133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec *pThis = (omx_vdec *) ctxt;
133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!pThis) {
133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__);
133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Protect the shared queue data structure
134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    do {
134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Read the message id's from the queue*/
134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&pThis->m_lock);
134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        qsize = pThis->m_cmd_q.m_size;
134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize) {
134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pThis->m_cmd_q.pop_entry(&p1, &p2, &ident);
134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize = pThis->m_ftb_q.m_size;
135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qsize) {
135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pThis->m_ftb_q.pop_entry(&p1, &p2, &ident);
135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize = pThis->m_etb_q.m_size;
135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qsize) {
135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pThis->m_etb_q.pop_entry(&p1, &p2, &ident);
136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&pThis->m_lock);
136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*process message if we have one*/
136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize > 0) {
136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id = ident;
136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (id) {
136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT:
136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pThis->m_cb.EventHandler) {
137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (p1) {
137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandStateSet:
137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_state = (OMX_STATETYPE) p2;
137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->m_state);
137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL);
137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_EventError:
138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (p2 == OMX_StateInvalid) {
138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_state = (OMX_STATETYPE) p2;
138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (p2 == (unsigned long)OMX_ErrorHardware) {
138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->omx_report_error();
138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandPortDisable:
139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2);
139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (BITMASK_PRESENT(&pThis->m_flags,
139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    break;
139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->in_reconfig = false;
140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet !=  OMX_ErrorNone) {
140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_error();
141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandPortEnable:
141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2);
141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            default:
142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_ETB: {
144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_ERRORTYPE iret;
144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2);
144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (iret == OMX_ErrorInsufficientResources) {
144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload");
144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_hw_overload ();
144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else if (iret != OMX_ErrorNone) {
144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_error ();
144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_FTB:
145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\
145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_COMMAND:
146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_U32)p2,(OMX_PTR)NULL);
146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EBD:
146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->time_stamp_dts.remove_time_stamp(
147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp,
147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ?true:false);
147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) {
148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_error ();
148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            int64_t *timestamp = (int64_t *)(intptr_t)p1;
148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p1) {
148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->time_stamp_dts.remove_time_stamp(*timestamp,
148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        ?true:false);
149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                free(timestamp);
149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_FBD:
149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (p2 != VDEC_S_SUCCESS) {
149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->omx_report_error ();
149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) {
150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("fill_buffer_done failure");
150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->omx_report_error ();
150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!pThis->input_flush_progress) {
150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->execute_input_flush();
151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_cb.EventHandler) {
151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (p2 != VDEC_S_SUCCESS) {
151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->omx_report_error ();
151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else {
151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    /*Check if we need generate event for Flush done*/
151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_EventCmdComplete,OMX_CommandFlush,
152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_CORE_INPUT_PORT_INDEX,NULL );
152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_IDLE_PENDING)) {
152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->omx_report_error ();
153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        } else {
153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->streaming[OUTPUT_PORT] = false;
153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (!pThis->output_flush_progress) {
153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_LOW("Input flush done hence issue stop");
153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!pThis->output_flush_progress) {
155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->execute_output_flush();
155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_cb.EventHandler) {
155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (p2 != VDEC_S_SUCCESS) {
155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->omx_report_error ();
155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else {
155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    /*Check if we need generate event for Flush done*/
155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Notify Output Flush done");
156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_EventCmdComplete,OMX_CommandFlush,
156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_CORE_OUTPUT_PORT_INDEX,NULL );
156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Internal flush complete");
157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,
157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (BITMASK_PRESENT(&pThis->m_flags,
157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event(OMX_CommandPortDisable,
157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_CORE_OUTPUT_PORT_INDEX,
157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_EVENT);
157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            BITMASK_CLEAR (&pThis->m_flags,
157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            BITMASK_CLEAR (&pThis->m_flags,
158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->omx_report_error ();
158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            break;
159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->streaming[CAPTURE_PORT] = false;
159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (!pThis->input_flush_progress) {
159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_LOW("Output flush done hence issue stop");
159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_START_DONE:
160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Move to executing");
161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateExecuting;
161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateExecuting, NULL);
162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else if (BITMASK_PRESENT(&pThis->m_flags,
162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_COMPONENT_PAUSE_PENDING)) {
162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                          VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->omx_report_error ();
162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_LOW("Event Handler callback is NULL");
163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->complete_pending_buffer_done_cbs();
164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    //Send the callback now
164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StatePause;
164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StatePause, NULL);
165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_RESUME_DONE:
166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Moving the decoder to execute state");
166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateExecuting;
167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateExecuting,NULL);
167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_STOP_DONE:
168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->complete_pending_buffer_done_cbs();
169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateIdle;
169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Move to Idle State");
169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateIdle,NULL);
170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (p2 == OMX_IndexParamPortDefinition) {
171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition");
171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->in_reconfig = true;
171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }  else if (p2 == OMX_IndexConfigCommonOutputCrop) {
171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop");
171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Check if resolution is changed in smooth streaming mode */
171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_smoothstreaming_mode &&
171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                (pThis->framesize.nWidth !=
171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_width) ||
171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                (pThis->framesize.nHeight !=
172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height)) {
172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d",
172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->framesize.nWidth,
172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->framesize.nHeight,
172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width,
172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height);
172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                /* Update new resolution */
172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->framesize.nWidth =
173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       pThis->drv_ctx.video_resolution.frame_width;
173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->framesize.nHeight =
173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       pThis->drv_ctx.video_resolution.frame_height;
173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                /* Update C2D with new resolution */
173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (!pThis->client_buffers.update_buffer_req()) {
173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed");
173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Update new crop information */
174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left;
174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top;
174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right;
174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom;
174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Validate the new crop information */
174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->rectangle.nLeft + pThis->rectangle.nWidth >
174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->drv_ctx.video_resolution.frame_width) {
174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]",
175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->rectangle.nLeft, pThis->rectangle.nWidth,
175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width);
175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->rectangle.nLeft = 0;
175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (pThis->rectangle.nWidth >
175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_width) {
175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]",
175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->rectangle.nWidth,
176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->drv_ctx.video_resolution.frame_width);
176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nWidth =
176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width;
176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->rectangle.nTop + pThis->rectangle.nHeight >
176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->drv_ctx.video_resolution.frame_height) {
176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]",
176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nTop, pThis->rectangle.nHeight,
177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height);
177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->rectangle.nTop = 0;
177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (pThis->rectangle.nHeight >
177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height) {
177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]",
177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->rectangle.nHeight,
177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height);
177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nHeight =
178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height;
178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u",
178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nLeft, pThis->rectangle.nTop,
178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nWidth, pThis->rectangle.nHeight);
1786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                        } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) {
1787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects");
1788fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                        } else if (p2 == OMX_QTIIndexConfigDescribeHDRColorInfo) {
1789fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeHDRcolorinfo");
179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2);
179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            break;
179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.outfile) {
179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.outfile);
179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.outfile = NULL;
179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.out_ymeta_file) {
179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.out_ymeta_file);
180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.out_ymeta_file = NULL;
180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.out_uvmeta_file) {
180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.out_uvmeta_file);
180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.out_uvmeta_file = NULL;
180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) {
180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->prefetchNewBuffers();
180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            uint32_t frame_data[4];
181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ?
181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->m_reconfig_height : pThis->rectangle.nHeight;
181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ?
181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->m_reconfig_width : pThis->rectangle.nWidth;
181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[2] = (p2 == OMX_IndexParamPortDefinition) ?
181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                frame_data[0] : pThis->drv_ctx.video_resolution.frame_height;
182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[3] = (p2 == OMX_IndexParamPortDefinition) ?
182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                frame_data[1] : pThis->drv_ctx.video_resolution.frame_width;
182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data );
182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EOS_DONE:
183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->prev_ts = LLONG_MAX;
184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->rst_prev_ts = true;
184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_error();
184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING");
185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_unsupported_setting();
185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD:
185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD");
185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_hw_overload();
185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&pThis->m_lock);
186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        qsize = pThis->m_cmd_q.m_size;
186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pThis->m_state != OMX_StatePause)
186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&pThis->m_lock);
186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } while (qsize>0);
186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int format_changed = 0;
187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((height != (int)drv_ctx.video_resolution.frame_height) ||
187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (width != (int)drv_ctx.video_resolution.frame_width)) {
187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)",
187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                width, drv_ctx.video_resolution.frame_width,
187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                height,drv_ctx.video_resolution.frame_height);
187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        format_changed = 1;
188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.frame_height = height;
188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.frame_width = width;
188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.scan_lines = scan_lines;
188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.stride = stride;
1885fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1886fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (!is_down_scalar_enabled) {
1887fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nLeft = m_extradata_info.output_crop_rect.nLeft;
1888fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nTop = m_extradata_info.output_crop_rect.nTop;
1889fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nWidth = m_extradata_info.output_crop_rect.nWidth;
1890fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nHeight = m_extradata_info.output_crop_rect.nHeight;
189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return format_changed;
189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::is_video_session_supported()
189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE) &&
189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_decoder_capability.max_width = 1280;
190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_decoder_capability.max_height = 720;
190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((drv_ctx.video_resolution.frame_width *
190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height >
190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_width *
190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_height) ||
190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (drv_ctx.video_resolution.frame_width*
191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             drv_ctx.video_resolution.frame_height <
191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             m_decoder_capability.min_width *
191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             m_decoder_capability.min_height)) {
191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR(
191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_width,
191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height,
191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.min_width,
191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.min_height,
191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_width,
192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_height);
192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("video session supported");
192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len)
192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.in_buffer_log && !m_debug.infile) {
193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v",
193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc,
193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263",
193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) ||
194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264",
194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265",
194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) {
195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx",
196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = fopen (m_debug.infile_name, "ab");
196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.infile) {
196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.infile_name[0] = '\0';
196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct ivf_file_header {
197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 signature[4]; //='DKIF';
197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 version         ; //= 0;
197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 headersize      ; //= 32;
197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 FourCC;
197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 width;
197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 height;
197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 rate;
197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 scale;
197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 length;
198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 unused[4];
198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } file_header;
198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset((void *)&file_header,0,sizeof(file_header));
198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[0] = 'D';
198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[1] = 'K';
198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[2] = 'I';
198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[3] = 'F';
198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.version = 0;
198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.headersize = 32;
199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (drv_ctx.decoder_format) {
199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case VDEC_CODECTYPE_VP8:
199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    file_header.FourCC = 0x30385056;
199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case VDEC_CODECTYPE_VP9:
199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    file_header.FourCC = 0x30395056;
199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("unsupported format for VP8/VP9");
199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite((const char *)&file_header,
200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof(file_header),1,m_debug.infile);
200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         }
200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile && buffer_addr && buffer_len) {
200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vpx_ivf_frame_header {
200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 framesize;
201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 timestamp_lo;
201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 timestamp_hi;
201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } vpx_frame_header;
201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.framesize = buffer_len;
201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Currently FW doesn't use timestamp values */
201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.timestamp_lo = 0;
201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.timestamp_hi = 0;
201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite((const char *)&vpx_frame_header,
201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof(vpx_frame_header),1,m_debug.infile);
201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fwrite(buffer_addr, buffer_len, 1, m_debug.infile);
202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) {
202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int buf_index = 0;
202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *temp = NULL;
202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_buffer_log && !m_debug.outfile && buffer->nFilledLen) {
203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv",
203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = fopen (m_debug.outfile_name, "ab");
203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.outfile) {
203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc);
203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.outfile_name[0] = '\0';
203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file
204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        && buffer->nFilledLen) {
204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta",
204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta",
204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab");
204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab");
204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) {
204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc);
205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.out_ymetafile_name[0] = '\0';
205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.out_uvmetafile_name[0] = '\0';
205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((!m_debug.outfile && !m_debug.out_ymeta_file) || !buffer || !buffer->nFilledLen)
205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_index = buffer - m_out_mem_ptr;
206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2062b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC ||
2063b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)",
206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height);
206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_debug.outfile)
206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile);
207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) {
207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned int width = 0, height = 0;
207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned int y_plane, y_meta_plane;
207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int y_stride = 0, y_sclines = 0;
207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0;
2076b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            int color_fmt = (drv_ctx.output_format== VDEC_YUV_FORMAT_NV12_UBWC)? COLOR_FMT_NV12_UBWC: COLOR_FMT_NV12_BPP10_UBWC;
207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int i;
207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int bytes_written = 0;
207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            width = drv_ctx.video_resolution.frame_width;
208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            height = drv_ctx.video_resolution.frame_height;
208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_stride = VENUS_Y_STRIDE(color_fmt, width);
208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096);
209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i = 0; i < y_meta_scanlines; i++) {
209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file);
209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 temp += y_meta_stride;
209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane;
209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for(i = 0; i < uv_meta_scanlines; i++) {
210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file);
210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp += uv_meta_stride;
210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
2104b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride = drv_ctx.video_resolution.stride;
210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int scanlines = drv_ctx.video_resolution.scan_lines;
210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_smoothstreaming_mode) {
210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = drv_ctx.video_resolution.frame_width;
210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = drv_ctx.video_resolution.frame_height;
211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned i;
211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)",
211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height, stride, scanlines);
211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int bytes_written = 0;
211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             temp += stride;
212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride_c = stride;
212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp += stride_c;
212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentInit
213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Initialize the component.
213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ctxt -- Context information related to the self.
214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   id   -- Event identifier. This could be any of the following:
214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   1. Command completion event
214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   2. Buffer done callback event
214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   3. Frame done callback event
214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_fmtdesc fdesc;
215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_frmsizeenum frmsize;
215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int   alignment = 0,buffer_size = 0;
216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fds[2];
216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int r,ret=0;
216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool codec_ambiguous = false;
216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STRING device_name = (OMX_STRING)"/dev/video32";
216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *soc_file = NULL;
216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char buffer[10];
216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char platform_name[PROPERTY_VALUE_MAX];
217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("ro.board.platform", platform_name, "0");
217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(platform_name, "msm8610", 7)) {
217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        device_name = (OMX_STRING)"/dev/video/q6_dec";
217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        is_q6_platform = true;
217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        maxSmoothStreamingWidth = 1280;
217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        maxSmoothStreamingHeight = 720;
217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_thulium_v1 = false;
218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    soc_file = fopen("/sys/devices/soc0/soc_id", "r");
218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (soc_file) {
218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fread(buffer, 1, 4, soc_file);
218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(soc_file);
218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(buffer) == 246) {
218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            soc_file = fopen("/sys/devices/soc0/revision", "r");
218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (soc_file) {
218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fread(buffer, 1, 4, soc_file);
218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fclose(soc_file);
218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (atoi(buffer) == 1) {
219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_thulium_v1 = true;
219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE");
219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*
219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * turn off frame parsing for Android by default.
220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode
220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    arbitrary_bytes = false;
220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (atoi(property_value)) {
220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command");
220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = true;
220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",
221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",
221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2";
222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure",
222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.hevc";
222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure",
222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vc1";
223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.secure",
223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.wmv";
223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.secure",
223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg4";
224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.secure",
224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vp9";
224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (!strncmp(role, "OMX.qcom.video.decoder.vp8.secure",
224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vp8";
225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd);
225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.video_driver_fd < 0) {
225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.frame_rate.fps_denominator = 1;
226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    operating_frame_rate = DEFAULT_FPS;
226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    high_fps = false;
226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = eventfd(0, 0);
226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_poll_efd < 0) {
226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno));
226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = subscribe_to_events(drv_ctx.video_driver_fd);
227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!ret) {
227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        async_thread_created = true;
227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = pthread_create(&async_thread_id,0,async_message_thread,this);
227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        async_thread_created = false;
227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    outputExtradataFile = fopen (output_extradata_filename, "ab");
228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Copy the role information which provides the decoder kind
228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    strlcpy(drv_ctx.kind,role,128);
228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.timestamp_adjust = true;
229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability=V4L2_PIX_FMT_MPEG4;
229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Initialize Start Code for MPEG4*/
229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_MPEG4;
229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_MPEG2;
230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Initialize Start Code for MPEG2*/
230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_MPEG2;
230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("H263 Decoder selected");
231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingH263;
231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_H263;
231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H263;
231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX_311;
232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX;
233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_ambiguous = true;
233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX;
234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_ambiguous = true;
234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability=V4L2_PIX_FMT_H264;
235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingAVC;
235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H264;
235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (is_thulium_v1) {
236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            arbitrary_bytes = true;
236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264");
236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\
236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MVC;
236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_H264_MVC;
236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC;
236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H264;
237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_HEVC;
237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_HEVC;
237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingWMV;
238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VC1;
238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingWMV;
239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VC1;
239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",    \
239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VP8;
240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VP8;
240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingVP8;
240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VP8;
240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",    \
240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VP9;
240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VP9;
241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingVP9;
241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VP9;
241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE dest_color_format;
242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disable_ubwc_mode) {
242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC;
242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC)
242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = (OMX_COLOR_FORMATTYPE)
242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = (OMX_COLOR_FORMATTYPE)
243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.set_color_format(dest_color_format)) {
243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting color format failed");
243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8;
243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_progressive = MSM_VIDC_PIC_STRUCT_PROGRESSIVE;
243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disable_ubwc_mode) {
244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            capture_capability = V4L2_PIX_FMT_NV12;
244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            capture_capability = V4L2_PIX_FMT_NV12_UBWC;
244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_capability cap;
244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to query capabilities");
244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " version = %d, capabilities = %x", cap.driver, cap.card,
245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cap.bus_info, cap.version, cap.capabilities);
245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=0;
245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index=0;
245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fdesc.pixelformat, fdesc.flags);
246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fdesc.index++;
246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index=0;
246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fdesc.pixelformat, fdesc.flags);
246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fdesc.index++;
247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
2471fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nLeft = 0;
2472fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nTop = 0;
2473fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nWidth = 320;
2474fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nHeight = 240;
247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        update_resolution(320, 240, 320, 240);
2476fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set format on output port");
248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Format was successful");
248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_ambiguous) {
248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_DIVX) {
249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control divx_ctrl;
249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ret) {
250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set divx version");
250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR);
251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_conceal_color= atoi(property_value);
251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color);
251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR;
251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = m_conceal_color;
251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret);
251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Get the hardware capabilities
252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset((void *)&frmsize,0,sizeof(frmsize));
252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frmsize.index = 0;
252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frmsize.pixel_format = output_capability;
252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd,
252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VIDIOC_ENUM_FRAMESIZES, &frmsize);
252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to get framesizes");
252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.min_width = frmsize.stepwise.min_width;
253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.max_width = frmsize.stepwise.max_width;
253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.min_height = frmsize.stepwise.min_height;
253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.max_height = frmsize.stepwise.max_height;
253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set format on capture port");
254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE));
254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        framesize.nWidth = drv_ctx.video_resolution.frame_width;
255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        framesize.nHeight = drv_ctx.video_resolution.frame_height;
255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE));
255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rectangle.nWidth = drv_ctx.video_resolution.frame_width;
255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rectangle.nHeight = drv_ctx.video_resolution.frame_height;
255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Format was successful");
255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode) {
255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = 1;
256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (output_capability == V4L2_PIX_FMT_H264_MVC) {
256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT;
256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM;
257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to set MVC buffer layout");
257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (is_thulium_v1) {
257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = enable_smoothstreaming();
257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet != OMX_ErrorNone) {
258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver");
258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               return eRet;
258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Get the Buffer requirements for input and output ports*/
258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode) {
259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.alignment = SECURE_ALIGN;
259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf.alignment = SECURE_ALIGN;
259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.alignment = SZ_4K;
259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf.alignment = SZ_4K;
259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata = 0;
259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.idr_only_decoding = 0;
260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.dec.downscalar_width",property_value,"0");
260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value)) {
260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_width = atoi(property_value);
260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.dec.downscalar_height",property_value,"0");
261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value)) {
261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_height = atoi(property_value);
261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_downscalar_width < m_decoder_capability.min_width ||
261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_height < m_decoder_capability.min_height) {
261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_width = 0;
261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_height = 0;
261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n",
262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_width, m_downscalar_height);
262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.disable.split.mode",property_value,"0");
262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_disable_split_mode = atoi(property_value);
262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("split mode is %s", m_disable_split_mode ? "disabled" : "enabled");
262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_state = OMX_StateLoaded;
262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef DEFAULT_EXTRADATA
263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enable_extradata(DEFAULT_EXTRADATA, true, true);
263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = get_buffer_req(&drv_ctx.ip_buf);
263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size);
263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        get_buffer_req(&drv_ctx.op_buf);
263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC ||
263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nFilledLen = 0;
264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nOffset = 0;
264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (h264_scratch.pBuffer == NULL) {
264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_frame_parser.mutils == NULL) {
265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_frame_parser.mutils = new H264_Utils();
265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_frame_parser.mutils == NULL) {
265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorInsufficientResources;
265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_frame_parser.mutils->initialize_frame_checking_environment();
265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_parser = new h264_stream_parser();
266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!h264_parser) {
266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pipe(fds)) {
266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("pipe creation failed");
267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pipe_in = fds[0];
267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pipe_out = fds[1];
267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            msg_thread_created = true;
267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            r = pthread_create(&msg_thread_id,0,message_thread_dec,this);
267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (r < 0) {
267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("component_init(): message_thread_dec creation failed");
267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                msg_thread_created = false;
268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone) {
268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Component Init Failed");
268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d",
268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_driver_fd);
269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetComponentVersion
269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns the component version.
270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   TBD.
270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_ErrorNone.
270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_component_version
271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp,
271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName,
271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion,
271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion,
271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID
271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel )
271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentName;
272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentVersion;
272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentUUID;
272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* TBD -- Return the proper version */
272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (specVersion) {
272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        specVersion->nVersion = OMX_SPEC_VERSION;
272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommand
273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_COMMANDTYPE cmd,
274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32 param1,
274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR cmdData
275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) cmdData;
275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "to invalid port: %u", (unsigned int)param1);
276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_wait(&m_cmd_lock);
276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command: Command Processed");
276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommand
277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_COMMANDTYPE cmd,
278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32 param1,
278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR cmdData
279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) cmdData;
279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int bFlag = 1,sem_posted = 0,ret=0;
279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state, eState);
280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cmd == OMX_CommandStateSet) {
280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Loaded */
280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_state == OMX_StateLoaded) {
280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateIdle) {
281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //if all buffers are allocated or all ports disabled
281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (allocate_done() ||
281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Skip the event notification
281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Loaded */
282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to WaitForResources */
282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Executing */
283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Pause */
284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Invalid */
284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eState);
285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is IDLE */
286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateIdle) {
286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateLoaded) {
286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (release_done()) {
286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*
286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       Since error is None , we will post an event at the end
286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       of this function definition
286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     */
287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Skip the event notification
287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Executing */
287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state=OMX_StateExecuting;
288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Idle */
288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateIdle) {
288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to WaitForResources */
289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Pause */
290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*To pause the Video core we need to start the driver*/
290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      NULL) < */0) {
290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorHardware;
290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Invalid */
291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /******************************/
292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Executing */
292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /******************************/
292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateExecuting) {
293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Idle */
293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateIdle) {
293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition
293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 */
293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!sem_posted) {
293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_posted = 1;
294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post (&m_cmd_lock);
294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_ALL);
294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Paused */
294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("PAUSE Command Issued");
294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state = OMX_StatePause;
294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Loaded */
295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to WaitForResources */
295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Executing */
296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Invalid */
297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Pause  */
298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StatePause) {
298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Executing */
298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateExecuting) {
298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pause --> Executing");
298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state = OMX_StateExecuting;
299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Idle */
299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateIdle) {
299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pause --> Idle");
299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!sem_posted) {
299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_posted = 1;
300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post (&m_cmd_lock);
300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_ALL);
300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to loaded */
300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> loaded");
300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to WaitForResources */
301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Pause */
302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> Pause");
302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Invalid */
302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> Invalid");
302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is WaitForResources  */
303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateWaitForResources) {
304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Loaded */
304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateLoaded) {
304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to WaitForResources */
304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,
305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Executing */
305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Pause */
306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Invalid */
306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Loaded -
307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               is NOT tested by Khronos TS */
307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /********************************/
308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Current State is Invalid */
308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*******************************/
308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (m_state == OMX_StateInvalid) {
308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* State Transition from Inavlid to any state */
308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || OMX_StateIdle || OMX_StateExecuting
308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || OMX_StatePause || OMX_StateInvalid)) {
308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_EventError,OMX_ErrorInvalidState,\
309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInvalidState;
309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (cmd == OMX_CommandFlush) {
309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        send_codec_config();
309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX ||
310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    param1 == OMX_ALL)) {
310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (android_atomic_add(0, &m_queued_codec_config_count) > 0) {
310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               struct timespec ts;
310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               clock_gettime(CLOCK_REALTIME, &ts);
310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               ts.tv_sec += 2;
310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ",
310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       m_queued_codec_config_count);
310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED);
311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (sem_timedwait(&m_safe_flush, &ts)) {
311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers");
311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED);
311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!sem_posted) {
312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sem_posted = 1;
312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set the Semaphore");
312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sem_post (&m_cmd_lock);
312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            execute_omx_flush(param1);
312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bFlag = 0;
313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ( cmd == OMX_CommandPortEnable) {
313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bEnabled = OMX_TRUE;
313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_state == OMX_StateLoaded &&
313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || allocate_input_done()) {
313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Enable output Port command recieved");
315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bEnabled = OMX_TRUE;
315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_state == OMX_StateLoaded &&
315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || (allocate_output_done())) {
315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* enable/disable downscaling if required */
316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = decide_downscalar();
316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ret) {
316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("decide_downscalar failed\n");
316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (cmd == OMX_CommandPortDisable) {
317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            codec_config_flag = false;
317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bEnabled = OMX_FALSE;
317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    && release_input_done()) {
317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!sem_posted) {
318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_posted = 1;
318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_post (&m_cmd_lock);
318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bEnabled = OMX_FALSE;
319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Disable output Port command recieved");
319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    && release_output_done()) {
319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!sem_posted) {
320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_posted = 1;
320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_post (&m_cmd_lock);
320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone && bFlag) {
322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!sem_posted) {
322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sem_post(&m_cmd_lock);
322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ExecuteOmxFlush
323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Executes the OMX flush.
323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   flushtype - input flush(1)/output flush(0)/ both.
323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane;
324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_decoder_cmd dec;
325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType);
325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_flush_progress = true;
325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* XXX: The driver/hardware does not support flushing of individual ports
326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * in all states. So we pretty much need to flush both ports internally,
326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * we automatically omit sending the FLUSH done for the "opposite" port. */
326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_flush_progress = true;
326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_flush_progress = true;
326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        request_perf_level(VIDC_TURBO);
326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType);
327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = false;
327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*=========================================================================
327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush
328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION
328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at OUTPUT PORT.
328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS
328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone.
328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE
328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false
328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/
329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_output_flush()
329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1 = 0; // Parameter - 1
329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2 = 0; // Parameter - 2
329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident = 0;
329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = true;
329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Generate FBD for all Buffers in the FTBq*/
329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Initiate Output Flush");
330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //reset last render TS
330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(m_last_rendered_TS > 0) {
330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_last_rendered_TS = 0;
330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_ftb_q.m_size) {
330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d",
330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_ftb_q.m_size,pending_output_buffers);
330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.pop_entry(&p1,&p2,&ident);
331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2);
331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == m_fill_output_msg ) {
331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2);
331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1);
331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_flush_progress = false;
331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = LLONG_MAX;
332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*=========================================================================
332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush
332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION
333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT PORT.
333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS
333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone.
333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE
333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false
333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/
333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_input_flush()
334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned       i =0;
334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1 = 0; // Parameter - 1
334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2 = 0; // Parameter - 2
334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident = 0;
334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = true;
334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Generate EBD for all Buffers in the ETBq*/
334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Initiate Input Flush");
334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Check if the Queue is empty");
335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_etb_q.m_size) {
335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.pop_entry(&p1,&p2,&ident);
335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_input_buffers++;
3360b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_BUFFERHEADERTYPE *)p1);
336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    time_stamp_dts.flush_timestamp();
337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if Heap Buffers are to be flushed*/
337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes && !(codec_config_flag)) {
337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Reset all the variables before flusing");
337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.nFilledLen = 0;
337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_count = 0;
337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_count = 0;
337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_ts = LLONG_MAX;
337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_flags = 0;
338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_entries = 0;
338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Initialize parser");
338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.mutils) {
338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_frame_parser.mutils->initialize_frame_checking_environment();
338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (m_input_pending_q.m_size) {
338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&p1,&p2,&ident);
338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame) {
339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame) {
339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen = 0;
339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL,
340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)NULL);
340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = NULL;
340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.flush();
340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec_config_flag) {
340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "is not sent to the driver yet");
340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_flush_progress = false;
341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes) {
341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = LLONG_MAX;
341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_timestamp_list.reset_ts_list();
341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommandEvent
342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Send the event to decoder pipe.  This is needed to generate the callbacks
343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   in decoder thread context.
343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::post_event(unsigned long p1,
344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p2,
344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long id)
344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Just drop messages typically generated by hardware (w/o client request),
344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * if we've reported an error to client. */
344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_error_propogated) {
344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (id) {
344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Dropping message %lx "
345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "since client expected to be in error state", id);
345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* whatever */
345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (id == m_fill_output_msg ||
346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_FBD ||
346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_PORT_RECONFIG ||
346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) {
346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.insert_entry(p1,p2,id);
346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EBD ||
346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY ||
347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) {
347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.insert_entry(p1,p2,id);
347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cmd_q.insert_entry(p1,p2,id);
347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet = true;
347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_message(this, id);
347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!profileLevelType)
348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (profileLevelType->nPortIndex == 0) {
349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
3493d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            profileLevelType->eLevel = OMX_VIDEO_AVCLevel52;
349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 2) {
349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 3) {
350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline;
350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 4) {
350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh;
350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)profileLevelType->nProfileIndex);
350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh;
351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = QOMX_VIDEO_MVCLevel51;
351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain;
352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10;
352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)profileLevelType->nProfileIndex);
352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind);
356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u",
357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          (unsigned int)profileLevelType->nPortIndex);
357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetParameter
358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Get Parameter method implementation
358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Error None if successful.
359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE paramIndex,
359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_PTR     paramData)
359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_parameter:");
360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Param in Invalid State");
360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL) {
360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)paramIndex) {
360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition: {
361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               decide_dpb_buffer_mode(is_down_scalar_enabled);
361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = update_portdef(portDefn);
361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (eRet == OMX_ErrorNone)
361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_port_def = *portDefn;
361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoInit: {
362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *portParamType =
362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nPorts           = 2;
362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nStartPortNumber = 0;
363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat: {
363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                portFmt->nSize             = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE);
364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (0 == portFmt->nPortIndex) {
364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (0 == portFmt->nIndex) {
364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eCompressionFormat = eCompressionFormat;
364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore compression formats");
364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet =  OMX_ErrorNoMore;
364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (1 == portFmt->nPortIndex) {
365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // Distinguish non-surface mode from normal playback use-case based on
365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2"
365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // For non-android, use the default list
365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // Also use default format-list if FLEXIBLE YUV is supported,
365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // as the client negotiates the standard color-format if it needs to
365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    bool useNonSurfaceMode = false;
365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED)
366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE);
366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (is_thulium_v1) {
366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex);
366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat = useNonSurfaceMode ?
366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) :
366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            getPreferredColorFormatDefaultMode(portFmt->nIndex);
366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) {
367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorNoMore;
367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore Color formats");
367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat);
367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (int)portFmt->nPortIndex);
367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorBadPortIndex;
368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /*Component should support this port definition*/
368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamAudioInit: {
368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *audioPortParamType =
368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nPorts           = 0;
369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nStartPortNumber = 0;
369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          /*Component should support this port definition*/
369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamImageInit: {
369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *imagePortParamType =
369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nPorts           = 0;
370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nStartPortNumber = 0;
370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          /*Component should support this port definition*/
370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamOtherInit: {
371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              eRet =OMX_ErrorUnsupportedIndex;
371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole: {
371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role->nSize = sizeof(*comp_role);
372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          paramIndex);
372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          OMX_MAX_STRINGNAME_SIZE);
372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              /* Added for parameter test */
372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt: {
373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PRIORITYMGMTTYPE *priorityMgmType =
373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 (OMX_PRIORITYMGMTTYPE *) paramData;
373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE);
373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         /* Added for parameter test */
374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier: {
374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE);
374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (0 == bufferSupplierType->nPortIndex)
374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else if (1 == bufferSupplierType->nPortIndex)
375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else
375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadPortIndex;
375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc: {
375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x",
376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263: {
376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4: {
377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg2: {
377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelQuerySupported: {
378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = get_supported_profile_level(profileLevelType);
378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams);
379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (secure_mode && !secure_scaling_to_non_secure_opb) {
379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        GRALLOC_USAGE_PRIVATE_UNCACHED);
380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorBadParameter;
380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    break;
381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED
381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexFlexibleYUVDescription: {
381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: describeColorFormat");
381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams);
381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = describeColorFormat(paramData);
381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent: {
382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             struct v4l2_control profile_control, level_control;
382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             switch (drv_ctx.decoder_format) {
382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 case VDEC_CODECTYPE_H264:
382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     break;
383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 default:
383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264");
383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     eRet = OMX_ErrorNotImplemented;
383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     break;
383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) {
383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) {
383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileBaseline;
384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileMain;
384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileExtended;
384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh;
385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh10;
385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh422;
385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA:
385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA:
386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA:
386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA:
386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE:
386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH:
386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA:
386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH:
386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH:
386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH:
386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = OMX_ErrorUnsupportedIndex;
386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) {
387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch ((enum v4l2_mpeg_video_h264_level)level_control.value) {
387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel1;
388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel1b;
388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel11;
388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel12;
388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel13;
389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel2;
389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel21;
389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel22;
390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel3;
390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
390511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel31;
390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel32;
391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel4;
391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel41;
391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
391711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
391811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel42;
391911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
392011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
392111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel5;
392211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
392311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel51;
3925d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                        break;
392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_2:
392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel52;
392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         }
39372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QTIIndexParamVideoClientExtradata:
39382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
39392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
39402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVideoClientExtradata");
39412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
39422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
39432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            pParam->nExtradataSize = VENUS_EXTRADATA_SIZE(4096, 2160);
39442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            pParam->nExtradataAllocSize = pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS;
39452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            eRet = OMX_ErrorNone;
39462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
39472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
3948af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        case OMX_QTIIndexParamDitherControl:
3949af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        {
3950af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL);
3951af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("get_parameter: QOMX_VIDEO_DITHER_CONTROL");
3952af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            QOMX_VIDEO_DITHER_CONTROL *pParam =
3953af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                (QOMX_VIDEO_DITHER_CONTROL *) paramData;
3954af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            pParam->eDitherType = (QOMX_VIDEO_DITHERTYPE) m_dither_config;
3955af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            eRet = OMX_ErrorNone;
3956af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            break;
3957af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        }
395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default: {
395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet =OMX_ErrorUnsupportedIndex;
396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height,
396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.stride,
396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.scan_lines);
397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((params == NULL) ||
398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (params->nativeBuffer == NULL) ||
398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (params->nativeBuffer->handle == NULL) ||
398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            !m_enable_android_native_buffers)
398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_android_native_buffers = OMX_TRUE;
398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private_handle_t *handle = (private_handle_t *)nBuf->handle;
398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *buffer = NULL;
399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = (OMX_U8*)mmap(0, handle->size,
399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buffer == MAP_FAILED) {
399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() {
400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorHardware;
401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_mode = true;
401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::Setparameter
402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Set Parameter method implementation.
402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE paramIndex,
403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR        paramData)
403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret=0;
404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
404211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Set Param in Invalid State");
404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL) {
405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((m_state != OMX_StateLoaded) &&
405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_out_bEnabled == OMX_TRUE) &&
405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_inp_bEnabled == OMX_TRUE)) {
405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Set Param in Invalid State");
405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)paramIndex) {
406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition: {
406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               //been called.
406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (int)portDefn->format.video.nFrameHeight,
407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (int)portDefn->format.video.nFrameWidth);
407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d",
407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                          portDefn->nBufferCountActual);
407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorBadParameter;
407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (OMX_DirOutput == portDefn->eDir) {
407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bool port_format_changed = false;
408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_display_id = portDefn->format.video.pNativeWindow;
408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   unsigned int buffer_size;
408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   /* update output port resolution with client supplied dimensions
408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      in case scaling is enabled, else it follows input resolution set
408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   */
408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   decide_dpb_buffer_mode(is_down_scalar_enabled);
408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (is_down_scalar_enabled) {
408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)",
408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameWidth,
409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameHeight);
409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (portDefn->format.video.nFrameHeight != 0x0 &&
409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->format.video.nFrameWidth != 0x0) {
409311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Get Resolution failed");
409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorHardware;
410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) ||
410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) {
410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   port_format_changed = true;
410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           /* set crop info */
410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nLeft = 0;
410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nTop = 0;
411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nWidth = portDefn->format.video.nFrameWidth;
411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nHeight = portDefn->format.video.nFrameHeight;
411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4113fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nLeft = 0;
4114fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nTop = 0;
4115fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nWidth = rectangle.nWidth;
4116fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nHeight = rectangle.nHeight;
4117fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = is_video_session_supported();
411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (eRet)
412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
41232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           fmt.fmt.pix_mp.height = (unsigned int)portDefn->format.video.nFrameHeight;
41242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           fmt.fmt.pix_mp.width = (unsigned int)portDefn->format.video.nFrameWidth;
412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width);
412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Set Resolution failed");
413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else
413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = get_buffer_req(&drv_ctx.op_buf);
413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (eRet) {
413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (secure_mode) {
414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           struct v4l2_control control;
414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD;
414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id);
414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorHardware;
414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else {
414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               /* This is a workaround for a bug in fw which uses stride
414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                * and slice instead of width and height to check against
414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                * the threshold.
415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                */
415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               OMX_U32 stride, slice;
415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth);
415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight);
415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth);
415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight);
4158b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
4159b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameWidth);
4160b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameHeight);
416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               } else {
416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = portDefn->format.video.nFrameWidth;
416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = portDefn->format.video.nFrameHeight;
416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
416611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice);
416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("Threshold value is %d\n", control.value);
416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (stride * slice <= (OMX_U32)control.value) {
417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   secure_scaling_to_non_secure_opb = true;
417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ");
417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2;
417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   control.value = 1;
417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) {
417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       DEBUG_PRINT_ERROR("Enabling non-secure output2 failed");
417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       eRet = OMX_ErrorUnsupportedSetting;
417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   }
417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (eRet) {
418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)",
418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   } else if (!client_buffers.get_buffer_req(buffer_size)) {
419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Error in getting buffer requirements");
419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   } else if (!port_format_changed) {
419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4196fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                       // Buffer count can change only when port is unallocated
4197fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                       if (m_out_mem_ptr &&
4198fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount ||
4199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) {
4200fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !");
420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorInvalidState;
420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // route updating of buffer requirements via c2d proxy.
420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // Based on whether c2d is enabled, requirements will be handed
420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // to the vidc driver appropriately
420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = client_buffers.set_buffer_req(portDefn->nBufferSize,
421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                portDefn->nBufferCountActual);
421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (eRet == OMX_ErrorNone) {
421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           m_port_def = *portDefn;
421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)",
421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   drv_ctx.op_buf.mincount, (unsigned int)buffer_size,
421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorBadParameter;
421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else if (OMX_DirInput == portDefn->eDir) {
422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bool port_format_changed = false;
422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if ((portDefn->format.video.xFramerate >> 16) > 0 &&
422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // Frame rate only should be set if this is a "known value" or to
422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // activate ts prediction logic (arbitrary mode only) sending input
422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // timestamps with max value (LLONG_MAX).
4228fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                       m_fps_received = portDefn->format.video.xFramerate;
422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u",
423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.xFramerate >> 16);
423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.frame_rate.fps_denominator);
423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (!drv_ctx.frame_rate.fps_numerator) {
423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator = 30;
423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (drv_ctx.frame_rate.fps_denominator)
423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator = (int)
423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.frame_rate.fps_denominator = 1;
424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator;
424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (float)drv_ctx.frame_rate.fps_denominator);
424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_outputparm oparm;
424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       /*XXX: we're providing timing info as seconds per frame rather than frames
424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        * per second.*/
425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_streamparm sparm;
425411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
425511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sparm.parm.output = oparm;
425611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
425711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected");
425811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorHardware;
425911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_perf_control.request_cores(frm_int);
426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (drv_ctx.video_resolution.frame_height !=
426511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           portDefn->format.video.nFrameHeight ||
426611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.video_resolution.frame_width  !=
426711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           portDefn->format.video.nFrameWidth) {
426811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)",
426911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameWidth,
427011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameHeight);
427111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       port_format_changed = true;
427211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 frameWidth = portDefn->format.video.nFrameWidth;
427311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 frameHeight = portDefn->format.video.nFrameHeight;
427411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (frameHeight != 0x0 && frameWidth != 0x0) {
427511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (m_smoothstreaming_mode &&
427611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   ((frameWidth * frameHeight) <
427711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   (m_smoothstreaming_width * m_smoothstreaming_height))) {
427811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frameWidth = m_smoothstreaming_width;
427911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frameHeight = m_smoothstreaming_height;
428011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u "
428111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       "for adaptive-playback/smooth-streaming",
428211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       (unsigned int)frameWidth, (unsigned int)frameHeight);
428311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
4284fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
4285fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nLeft = 0;
4286fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nTop = 0;
4287fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nWidth = frameWidth;
4288fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nHeight = frameHeight;
4289fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           update_resolution(frameWidth, frameHeight,
429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   frameWidth, frameHeight);
429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = is_video_session_supported();
429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (eRet)
429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
42952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           if (is_down_scalar_enabled) {
42962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
42972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
42982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
42992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
43002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = output_capability;
43012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               DEBUG_PRINT_LOW("DS Enabled : height = %d , width = %d",
43022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
43032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
43042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           } else {
43052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
43062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
43072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
43082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
43092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = output_capability;
43102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               DEBUG_PRINT_LOW("DS Disabled : height = %d , width = %d",
43112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
43122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
43132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
43142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = capture_capability;
43152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
43162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           }
431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Set Resolution failed");
431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else {
432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (!is_down_scalar_enabled)
432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   eRet = get_buffer_req(&drv_ctx.op_buf);
432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (m_custom_buffersize.input_buffersize
432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) {
432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d",
432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               m_custom_buffersize.input_buffersize, portDefn->nBufferSize);
433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)",
433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
4339fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                   // Buffer count can change only when port is unallocated
4340fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                   if (m_inp_mem_ptr &&
4341fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount ||
4342fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) {
434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !");
434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorInvalidState;
434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       port_format_changed = true;
435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (~(buffer_prop->alignment - 1));
435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = set_buffer_req(buffer_prop);
435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (false == port_format_changed) {
435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)",
435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size,
436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else if (portDefn->eDir ==  OMX_DirMax) {
436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (int)portDefn->nPortIndex);
436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorBadPortIndex;
436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat: {
437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                int ret=0;
437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                struct v4l2_format fmt;
437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u",
437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex);
437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                memset(&fmt, 0x0, sizeof(struct v4l2_format));
438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (1 == portFmt->nPortIndex) {
438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
43822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
43832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    if (ret < 0) {
43842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                        DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
43852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                        return OMX_ErrorBadParameter;
43862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    }
438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    enum vdec_output_fromat op_format;
438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m ||
439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView ||
439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar ||
439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC;
439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else
439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorBadParameter;
440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
44022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC;
440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12;
440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet == OMX_ErrorNone) {
440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        drv_ctx.output_format = op_format;
441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (ret) {
441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Set output format failed");
441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorUnsupportedSetting;
441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /*TODO: How to handle this case */
441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = get_buffer_req(&drv_ctx.op_buf);
441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet == OMX_ErrorNone) {
442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Set color format failed");
442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorBadParameter;
442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPortDefn: {
443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u",
443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (unsigned int)portFmt->nFramePackingFormat);
443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Input port */
443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (portFmt->nPortIndex == 0) {
4438fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // arbitrary_bytes mode cannot be changed arbitrarily since this controls how:
4439fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                //   - headers are allocated and
4440fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                //   - headers-indices are derived
4441fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // Avoid changing arbitrary_bytes when the port is already allocated
4442fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                if (m_inp_mem_ptr) {
4443fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!");
4444fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    return OMX_ErrorUnsupportedSetting;
4445fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                }
444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (secure_mode || m_input_pass_buffer_fd) {
444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = false;
444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode");
445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorUnsupportedSetting;
445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = true;
445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (portFmt->nFramePackingFormat ==
445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    arbitrary_bytes = false;
445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (atoi(property_value)) {
446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command");
446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = true;
446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u",
446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (unsigned int)portFmt->nFramePackingFormat);
446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorUnsupportedSetting;
446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    m_out_mem_region_smi = OMX_TRUE;
447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        m_use_output_pmem = OMX_TRUE;
447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_MAX_STRINGNAME_SIZE)) {
448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            arbitrary_bytes = true;
448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264");
448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole: {
449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          comp_role->cRole);
449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  if ((m_state == OMX_StateLoaded)&&
449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) {
449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_LOW("Set Parameter called in valid state");
449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else {
450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      return OMX_ErrorIncorrectStateOperation;
450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE);
450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE);
452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE);
452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE);
453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) ||
454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) ||
454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE))
454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ) {
454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) {
454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE);
454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) ||
455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE))
455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ) {
455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE);
455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE);
456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) ||
456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE);
457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else {
458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = OMX_ErrorInvalidComponentName;
458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt: {
458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             if (m_state != OMX_StateLoaded) {
459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 return OMX_ErrorIncorrectStateOperation;
459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             }
459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (unsigned int)priorityMgmtype->nGroupID);
459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (unsigned int)priorityMgmtype->nGroupPriority);
460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier: {
460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           bufferSupplierType->eBufferSupplier);
461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else
461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadPortIndex;
461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc: {
462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d",
462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263: {
463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4: {
463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg2: {
464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamLowLatencyMode: {
464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               struct v4l2_control control;
464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               int rc = 0;
465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam =
465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData;
465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (pParam->bLowLatencyMode) {
465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_HIGH("Enabling DECODE order");
465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   time_stamp_dts.set_timestamp_reorder_mode(false);
465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (rc) {
465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Set picture order failed");
466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorUnsupportedSetting;
466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDecoderPictureOrder: {
466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER);
466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     struct v4l2_control control;
467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     int pic_order,rc=0;
467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             pictureOrder->eOutputPictureOrder);
467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         time_stamp_dts.set_timestamp_reorder_mode(false);
467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     } else
467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         eRet = OMX_ErrorBadParameter;
468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (eRet == OMX_ErrorNone) {
468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         control.value = pic_order;
468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         if (rc) {
468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             DEBUG_PRINT_ERROR("Set picture order failed");
468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             eRet = OMX_ErrorUnsupportedSetting;
468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         }
468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     }
468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamConcealMBMapExtraData:
469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamFrameInfoExtraData:
469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataFrameDimension:
470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false,
470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamInterlaceExtraData:
470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamH264TimeInfo:
471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoFramePackingExtradata:
471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoQPExtraData:
472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_QP_EXTRADATA, false,
472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoInputBitsInfoExtraData:
472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexEnableExtnUserData:
473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZipSEIExtraData:
473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDivx: {
474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          break;
474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPlatformPvt: {
474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN);
474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorUnsupportedSetting;
475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else {
475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_out_pvt_entry_pmem = OMX_TRUE;
475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_use_output_pmem = OMX_TRUE;
475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_control control;
476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       int rc;
476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.idr_only_decoding = 1;
476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (rc) {
477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Set picture order failed");
477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorUnsupportedSetting;
477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (rc) {
477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed");
478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           /*Setting sync frame decoding on driver might change buffer
478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            * requirements so update them here*/
478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (get_buffer_req(&drv_ctx.ip_buf)) {
478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements");
478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (get_buffer_req(&drv_ctx.op_buf)) {
478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
479311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
479411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
479511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
479611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamIndexExtraDataType: {
479711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
479811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
479911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
480011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (extradataIndexType->bEnabled == OMX_TRUE) &&
480111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (extradataIndexType->nPortIndex == 1)) {
480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamEnableSmoothStreaming: {
480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef SMOOTH_STREAMING_DISABLED
481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = enable_smoothstreaming();
481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = OMX_ErrorUnsupportedSetting;
481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  /* Need to allow following two set_parameters even in Idle
481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   * state. This is ANDROID architecture which is not in sync
481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   * with openmax standard. */
482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams);
482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
4823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
4824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!");
4825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                eRet = OMX_ErrorUnsupportedSetting;
4826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                break;
4827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           } else if (m_out_mem_ptr) {
4828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !");
4829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                eRet = OMX_ErrorInvalidState;
4830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                break;
4831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           }
483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (enableNativeBuffers) {
483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               m_enable_android_native_buffers = enableNativeBuffers->enable;
483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if !defined(FLEXYUV_SUPPORTED)
483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (m_enable_android_native_buffers) {
483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               // Use the most-preferred-native-color-format as surface-mode is hinted here
483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) {
483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   DEBUG_PRINT_ERROR("Failed to set native color format!");
484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   eRet = OMX_ErrorUnsupportedSetting;
484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams);
484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = use_android_native_buffer(hComp, paramData);
484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE
485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexAllocateNativeHandle: {
4853fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData;
4855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams);
4856fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4857fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
4858fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!");
4859fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
4860fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
4861fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                } else if (m_inp_mem_ptr) {
4862fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !");
4863fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    eRet = OMX_ErrorInvalidState;
4864fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
4865fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
4866fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (allocateNativeHandleParams != NULL) {
486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    allocate_native_handle = allocateNativeHandleParams->enable;
486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE
487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamEnableTimeStampReorder: {
487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER);
487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (reorder->bEnable == OMX_TRUE) {
487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frm_int =0;
488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               time_stamp_dts.set_timestamp_reorder_mode(true);
488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else
488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               time_stamp_dts.set_timestamp_reorder_mode(false);
488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           time_stamp_dts.set_timestamp_reorder_mode(false);
488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (reorder->bEnable == OMX_TRUE) {
488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent: {
489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (pParam) {
489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         m_profile_lvl.eProfile = pParam->eProfile;
489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         m_profile_lvl.eLevel = pParam->eLevel;
489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     }
489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoMetaBufferMode:
490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            StoreMetaDataInBuffersParams *metabuffer =
490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (StoreMetaDataInBuffersParams *)paramData;
490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!metabuffer) {
490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer);
490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_dynamic_buf_mode) {
491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled");
491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
4918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4919fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    if (m_out_mem_ptr) {
4920fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !");
4921fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        eRet = OMX_ErrorInvalidState;
4922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
4923fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    }
492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //set property dynamic buffer mode to driver.
492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_control control;
492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_format fmt;
492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT;
492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (metabuffer->bStoreMetaData == true) {
492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC;
493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        control.value = V4L2_MPEG_VIDC_VIDEO_STATIC;
493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!rc) {
493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("%s buffer mode",
493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               dynamic_buf_mode = metabuffer->bStoreMetaData;
493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to %s buffer mode",
494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic");
494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = OMX_ErrorUnsupportedSetting;
494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR(
494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u",
494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned int)metabuffer->nPortIndex);
494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDownScalar:
495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR);
495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData;
495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_control control;
495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rc;
495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable);
495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam && pParam->bEnable) {
496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = enable_downscalar();
496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc < 0) {
496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_force_down_scalar = pParam->bEnable;
496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = disable_downscalar();
496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc < 0) {
496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_force_down_scalar = pParam->bEnable;
497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams);
498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback");
498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            PrepareForAdaptivePlaybackParams* pParams =
498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (PrepareForAdaptivePlaybackParams *) paramData;
498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!pParams->bEnable) {
498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorNone;
498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth
498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) {
498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR(
499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]",
499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight,
499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight);
499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorBadParameter;
499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight);
499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR(
499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "Prepare for adaptive playback supported only on output port");
500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVideoPreferAdaptivePlayback:
500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback");
500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable;
501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_dynamic_buf_mode) {
501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set");
501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoCustomBufferSize:
501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE);
501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize");
502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData;
502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT;
502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = pParam->nBufferSize;
502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set input buffer size");
502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = get_buffer_req(&drv_ctx.ip_buf);
503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (eRet == OMX_ErrorNone) {
503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size;
503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d",
503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_custom_buffersize.input_buffersize);
503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to get buffer requirement");
503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port");
504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZIPSEIType:
504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE);
504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType");
504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam =
504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData;
505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable);
505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((QOMX_ENABLETYPE *)paramData)->bEnable);
505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet != OMX_ErrorNone) {
505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata");
505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = enable_extradata(OMX_QP_EXTRADATA, false,
505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (eRet != OMX_ErrorNone) {
506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata");
506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorBadParameter;
506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_extradata = client_extradata & ~OMX_QP_EXTRADATA;
506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamPassInputBufferFd:
507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes) {
507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode");
507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable;
508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pass_buffer_fd)
508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable passing input buffer FD");
508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamForceCompressedForDPB:
508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE);
508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB");
508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam =
508911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData;
509011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_ubwc_mode) {
509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled");
509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!paramData) {
509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL");
509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               eRet = OMX_ErrorBadParameter;
509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_force_compressed_for_dpb = pParam->bEnable;
510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamForceUnCompressedForOPB:
510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB");
510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam =
510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData;
510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!paramData) {
511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL");
511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_disable_ubwc_mode = pParam->bEnable;
511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled");
511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
51182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QTIIndexParamVideoClientExtradata:
51192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
51202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
51212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoClientExtradata");
51222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
51232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
51242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            OMX_U32 extradata_size = VENUS_EXTRADATA_SIZE(4096, 2160);
51252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (pParam->nExtradataSize < extradata_size ||
51262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize < (extradata_size * MAX_NUM_INPUT_OUTPUT_BUFFERS) ||
51272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize < (pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS)) {
51282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: Incorrect buffer size for client extradata");
51292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                eRet = OMX_ErrorBadParameter;
51302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
51312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
51322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (!m_client_extradata_info.set_extradata_info(dup(pParam->nFd),
51332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize, pParam->nExtradataSize)) {
51342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: Setting client extradata failed.");
51352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                eRet = OMX_ErrorBadParameter;
51362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
51372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
51382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
51392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
5140af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        case OMX_QTIIndexParamDitherControl:
5141af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        {
5142af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL);
5143af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamDitherControl");
5144af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            QOMX_VIDEO_DITHER_CONTROL *pParam = (QOMX_VIDEO_DITHER_CONTROL *)paramData;
5145af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("set_parameter: Dither Config from client is: %d", pParam->eDitherType);
5146af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            if (( pParam->eDitherType < QOMX_DITHER_DISABLE ) ||
5147af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                ( pParam->eDitherType > QOMX_DITHER_ALL_COLORSPACE)) {
5148af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                DEBUG_PRINT_ERROR("set_parameter: DitherType outside the range");
5149af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                eRet = OMX_ErrorBadParameter;
5150af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                break;
5151af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            }
5152af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            m_dither_config = is_platform_tp10capture_supported() ? (dither_type)pParam->eDitherType : DITHER_ALL_COLORSPACE;
5153af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            DEBUG_PRINT_LOW("set_parameter: Final Dither Config is: %d", m_dither_config);
5154af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            break;
5155af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        }
515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default: {
515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone)
516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex);
516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetConfig
516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Get Config Method implementation.
517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE configIndex,
518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_PTR     configData)
518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Config in Invalid State");
518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)configIndex) {
519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigInterlaced: {
519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE);
519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (configFmt->nPortIndex == 1) {
519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (configFmt->nIndex == 0) {
519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (configFmt->nIndex == 1) {
520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType =
520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (configFmt->nIndex == 2) {
520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType =
520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore Interlaced formats");
520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorNoMore;
521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (int)configFmt->nPortIndex);
521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorBadPortIndex;
521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES);
522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     decoderinstances->nNumOfInstances = 16;
522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     /*TODO: How to handle this case */
522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoFramePackingArrangement: {
522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                  (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              memcpy(configFmt, &m_frame_pack_arrangement,
523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                  sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          } else {
523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          }
523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          break;
523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigCommonOutputCrop: {
524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE);
524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u",
524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        rectangle.nLeft, rectangle.nTop,
524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        rectangle.nWidth, rectangle.nHeight);
524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigPerfLevel: {
524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL);
525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno);
525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorHardware;
525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (eRet == OMX_ErrorNone) {
526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    switch (control.value) {
526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO:
526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo;
526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        default:
526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value);
526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Fall through */
526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL:
526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            perf->ePerfLevel = OMX_QCOM_PerfLevelNominal;
527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
527611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigH264EntropyCodingCabac: {
527711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE);
527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData;
527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_control control;
528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) {
528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264");
528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNotImplemented;
528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) {
528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                coding->bCabac = (OMX_BOOL)
529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC);
529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* We can't query driver at the moment for the cabac mode, so
529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * just use 0xff...f as a place holder for future improvement */
529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                coding->nCabacInitIdc = ~0;
529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedIndex;
529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
5300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_QTIIndexConfigDescribeColorAspects:
5301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        {
5302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5303fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5305fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client");
5306fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal");
5307fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5308fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (params->bRequestingDataSpace) {
5309fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Does not handle dataspace request");
5310fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorUnsupportedSetting;
5311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
5312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) {
5313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_LOW("Updating Client's color aspects with internal");
5314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                memcpy(&(m_client_color_space.sAspects),
5315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        &(m_internal_color_space.sAspects), sizeof(ColorAspects));
5316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                m_internal_color_space.bDataSpaceChanged = OMX_FALSE;
5317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
5318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects));
5319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
5321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5322fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        case OMX_QTIIndexConfigDescribeHDRColorInfo:
5323fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        {
5324fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams);
5325fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData;
5326fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            auto_lock lock(m_hdr_info_client_lock);
5327fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5328fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "GetConfig Client HDR");
5329fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "GetConfig Internal HDR");
5330fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5331fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (m_change_client_hdr_info) {
5332fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_LOW("Updating Client's HDR Info with internal");
5333fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                memcpy(&m_client_hdr_info.sInfo,
5334fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                       &m_internal_hdr_info.sInfo, sizeof(HDRStaticInfo));
5335fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                m_change_client_hdr_info = false;
5336fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
5337fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5338fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            memcpy(&(params->sInfo), &(m_client_hdr_info.sInfo), sizeof(HDRStaticInfo));
5339fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5340fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            break;
5341fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
5342fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        default:
5343fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        {
5344fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
5345fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            eRet = OMX_ErrorBadParameter;
5346fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SetConfig
535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Set Config method implementation
535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE configIndex,
536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR        configData)
536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Config in Invalid State");
537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_VIDEO_CONFIG_NALSIZE *pNal;
537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Set Config Called");
538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (configIndex == OMX_IndexConfigVideoNalSize) {
538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control temp;
538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE);
538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (pNal->nNaluBytes) {
538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 0:
538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 2:
539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 4:
539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorUnsupportedSetting;
539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!arbitrary_bytes) {
540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* In arbitrary bytes mode, the assembler strips out nal size and replaces
540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * with start code, so only need to notify driver in frame by frame mode */
540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorHardware;
540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_length = pNal->nNaluBytes;
541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) {
541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps);
541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (config->bEnabled) {
5421fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if ((config->nFps >> 16) > 0 &&
5422fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        (config->nFps >> 16) <= MAX_SUPPORTED_FPS) {
5423fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    m_fps_received = config->nFps;
542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u",
542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)config->nFps >> 16);
542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.frame_rate.fps_denominator);
542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!drv_ctx.frame_rate.fps_numerator) {
543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator = 30;
543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.frame_rate.fps_denominator) {
543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator = (int)
543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.frame_rate.fps_denominator = 1;
544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator;
544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_outputparm oparm;
544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*XXX: we're providing timing info as seconds per frame rather than frames
544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     * per second.*/
544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_streamparm sparm;
545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sparm.parm.output = oparm;
545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                performance might be affected");
545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        ret = OMX_ErrorHardware;
545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_set_fps = true;
545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Frame rate not supported.");
546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ret = OMX_ErrorUnsupportedSetting;
546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_set_fps = false;
546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (int)config->nPortIndex);
546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = OMX_ErrorBadPortIndex;
547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) {
547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel);
547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (perf->ePerfLevel) {
548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PerfLevelNominal:
548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PerfLevelTurbo:
548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = OMX_ErrorUnsupportedSetting;
549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret == OMX_ErrorNone) {
549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) {
550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config =
550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData;
550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType);
550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE;
550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (config->eDecodeType) {
550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PictypeDecode_I:
550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON;
551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PictypeDecode_IPB:
551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF;
551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret)
552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set picture type decode");
552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexConfigPriority) {
552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData;
552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32);
552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY;
553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (priority->nU32 == 0)
553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE;
553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE;
553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set Priority");
553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = OMX_ErrorUnsupportedSetting;
553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) {
554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData;
554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16);
554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE;
554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = rate->nU32;
554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        operating_frame_rate = rate->nU32 >> 16;
555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = errno == -EBUSY ? OMX_ErrorInsufficientResources :
555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_ErrorUnsupportedSetting;
555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)",
555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno));
555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
5558fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5559fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) {
5560fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5561fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5562fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) {
5563fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true);
5564fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5565fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5566fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(params->sAspects), "Set Config");
5567fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams));
5568fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return ret;
5569fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeHDRColorInfo) {
5570fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams);
5571fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData;
5572fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (!DEFAULT_EXTRADATA & OMX_HDR_COLOR_INFO_EXTRADATA) {
5573fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            ret = enable_extradata(OMX_HDR_COLOR_INFO_EXTRADATA, true, true);
5574fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (ret != OMX_ErrorNone) {
5575fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_ERROR("Failed to enable OMX_HDR_COLOR_INFO_EXTRADATA");
5576fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                return ret;
5577fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
5578fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
5579fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5580fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        print_debug_hdr_color_info(&(params->sInfo), "Set Config HDR");
5581fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        memcpy(&m_client_hdr_info, params, sizeof(DescribeHDRStaticInfoParams));
5582fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return ret;
558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5588fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define extn_equals(param, extn) (!strcmp(param, extn))
558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetExtensionIndex
559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX GetExtensionIndex method implementaion.  <TBD>
559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_STRING      paramName,
560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_INDEXTYPE* indexType)
560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) {
561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) {
561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) {
561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata;
561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) {
561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement;
562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) {
562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData;
562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) {
562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData;
562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) {
562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData;
562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) {
562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) {
563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) {
563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) {
563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE
563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) {
564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle;
564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE
564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) {
564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode;
564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) {
564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) {
565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback;
565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED
565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) {
565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription;
565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) {
566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd;
566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) {
566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB;
566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) {
566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB;
566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) {
566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode;
56672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA)) {
56682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoClientExtradata;
5669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) {
5670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects;
5671fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.describeHDRStaticInfo")) {
5672fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeHDRColorInfo;
567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNotImplemented;
567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetState
568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns the state information back to the caller.<TBD>
568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Error None if everything is successful.
569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_STATETYPE* state)
569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *state = m_state;
569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentTunnelRequest
570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Component Tunnel Request method implementation. <TBD>
570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE  hComp,
571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE        peerComponent,
571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                    peerPort,
572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) peerComponent;
572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) peerPort;
572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) tunnelSetup;
572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseOutputBuffer
573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper function for Use buffer in the input pin
573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_extradata()
574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.extradata_info.buffer_size) {
574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.extradata_info.ion);
575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size, 4096,
575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.extradata_info.ion.ion_alloc_data,
575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size,
576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                PROT_READ|PROT_WRITE, MAP_SHARED,
576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to map extradata memory");
576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.extradata_info.ion);
577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_other_extradata) {
577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size);
577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_other_extradata) {
577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc memory\n");
577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_extradata()
578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.extradata_info.uaddr) {
578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_ion_memory(&drv_ctx.extradata_info.ion);
579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_other_extradata) {
579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_other_extradata);
579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_other_extradata = NULL;
579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_output_buffer(
580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned                         i= 0; // Temporary counter
581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PTR privateAppData = NULL;
581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private_handle_t *handle = NULL;
581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buff = buffer;
581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_output_headers();
582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet == OMX_ErrorNone)
582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_extradata();
582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i >= drv_ctx.op_buf.actualcount) {
583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone)
584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return eRet;
584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_out_mem_ptr + i );
584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pBuffer = NULL;
584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) {
584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enum v4l2_buf_type buf_type;
584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rr = 0;
585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) {
585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr);
585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = true;
585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("STREAMON Successful");
585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enabling Turbo mode");
586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_out_bm_count,i);
586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pAppPrivate = appData;
586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pBuffer = buffer;
586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_enable_android_native_buffers) {
587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_use_android_native_buffers) {
587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                handle = (private_handle_t *)nBuf->handle;
587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = params->pAppPrivate;
587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                handle = (private_handle_t *)buff;
587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!handle) {
588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("handle is invalid");
588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (secure_mode && secure_scaling_to_non_secure_opb) {
588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it",
588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            " expected %u, got %u",
589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.buffer_size = handle->size;
589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_use_android_native_buffers) {
590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buff =  (OMX_U8*)mmap(0, handle->size,
590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (buff == MAP_FAILED) {
590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_)
591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[i].nativehandle = handle;
591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[i].privatehandle = handle;
591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!handle) {
591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].offset = 0;
592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!ouput_egl_buffers && !m_use_output_pmem) {
592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &drv_ctx.op_buf_ion_info[i].fd_ion_data,
593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0);
593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      open (MEM_DEVICE,O_RDWR);
594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          open (MEM_DEVICE,O_RDWR);
595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.op_buf.buffer_size,
596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.op_buf.alignment)) {
596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                PROT_READ|PROT_WRITE, MAP_SHARED,
597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = 0;
598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!appData || !bytes ) {
598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!secure_mode && !buffer) {
598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry ||
599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !pmem_list->nEntries ||
599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_list->entryList->entry;
600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_info->pmem_fd);
600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].mmaped_size =
600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_out_mem_ptr + i );
601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode)
602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sizeof (vdec_bufferpayload));
602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr,
602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd );
602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = i;
603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].length = drv_ctx.op_buf.buffer_size;
603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].data_offset = 0;
603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].data_offset = 0;
604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = plane;
605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = drv_ctx.num_planes;
605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to prepare bufs");
605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enum v4l2_buf_type buf_type;
606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = true;
606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("STREAMON Successful");
606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enabling Turbo mode");
607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_enable_android_native_buffers) {
607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = buff;
608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pAppPrivate = privateAppData;
608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_out_bm_count,i);
608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::use_input_heap_buffers
609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use Buffer Heap allocation method implementation.
609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None , if everything successful.
609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
61117b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
61127b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (secure_mode) {
61137b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode");
61147b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        return OMX_ErrorUndefined;
61157b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    }
61167b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_heap_ptr)
611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.actualcount);
612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_phdr_pmem_ptr)
612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.actualcount);
612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficent memory");
612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_use_buffer = true;
613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt],
614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL, (unsigned)NULL)) {
614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_in_alloc_cnt++;
614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseBuffer
615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use Buffer method implementation.
615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None , if everything successful.
616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_buffer(
616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE error = OMX_ErrorNone;
617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) {
617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer);
617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6185fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
6186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
6187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ensure that use-buffer was called for previous allocation.
6188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // Mix-and-match of useBuffer and allocateBuffer is not allowed
6189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (m_inp_mem_ptr && !input_use_buffer) {
6190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !");
6191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUndefined;
6192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
6194fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = OMX_ErrorBadPortIndex;
619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error);
620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (error == OMX_ErrorNone) {
620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Send the callback now
620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandStateSet,OMX_StateIdle,
620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortEnable,
621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_INPUT_PORT_INDEX,
621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortEnable,
621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_OUTPUT_PORT_INDEX,
621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
622111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
622211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return error;
622311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
622411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
622511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
622611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr[bufferindex].pBuffer)
623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free(m_inp_heap_ptr[bufferindex].pBuffer);
623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_bufferHdr)
623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_input_buffer(pmem_bufferHdr);
623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufferHdr - m_inp_mem_ptr;
624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    auto_lock l(buf_lock);
624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufferHdr->pInputPortPrivate = NULL;
625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) {
625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_setbuffer_cmd setbuffers;
625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof (vdec_bufferpayload));
625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!secure_mode) {
625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("unmap the input buffer size=%u  address = %p",
626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size,
626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].mmaped_size);
6266d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            }
6267d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
6268d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            if (allocate_native_handle){
626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer;
627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_close(nh);
627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_delete(nh);
6272d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            } else {
6273d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                // Close fd for non-secure and secure non-native-handle case
6274d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                close(drv_ctx.ptr_inputbuffer[index].pmem_fd);
627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
6277d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_desc_buffer_ptr[index].buf_addr);
628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_desc_buffer_ptr[index].buf_addr = NULL;
628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_desc_buffer_ptr[index].desc_data_size = 0;
628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufferHdr - m_out_mem_ptr;
630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < drv_ctx.op_buf.actualcount
630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && drv_ctx.ptr_outputbuffer) {
630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index,
630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[index].bufferaddr);
630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_setbuffer_cmd setbuffers;
630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sizeof (vdec_bufferpayload));
631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!dynamic_buf_mode) {
631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (streaming[CAPTURE_PORT] &&
631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) {
631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("STREAMOFF Failed");
631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("STREAMOFF Successful");
632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_enable_android_native_buffers) {
632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[index].mmaped_size);
632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!secure_mode) {
633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[0].pmem_fd);
633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("unmap the ouput buffer size=%u  address = %p",
633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[0].bufferaddr);
634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } //!dynamic_buf_mode
635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_output_done()) {
635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_extradata();
635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE **bufferHdr,
636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32              port,
636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PTR              appData,
636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32              bytes)
636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *input = NULL;
636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char *buf_addr = NULL;
637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned   i = 0;
637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Sanity Check*/
637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL) {
637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_heap_ptr == NULL) {
637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         drv_ctx.ip_buf.actualcount);
638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          drv_ctx.ip_buf.actualcount);
638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) {
638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed ");
638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Find a Free index*/
639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < drv_ctx.ip_buf.actualcount) {
640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buf_addr == NULL) {
640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_inp_heap_ptr + i);
640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input = *bufferHdr;
640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_heap_inp_bm_count,i);
641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pBuffer           = (OMX_U8 *)buf_addr;
641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nVersion.nVersion = OMX_SPEC_VERSION;
641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pAppPrivate       = appData;
641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Add the Buffers to freeq*/
642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i],
642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL, (unsigned)NULL)) {
642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateInputBuffer
643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper function for allocate buffer in the input pin
644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes)
645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *input = NULL;
645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned   i = 0;
646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char *buf_addr = NULL;
646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int pmem_fd = -1;
646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bytes != drv_ctx.ip_buf.buffer_size) {
646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u",
646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size);
647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_mem_ptr) {
647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)",
647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ip_buf.actualcount,
647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)drv_ctx.ip_buf.buffer_size);
647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
647811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_mem_ptr == NULL) {
648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ptr_inputbuffer == NULL) {
648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ip_buf_ion_info == NULL) {
649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
650211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
650311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
650411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
650511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
650611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
650711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
650811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
650911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
651011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
651111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < drv_ctx.ip_buf.actualcount) {
651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_buffer buf;
651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_plane plane;
651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc;
651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Allocate input Buffer");
652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ?
652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED);
652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = open (MEM_DEVICE,O_RDWR);
653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd < 0) {
653411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd == 0) {
653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_fd = open (MEM_DEVICE,O_RDWR);
654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pmem_fd < 0) {
654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.alignment)) {
654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(pmem_fd);
655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_addr = (unsigned char *)mmap(NULL,
655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.buffer_size,
655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buf_addr == MAP_FAILED) {
656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                close(pmem_fd);
656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
656411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_inp_mem_ptr + i);
656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode)
657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].offset = 0;
657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
657911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = i;
658011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.bytesused = 0;
658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.reserved[1] = 0;
658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = &plane;
658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = 1;
659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i,
659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_inputbuffer[i].bufferaddr);
659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to prepare bufs");
659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input = *bufferHdr;
660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_inp_bm_count,i);
660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_native_handle) {
660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/);
660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!nh) {
660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Native handle create failed");
660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd;
661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer = (OMX_U8 *)nh;
661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (secure_mode || m_input_pass_buffer_fd) {
661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*Legacy method, pass ion fd stashed directly in pBuffer*/
661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd;
661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer           = (OMX_U8 *)buf_addr;
661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nVersion.nVersion = OMX_SPEC_VERSION;
662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pAppPrivate       = appData;
662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.disable_dmx) {
662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_desc_buffer(i);
662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateOutputBuffer
664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper fn for AllocateBuffer in the output pin
664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went well.
664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes)
665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)hComp;
665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)port;
666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned                         i= 0; // Temporary counter
666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_device_fd =-1;
666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_allocation_data ion_alloc_data;
666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_fd_data fd_ion_data;
666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)",
667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount,
667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)drv_ctx.op_buf.buffer_size);
667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nBufHdrSize        = 0;
667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformEntrySize = 0;
667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformListSize  = 0;
667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPMEMInfoSize = 0;
667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pmem_fd = -1;
667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned char *pmem_baseaddress = NULL;
668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufHdrSize        = drv_ctx.op_buf.actualcount *
668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_BUFFERHEADERTYPE);
668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformListSize  = drv_ctx.op_buf.actualcount *
669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,
670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPlatformListSize);
670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Allocate output buffers as cached to improve performance of software-reading
670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // of the YUVs. Output buffers are cache-invalidated in driver.
670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // If color-conversion is involved, Only the C2D output buffers are cached, no
670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // need to cache the decoder's output buffers
670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED;
670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_device_fd = alloc_map_ion_memory(
671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment,
671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &ion_alloc_data, &fd_ion_data,
671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (secure_mode && !secure_scaling_to_non_secure_opb) ?
671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SECURE_FLAGS_OUTPUT_BUFFER : cache_flag);
671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ion_device_fd < 0) {
671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = fd_ion_data.fd;
671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
672011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = open (MEM_DEVICE,O_RDWR);
672111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
672211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd < 0) {
672311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
672411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.op_buf.buffer_size);
672511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
672611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
672711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
672811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
672911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.op_buf.actualcount,
673011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.op_buf.alignment)) {
673111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
673211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(pmem_fd);
673311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
673411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
673511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
673611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
673711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_baseaddress = (unsigned char *)mmap(NULL,
673811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (drv_ctx.op_buf.buffer_size *
673911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     drv_ctx.op_buf.actualcount),
674011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
674111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pmem_baseaddress == MAP_FAILED) {
674211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("MMAP failed for Size %u",
674311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.op_buf.buffer_size);
674411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                close(pmem_fd);
674511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
674611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
674711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
674811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
674911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
675011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Alloc mem for platform specific info
675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        char *pPtr=NULL;
675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,1);
675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       calloc (sizeof(struct vdec_bufferpayload),
675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               drv_ctx.op_buf.actualcount);
675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     calloc (sizeof (struct vdec_output_frameinfo),
676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             drv_ctx.op_buf.actualcount);
676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer ");
676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc (sizeof(struct vdec_ion),
677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              drv_ctx.op_buf.actualcount);
677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.op_buf_ion_info) {
677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && drv_ctx.ptr_respbuffer) {
677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[0].mmaped_size =
678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (drv_ctx.op_buf.buffer_size *
678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 drv_ctx.op_buf.actualcount);
678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufHdr          =  m_out_mem_ptr;
678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_list)  + nPlatformListSize);
678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_entry) + nPlatformEntrySize);
678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformList   = m_platform_list;
678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformEntry  = m_platform_entry;
679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPMEMInfo       = m_pmem_info;
679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Settting the entire storage nicely
679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Set the values when we determine the right HxW param
680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nAllocLen          = bytes;
680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nFilledLen         = 0;
680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pAppPrivate        = appData;
680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Platform specific PMEM Information
680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform Entry
680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->entry      = pPMEMInfo;
681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform List
681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->nEntries    = 1;
681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->entryList   = pPlatformEntry;
681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Keep pBuffer NULL till vdec is opened
681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pBuffer            = NULL;
681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOffset            = 0;
681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->pmem_fd = -1;
681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pPlatformPrivate = pPlatformList;
682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].pmem_fd = pmem_fd;
682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Create a mapping between buffers*/
683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    &drv_ctx.ptr_outputbuffer[i];
683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr =
683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p",
684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_fd, (unsigned int)drv_ctx.ptr_outputbuffer[i].offset,
684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Move the buffer and buffer header pointers
684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr++;
684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo++;
684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry++;
684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList++;
684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr, pPtr);
685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_out_mem_ptr) {
685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_out_mem_ptr);
685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr = NULL;
685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pPtr) {
685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(pPtr);
685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPtr = NULL;
685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_outputbuffer) {
686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_outputbuffer);
686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer = NULL;
686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_respbuffer) {
686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_respbuffer);
686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer = NULL;
686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.op_buf_ion_info) {
687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free o/p ion context");
687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.op_buf_ion_info);
687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info = NULL;
687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
687511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet =  OMX_ErrorInsufficientResources;
687611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
687711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet == OMX_ErrorNone)
687811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_extradata();
687911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
688011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
688111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
688211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
688311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
688411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
688511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
688611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
688711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
688811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
688911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i < drv_ctx.op_buf.actualcount) {
689011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_buffer buf;
689111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_plane plane[VIDEO_MAX_PLANES];
689211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rc;
689311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
689411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
689511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].buffer_len =
689611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.buffer_size;
689711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
689811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *bufferHdr = (m_out_mem_ptr + i );
689911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (secure_mode) {
690011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
690111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr =
690211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
690311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
690411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
690511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
690611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
690711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
690811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
690911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.index = i;
691011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
691111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.memory = V4L2_MEMORY_USERPTR;
691211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].length = drv_ctx.op_buf.buffer_size;
691311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
691411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
691511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
691611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
691711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
691811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
691911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].data_offset = 0;
692011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
692111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
692211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
692311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
692411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
692511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
692611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
692711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
692811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].data_offset = 0;
692911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (extra_idx >= VIDEO_MAX_PLANES) {
693011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
693111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
693211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
693311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.m.planes = plane;
693411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.length = drv_ctx.num_planes;
693511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
693611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
693711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc) {
693811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*TODO: How to handle this case */
693911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
694011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
694111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
694211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
694311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                enum v4l2_buf_type buf_type;
694411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
694511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
694611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc) {
694711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
694811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
694911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    streaming[CAPTURE_PORT] = true;
695011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("STREAMON Successful");
695111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
695211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
695311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Enabling Turbo mode");
695411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                request_perf_level(VIDC_TURBO);
695511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
695611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
695711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
695811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pAppPrivate = appData;
695911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_out_bm_count,i);
696011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
696111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
696211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer  -- API Call
697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateBuffer
697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                     appData,
698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                       bytes)
699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i = 0;
699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
7001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
7002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ensure that use-buffer was never called.
7003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // Mix-and-match of useBuffer and allocateBuffer is not allowed
7004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (m_inp_mem_ptr && input_use_buffer) {
7005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !");
7006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUndefined;
7007fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (arbitrary_bytes) {
700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
701011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
701111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
701211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
701311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
701411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
701511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                appData,bytes);
701611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
701711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
701811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
701911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
702011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
702111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
702211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_done()) {
702311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
702411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Send the callback now
702511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
702611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandStateSet,OMX_StateIdle,
702711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
702811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
702911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
703011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
703111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
703211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
703311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,
703411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_CORE_INPUT_PORT_INDEX,
703511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
703611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
703711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
703811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
703911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
704011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
704111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,
704211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_CORE_OUTPUT_PORT_INDEX,
704311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
704411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
704511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
704611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
704711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
704811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
704911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
705011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
705111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call
705211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
705311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
705411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::FreeBuffer
705511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
705611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
705711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
705811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
705911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
706011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
706111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
706211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
706311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
706411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
706511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
706611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                 port,
706711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
706811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
706911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
707011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int nPortIndex;
707111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
707211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("In for decoder free_buffer");
707311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
707411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateIdle &&
707511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
707611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
707711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
707811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
707911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port);
708011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
708111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
708211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
708311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
708411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port);
708511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
708611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
708711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(OMX_EventError,
708811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorPortUnpopulated,
708911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EVENT);
709011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
709111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
709211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_state != OMX_StateInvalid) {
709311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
709411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(OMX_EventError,
709511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorPortUnpopulated,
709611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EVENT);
709711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
709811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
709911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
710011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if arbitrary bytes*/
710111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!arbitrary_bytes && !input_use_buffer)
710211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex = buffer - m_inp_mem_ptr;
710311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
710411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex = buffer - m_inp_heap_ptr;
710511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
710611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
710711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.ip_buf.actualcount &&
710811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) {
710911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Clear the bit associated with it.
711011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
711111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
711211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (input_use_buffer == true) {
711311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
711411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
711511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_phdr_pmem_ptr)
711611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
711711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
711811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (arbitrary_bytes) {
711911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_phdr_pmem_ptr)
712011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
712111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    else
712211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_input_buffer(nPortIndex,NULL);
712311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else
712411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer(buffer);
712511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
712611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bPopulated = OMX_FALSE;
712711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(release_input_done())
712811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                release_buffers(this, VDEC_BUFFER_TYPE_INPUT);
712911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*Free the Buffer Header*/
713011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_input_done()) {
713111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
713211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_input_buffer_header();
713311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
713411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
713511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
713611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadPortIndex;
713711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
713811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
713911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
714011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && release_input_done()) {
714111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
714211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
714311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortDisable,
714411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_INPUT_PORT_INDEX,
714511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
714611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
714711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
714811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // check if the buffer is valid
714911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
715011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.op_buf.actualcount &&
715111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) {
715211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
715311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Clear the bit associated with it.
715411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
715511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bPopulated = OMX_FALSE;
715611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_buffers.free_output_buffer (buffer);
715711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
715811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(release_output_done()) {
715911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT);
716011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
716111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_output_done()) {
716211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_output_buffer_header();
716311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
716411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
716511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
716611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadPortIndex;
716711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
716811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
716911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && release_output_done()) {
717011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
717111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
717211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
717311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
717411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
717511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_enable_android_native_buffers) {
717611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
717711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
717811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
717911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
718011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
718111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortDisable,
718211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_OUTPUT_PORT_INDEX,
718311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
718411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
718511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
718611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
718711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
718811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((eRet == OMX_ErrorNone) &&
718911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
719011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_done()) {
719111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Send the callback now
719211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
719311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandStateSet, OMX_StateLoaded,
719411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
719511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
719611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
719711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
719811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
719911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
720011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
720111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
720211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
720311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::EmptyThisBuffer
720411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
720511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
720611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   This routine is used to push the encoded video frames to
720711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   the video decoder.
720811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
720911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
721011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
721111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
721211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
721311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went successful.
721411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
721511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
721611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
721711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
721811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
721911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
722011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
722111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
722211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateExecuting &&
722311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StatePause &&
722411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StateIdle) {
722511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
722611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
722711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
722811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
722911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
723011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
723111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
723211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
723311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
723411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_bEnabled) {
723511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
723611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
723711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
723811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
723911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
724011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex);
724111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
724211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
724311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
724411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
724511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!latency) {
724611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dec_time.stop();
724711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            latency = dec_time.processing_time_us();
724811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dec_time.start();
724911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
725011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
725111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
725211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
725311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufferIndex = buffer - m_inp_heap_ptr;
725411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
725511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (input_use_buffer == true) {
725611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBufferIndex = buffer - m_inp_heap_ptr;
7257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
7258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode");
7259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorBadParameter;
7260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
726111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = &m_inp_mem_ptr[nBufferIndex];
726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u",
726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen);
726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBufferIndex = buffer - m_inp_mem_ptr;
726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = true;
727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* The client should not set this when codec is in arbitrary bytes mode */
728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_input_pass_buffer_fd) {
728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr;
728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)",
728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen);
728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
729011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)hComp,(unsigned long)buffer,
729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB);
729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    time_stamp_dts.insert_timestamp(buffer);
729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
729711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::empty_this_buffer_proxy
730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   This routine is used to push the encoded video frames to
730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   the video decoder.
730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went successful.
731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE  hComp,
731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7317b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("ETB");
731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int push_cnt = 0,i=0;
732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_input_frameinfo frameinfo;
732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload *temp_buffer;
732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_seqheader seq_header;
732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool port_setting_changed = true;
732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Should we generate a Aync error event*/
732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7335fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (nPortIndex >= drv_ctx.ip_buf.actualcount) {
733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPortIndex);
733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
734011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
734111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers++;
7342b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return zero length and not an EOS buffer */
734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
734611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("return zero legth buffer");
734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EBD);
735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (input_flush_progress == true) {
735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Flush in progress return buffer ");
735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EBD);
735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    auto_lock l(buf_lock);
736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!temp_buffer || (temp_buffer -  drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) {
736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* If its first frame, H264 codec and reject is true, then parse the nal
736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       and get the profile. Based on this, reject the clip playback */
736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_reject_avc_1080p_mp) {
737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        first_frame = 1;
737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Parse nal to get the profile");
737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                NALU_TYPE_SPS);
737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_profile = h264_parser->get_profile();
737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = is_video_session_supported();
737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state = OMX_StateInvalid;
738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorNone;
738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7385b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-TS", buffer->nTimeStamp / 1000);
7386b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-size", buffer->nFilledLen);
738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*for use buffer we need to memcpy the data*/
738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer->buffer_len = buffer->nFilledLen;
739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73917b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) {
739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes) {
739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        buffer->nFilledLen);
739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.bufferaddr = temp_buffer->bufferaddr;
740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.client_data = (void *) buffer;
740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.datalen = temp_buffer->buffer_len;
740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.flags = 0;
740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.offset = buffer->nOffset;
741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.pmem_fd = temp_buffer->pmem_fd;
741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.pmem_offset = temp_buffer->offset;
741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.timestamp = buffer->nTimeStamp;
741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ETB: dmx enabled");
741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_demux_entries == 0) {
741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extract_demux_addr_offsets(buffer);
741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries);
742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        handle_demux_data(buffer);
742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_addr = NULL;
742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_size = 0;
742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes) {
742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= buffer->nFlags;
742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (arbitrary_bytes) {
743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_timestamp_list.insert_ts(buffer->nTimeStamp);
743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_timestamp_list.insert_ts(buffer->nTimeStamp);
743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len);
744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.nFilledLen = 0;
745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_count = 0;
745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_count = 0;
745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.mutils)
745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_frame_parser.mutils->initialize_frame_checking_environment();
745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.flush();
746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_ts = LLONG_MAX;
746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_flags = 0;
746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_entries = 0;
746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane;
746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&buf, 0, sizeof(buf));
746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&plane, 0, sizeof(plane));
746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long  print_count;
747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = nPortIndex;
747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.bytesused = temp_buffer->buffer_len;
748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.length = drv_ctx.ip_buf.buffer_size;
748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)temp_buffer->offset;
748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.reserved[0] = temp_buffer->pmem_fd;
748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.reserved[1] = temp_buffer->offset;
748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.data_offset = 0;
748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = &plane;
748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = 1;
748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frameinfo.timestamp >= LLONG_MAX) {
748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //assumption is that timestamp is in milliseconds
749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Increment codec_config buffer counter");
749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        android_atomic_inc(&m_queued_codec_config_count);
750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver, send ETB back to client");
750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone(hComp, m_app_data, buffer);
750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorHardware;
750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = false;
751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[OUTPUT_PORT]) {
751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_buf_type buf_type;
751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret,r;
751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!ret) {
752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            streaming[OUTPUT_PORT] = true;
752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (errno == EBUSY) {
752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD");
752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)",
753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frameinfo.bufferaddr, (long long)frameinfo.timestamp,
753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)frameinfo.datalen);
753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::FillThisBuffer
754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL client uses this method to release the frame buffer
754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   after displaying them.
754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateExecuting &&
756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StatePause &&
756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StateIdle) {
756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTB in Invalid State");
756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_bEnabled) {
756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        private_handle_t *handle = NULL;
757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct VideoDecoderOutputMetaData *meta;
757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int nPortIndex = 0;
757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!buffer || !buffer->pBuffer) {
757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer);
758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
758211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //get the buffer type and fd info
758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer;
758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        handle = (private_handle_t *)meta->pHandle;
758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle);
758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!handle) {
758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle);
759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF
759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.op_buf.actualcount &&
759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd;
759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer;
759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           //Store private handle from GraphicBuffer
760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[nPortIndex].privatehandle = handle;
760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[nPortIndex].nativehandle = handle;
760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex);
760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite
760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //this with a more sane size so that we don't compensate in rest of code
760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //We'll restore this size later on, so that it's transparent to client
761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nAllocLen = handle->size;
761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (handle->flags & private_handle_t::PRIV_FLAGS_DISP_CONSUMER) {
761411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_is_display_session = true;
761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_is_display_session = false;
761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: m_is_display_session = %d", __func__, m_is_display_session);
761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf.buffer_size = handle->size;
762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer - client_buffers.get_il_buf_hdr();
762411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL ||
762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (nPortIndex >= drv_ctx.op_buf.actualcount)) {
762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex, drv_ctx.op_buf.actualcount);
762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex);
763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg);
763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::fill_this_buffer_proxy
764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL client uses this method to release the frame buffer
764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   after displaying them.
764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
764811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE        hComp,
765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7659b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("FTB");
766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE nRet = OMX_ErrorNone;
766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_fillbuffer_cmd fillbuffer;
766411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) {
767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
767111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex, drv_ctx.op_buf.actualcount);
767211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
767311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
767411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
767511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
767611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufferAdd, bufferAdd->pBuffer);
767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Return back the output buffer to client*/
767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true || in_reconfig) {
767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone (hComp,m_app_data,buffer);
768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0;
768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen;
768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_ref_add(nPortIndex);
768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen;
769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers++;
7693b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buffer) {
769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("err: client_buffer ptr invalid");
769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return OMX_ErrorBadParameter;
769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ptr_respbuffer) {
770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone (hComp,m_app_data,buffer);
770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pending_output_buffers--;
7709b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&buf, 0, sizeof(buf));
771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int extra_idx = 0;
771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = nPortIndex;
772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].bytesused = buffer->nFilledLen;
772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].length = buffer->nAllocLen;
772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].m.userptr =
772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].data_offset = 0;
773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].bytesused = 0;
773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].data_offset = 0;
774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra_idx >= VIDEO_MAX_PLANES) {
774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = plane;
774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = drv_ctx.num_planes;
774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d",
774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress);
774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf to driver, send FTB back to client");
775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone(hComp, m_app_data, buffer);
775611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
775711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelreturn OMX_ErrorNone;
775811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SetCallbacks
776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Set the callbacks.
776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_CALLBACKTYPE* callbacks,
777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR             appData)
777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cb       = *callbacks;
778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EventHandler,m_cb.FillBufferDone);
778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_app_data =    appData;
778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentDeInit
778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Destroys the component and release memory allocated to the heap.
779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void) hComp;
780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i = 0;
780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_StateLoaded != m_state) {
780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state);
780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if the output buffers have to be cleaned up*/
781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Output Memory");
781611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_out_bm_count, i)) {
781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR(&m_out_bm_count, i);
781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_buffers.free_output_buffer (&m_out_mem_ptr[i]);
782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
782211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_output_done()) {
782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if the input buffers have to be cleaned up*/
783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr || m_inp_heap_ptr) {
783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Input Memory");
783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR(&m_inp_bm_count, i);
783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_inp_mem_ptr)
783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer (i,&m_inp_mem_ptr[i]);
784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer (i,NULL);
784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_input_done()) {
784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    free_input_buffer_header();
785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    free_output_buffer_header();
785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer) {
785211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(h264_scratch.pBuffer);
785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.pBuffer = NULL;
785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_parser) {
785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete h264_parser;
785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_parser = NULL;
785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_frame_parser.mutils) {
786211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free utils parser");
786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete (m_frame_parser.mutils);
786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.mutils = NULL;
786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_platform_list) {
786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_platform_list);
786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_platform_list = NULL;
787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_vendor_config.pData) {
787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_vendor_config.pData);
787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_vendor_config.pData = NULL;
787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Reset counters in mesg queues
787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_size=0;
787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_size=0;
787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_size=0;
788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_read = m_ftb_q.m_write =0;
788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_read = m_cmd_q.m_write =0;
788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_read = m_etb_q.m_write =0;
788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_timestamp_list.reset_ts_list();
788611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // NULL);
789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Close the driver instance");
789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile) {
789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.infile);
789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = NULL;
789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.outfile) {
789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.outfile);
790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = NULL;
790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
790211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_ymeta_file) {
790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.out_ymeta_file);
790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_ymeta_file = NULL;
790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_uvmeta_file) {
790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.out_uvmeta_file);
790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_uvmeta_file = NULL;
790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (outputExtradataFile)
791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose (outputExtradataFile);
791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete");
791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseEGLImage
792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use EGL Image method implementation <TBD>.
792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Not Implemented error.
793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE     hComp,
793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                     appData,
793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN void*                      eglImage)
793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) appData;
793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EGLint fd = -1, offset = 0,pmemPtr = 0;
794611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fd = -1, offset = 0;
794811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("use EGL image support for decoder");
795011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
795111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid EGL image");
795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_display_id == NULL) {
795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eglGetProcAddress("eglQueryImageKHR");
796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd);
796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset);
796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr);
796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //with OMX test app
796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct temp_egl {
796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pmem_fd;
796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int offset;
796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct temp_egl *temp_egl_id = NULL;
796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void * pmemPtr = (void *) eglImage;
797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_egl_id = (struct temp_egl *)eglImage;
797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_egl_id != NULL) {
797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = temp_egl_id->pmem_fd;
797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        offset = temp_egl_id->offset;
797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_info.pmem_fd = (OMX_U32) fd;
798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_info.offset = (OMX_U32) offset;
798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_entry.entry = (void *) &pmem_info;
798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_list.entryList = &pmem_entry;
798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_list.nEntries = 1;
798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers = true;
798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_U8 *)pmemPtr)) {
799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentRoleEnum
799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Component Role Enum method implementation.
800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything is successful.
800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_U8*        role,
801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32        index)
801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
802311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
802411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
802511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
802611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
802711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
802811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
802911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
803011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
803111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
803211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
803311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
803411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
803511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
803611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
803711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
803811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
803911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
804011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
804111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
804211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) {
804311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
804411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
804511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
804611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
804711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
804811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
804911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
805011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
805111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
805211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
805311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
805411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
805511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
805611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
805711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
805811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
805911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
806011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
806111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
806211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
806311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
806411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
806511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
806611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
806711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
806811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
806911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s", role);
807011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
807111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
807211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
807311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
807411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
807511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
807611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ) {
807711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
807811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
807911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
808011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
808111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
808211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
808311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
808411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
808511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
808611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
808711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
808811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
808911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
809011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
809111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
809211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
809311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
809411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
809511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
809611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
809711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
809811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
809911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
810011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
810111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
810211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
810311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
810411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
810511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
810611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
810711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
810811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
810911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
811111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
811211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateDone
811311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
811511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if entire buffer pool is allocated by IL Client or not.
811611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Need this to move to IDLE state.
811711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
811911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
812011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
812111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
812211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
812311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
812411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
812511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_done(void)
812611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
812711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
812811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet_In = false;
812911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet_Out = false;
813011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
813111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet_In = allocate_input_done();
813211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet_Out = allocate_output_done();
813311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
813411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bRet_In && bRet_Out) {
813511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
813611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
813711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
813811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
813911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
814011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
814111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
814211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateInputDone
814311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
814411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
814511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if I/P buffer pool is allocated by IL Client or not.
814611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
814711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
814811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
814911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
815011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
815111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
815211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
815311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
815411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_input_done(void)
815511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
815611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
815711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0;
815811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
815911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr == NULL) {
816011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bRet;
816111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
816211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr ) {
816311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; i<drv_ctx.ip_buf.actualcount; i++) {
816411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
816511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
816611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
816711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
816811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
816911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i == drv_ctx.ip_buf.actualcount) {
817011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
817111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
817211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
817311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
817411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_bPopulated = OMX_TRUE;
817511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
817611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
817711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
817811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
817911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
818011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateOutputDone
818111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
818211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
818311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if entire O/P buffer pool is allocated by IL Client or not.
818411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
818511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
818611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
818711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
818811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
818911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
819011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
819111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
819211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_output_done(void)
819311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
819411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
819511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned j=0;
819611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
819711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr == NULL) {
819811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bRet;
819911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
820011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
820211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j < drv_ctx.op_buf.actualcount; j++) {
820311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
820411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
820511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
820611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
820711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
820811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (j == drv_ctx.op_buf.actualcount) {
821011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
821111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
821211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_bEnabled)
821311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bPopulated = OMX_TRUE;
821411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
821511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
821611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
821711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
821811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
821911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
822011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
822111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseDone
822211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
822311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
822411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
822511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
822611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
822711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
822811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
822911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
823011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
823111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
823211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
823311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_done(void)
823411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
823511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
823611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
823711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (release_input_done()) {
823811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_output_done()) {
823911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
824011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
824111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
824211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
824311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
824411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
824511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
824611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
824711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
824811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseOutputDone
824911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
825011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
825111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
825211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
825311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
825411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
825511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
825611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
825711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
825811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
825911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
826011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_output_done(void)
826111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
826211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
826311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0,j=0;
826411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
826511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr);
826611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
826711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j < drv_ctx.op_buf.actualcount ; j++) {
826811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
826911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
827011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
827111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
827211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (j == drv_ctx.op_buf.actualcount) {
827311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bm_count = 0;
827411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
827511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
827611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
827711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_bm_count = 0;
827811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
827911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
828011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
828111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
828211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
828311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
828411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseInputDone
828511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
828611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
828711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
828811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
828911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
829011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
829111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
829211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
829311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
829411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
829511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
829611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_input_done(void)
829711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
829811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
829911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0,j=0;
830011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
830211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr) {
830311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j<drv_ctx.ip_buf.actualcount; j++) {
830411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
830511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
830611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
830711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
830811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (j==drv_ctx.ip_buf.actualcount) {
830911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
831011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
831111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
831211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
831311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
831411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
831511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
831611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
831711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
831811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE * buffer)
831911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8320b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("FBD");
832111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
832211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) {
832311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
832411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
832511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (output_flush_progress) {
832611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
832711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
832811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nTimeStamp = 0;
832911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
833011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
833111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
833211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
833311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
833411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_extradata) {
833511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
833611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
833711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received");
833811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
833911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
834011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
834211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
834311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
834411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
834511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
834611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
834711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld",
835011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp);
835111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers --;
8352b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
835311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
835411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
835511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Output EOS has been reached");
835611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!output_flush_progress)
835711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event((unsigned)NULL, (unsigned)NULL,
835811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EOS_DONE);
835911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
836011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame) {
836111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
836211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
836311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
836411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame) {
836511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen = 0;
836611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL,
836711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL);
836811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = NULL;
836911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
837011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
837111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
837211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
837311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (outputExtradataFile) {
837411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int buf_index = buffer - m_out_mem_ptr;
837511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr);
837611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
837711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
837811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)
837911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3));
838011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
838111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) {
838211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x",
838311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    p_extra->nSize, p_extra->eType);
838411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
838511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
838611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (p_extra->eType == OMX_ExtraDataNone) {
838711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
838811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
838911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
839011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
839111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
839211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
839311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
839411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* For use buffer we need to copy the data */
839511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!output_flush_progress) {
839611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* This is the error check for non-recoverable errros */
839711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_duplicate_ts_valid = true;
839811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
839911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
840011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (output_capability == V4L2_PIX_FMT_MPEG4 ||
840111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_MPEG2 ||
840211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_DIVX ||
840311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_DIVX_311)
840411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            is_duplicate_ts_valid = false;
840511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
840611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((output_capability == V4L2_PIX_FMT_H264 ||
840711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_H264_MVC) &&
840811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                is_interlaced) {
840911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) {
841011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                is_interlaced = false;
841111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
841211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
841311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
841411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen > 0) {
841511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            time_stamp_dts.get_next_timestamp(buffer,
841611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_interlaced && is_duplicate_ts_valid);
841711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_debug_timestamp) {
841811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
841911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_TICKS expected_ts = 0;
842011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_timestamp_list.pop_min_ts(expected_ts);
842111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (is_interlaced && is_duplicate_ts_valid) {
842211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_timestamp_list.pop_min_ts(expected_ts);
842311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
842411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
842511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            buffer->nTimeStamp, expected_ts);
842611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
842711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (buffer->nTimeStamp != expected_ts) {
842811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
842911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
843011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
843111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
843211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
843311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
8434b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FBD-TS", buffer->nTimeStamp / 1000);
843511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
843611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_cb.FillBufferDone) {
843711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen > 0) {
843811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes)
843911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                adjust_timestamp(buffer->nTimeStamp);
844011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
844111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                set_frame_rate(buffer->nTimeStamp);
844211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8443fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            proc_frms++;
844411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (perf_flag) {
8445fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (1 == proc_frms) {
844611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dec_time.stop();
844711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    latency = dec_time.processing_time_us() - latency;
844811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
844911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dec_time.start();
845011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fps_metrics.start();
845111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
845211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
845311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U64 proc_time = 0;
845411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fps_metrics.stop();
845511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    proc_time = fps_metrics.processing_time_us();
845611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)",
845711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)proc_frms, (float)proc_time / 1e6,
845811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (float)(1e6 * proc_frms) / proc_time);
845911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
846011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
846111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
846211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
846311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            prev_ts = LLONG_MAX;
846411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rst_prev_ts = true;
8465fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            proc_frms = 0;
846611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
846711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
846811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
846911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
847011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             buffer->pPlatformPrivate)->entryList->entry;
847111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
847211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *il_buffer;
847311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        il_buffer = client_buffers.get_il_buf_hdr(buffer);
847411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator);
847511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
847611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (il_buffer && m_last_rendered_TS >= 0) {
847711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS);
847811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
847911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Current frame can be send for rendering if
848011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (a) current FPS is <=  60
848111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (b) is the next frame after the frame with TS 0
848211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (c) is the first frame after seek
848311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (d) the delta TS b\w two consecutive frames is > 16 ms
848411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (e) its TS is equal to previous frame TS
848511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (f) if marked EOS
848611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
848711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(current_framerate <= 60 || m_last_rendered_TS == 0 ||
848811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               il_buffer->nTimeStamp == 0 || ts_delta >= 16000 ||
848911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
849011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               m_last_rendered_TS = il_buffer->nTimeStamp;
849111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
849211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               //mark for droping
849311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               buffer->nFilledLen = 0;
849411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
849511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
849611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)",
849711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS,
849811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              il_buffer->nTimeStamp,ts_delta);
849911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
850011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //above code makes sure that delta b\w two consecutive frames is not
850111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //greater than 16ms, slow-mo feature, so cap fps to max 60
850211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (current_framerate > 60 ) {
850311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                current_framerate = 60;
850411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
850511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
850611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
850711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // add current framerate to gralloc meta data
8508af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        if ((buffer->nFilledLen > 0) && m_enable_android_native_buffers && m_out_mem_ptr) {
8509af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            // If valid fps was received, directly send it to display for the 1st fbd.
8510af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel            // Otherwise, calculate fps using fbd timestamps
8511fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            float refresh_rate = m_fps_prev;
8512fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (m_fps_received) {
8513fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (1 == proc_frms) {
8514fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    refresh_rate = m_fps_received / (float)(1<<16);
8515fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
8516fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            } else {
8517af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                // check if dynamic refresh rate change feature enabled or not
8518af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                if (m_drc_enable) {
8519af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // set coarse fps when 2 fbds received and
8520af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // set fps again when 30 fbds received as it should be
8521af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // more accurate than the one set when only 2 fbds received.
8522af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    if (2 == proc_frms || 30 == proc_frms) {
8523af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        if (drv_ctx.frame_rate.fps_denominator) {
8524af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                            refresh_rate = drv_ctx.frame_rate.fps_numerator /
8525af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                                    (float) drv_ctx.frame_rate.fps_denominator;
8526af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        }
8527af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    }
8528af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                } else {
8529af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // calculate and set refresh rate for every frame from second frame onwards
8530af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    // display will assume the default refresh rate for first frame (which is 60 fps)
8531af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    if (m_fps_prev) {
8532af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        if (drv_ctx.frame_rate.fps_denominator) {
8533af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                            refresh_rate = drv_ctx.frame_rate.fps_numerator /
8534af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                                    (float) drv_ctx.frame_rate.fps_denominator;
8535af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                        }
8536af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel                    }
8537fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
8538fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
8539fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (refresh_rate > 60) {
8540fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                refresh_rate = 60;
8541fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
8542fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_LOW("frc set refresh_rate %f, frame %d", refresh_rate, proc_frms);
854311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 buf_index = buffer - m_out_mem_ptr;
854411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
8545fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         UPDATE_REFRESH_RATE, (void*)&refresh_rate);
8546fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_fps_prev = refresh_rate;
854711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
854811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
854911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen && m_enable_android_native_buffers && m_out_mem_ptr) {
855011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 buf_index = buffer - m_out_mem_ptr;
855111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("stereo_output_mode = %d",stereo_output_mode);
855211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
855311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               S3D_FORMAT, (void*)&stereo_output_mode);
855411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
855511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
855611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (il_buffer) {
855711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            log_output_buffers(il_buffer);
855811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dynamic_buf_mode) {
855911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int nPortIndex = 0;
856011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
856111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
856211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Since we're passing around handles, adjust nFilledLen and nAllocLen
856311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // to size of the handle. Do it _after_ log_output_buffers which
856411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // requires the respective sizes to be accurate.
856511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
856611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
856711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer->nFilledLen = buffer->nFilledLen ?
856811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sizeof(struct VideoDecoderOutputMetaData) : 0;
856911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
857011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //Clear graphic buffer handles in dynamic mode
857111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (nPortIndex < drv_ctx.op_buf.actualcount &&
857211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
857311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_buffer[nPortIndex].privatehandle = NULL;
857411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_buffer[nPortIndex].nativehandle = NULL;
857511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
857611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex);
857711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
857811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
857911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
858011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
858111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
858211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
858311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
858411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
858511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
858611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
858711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
858811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
858911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
859011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
859111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_smoothstreaming_mode && m_out_mem_ptr) {
859211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 buf_index = buffer - m_out_mem_ptr;
859311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BufferDim_t dim;
859411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        private_handle_t *private_handle = NULL;
859511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dim.sliceWidth = framesize.nWidth;
859611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dim.sliceHeight = framesize.nHeight;
859711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buf_index < drv_ctx.op_buf.actualcount &&
859811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
859911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[buf_index].privatehandle)
860011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private_handle = native_buffer[buf_index].privatehandle;
860111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (private_handle) {
860211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d",
860311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dim.sliceWidth, dim.sliceHeight);
860411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
860511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
860611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
860711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
860811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
860911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
861011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
861111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
861211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
861311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE* buffer)
861411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8615b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("EBD");
861611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int nBufferIndex = buffer - m_inp_mem_ptr;
861711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8618fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) {
861911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
862011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
862111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
862211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
862311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x",
862411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nFlags);
862511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers--;
8626b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
862711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
862811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
862911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame == NULL && input_flush_progress == false) {
863011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
863111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = buffer;
863211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nFilledLen = 0;
863311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nTimeStamp = LLONG_MAX;
863411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            push_input_buffer (hComp);
863511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
863611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
863711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nFilledLen = 0;
863811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_input_free_q.insert_entry((unsigned long)buffer,
863911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned)NULL, (unsigned)NULL)) {
864011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
864111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
864211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
864311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_cb.EmptyBufferDone) {
864411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
864511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (input_use_buffer == true) {
864611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
864711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
864811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
864911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Restore the FD that we over-wrote in ETB */
865011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pass_buffer_fd) {
865111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd;
865211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
865311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
865411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
865511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
865611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
865711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
865811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
865911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::async_message_process (void *context, void* message)
866011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
866111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec* omx = NULL;
866211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_msginfo *vdec_msg = NULL;
866311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
866411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer *v4l2_buf_ptr = NULL;
866511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane *plane = NULL;
866611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo *output_respbuf = NULL;
866711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc=1;
866811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (context == NULL || message == NULL) {
866911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
867011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
867111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
867211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vdec_msg = (struct vdec_msginfo *)message;
867311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = reinterpret_cast<omx_vdec*>(context);
867511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (vdec_msg->msgcode) {
867711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_ERROR:
867911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
868011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
868111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
868211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
868311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_OVERLOAD:
868411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
868511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
868611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
868711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
868811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_UNSUPPORTED:
868911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
869011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
869111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
869211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
869311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_START_DONE:
869411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
869511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_START_DONE);
869611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
869711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
869811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_STOP_DONE:
869911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
870011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_STOP_DONE);
870111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
870211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
870311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_RESUME_DONE:
870411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
870511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_RESUME_DONE);
870611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
870711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
870811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_PAUSE_DONE:
870911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
871011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
871111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
871211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
871311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
871411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
871511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
871611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
871711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
871811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
871911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
872011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
872111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_INPUT_FLUSHED:
872211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
872311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
872411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
872511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               vdec_msg->msgdata.input_frame_clientdata; */
872611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
872711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
872811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL ||
872911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) {
873011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr = NULL;
873111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg->status_code = VDEC_S_EFATAL;
873211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
873311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
873411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
873511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index;
873611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
873711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
873811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Unsupported input");
873911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
874011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
874111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
874211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
874311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
874411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
874511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
874611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
874711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
874811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Decrement codec_config buffer counter");
874911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                android_atomic_dec(&omx->m_queued_codec_config_count);
875011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) &&
875111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) {
875211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer");
875311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post(&omx->m_safe_flush);
875411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
875511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
875611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME ||
875711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
875811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
875911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
876011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code,
876111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
876211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
876311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
876411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int64_t *timestamp;
876511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            timestamp = (int64_t *) malloc(sizeof(int64_t));
876611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (timestamp) {
876711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
876811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned long)timestamp, vdec_msg->status_code,
876911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
877011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
877111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (long long)vdec_msg->msgdata.output_frame.time_stamp);
877211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
877311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
877411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
877511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
877611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
877711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
877811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL ||
877911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) {
878011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omxhdr = NULL;
878111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               vdec_msg->status_code = VDEC_S_EFATAL;
878211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
878311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
878411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           plane = v4l2_buf_ptr->m.planes;
878511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index;
878611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
878711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (omxhdr && omxhdr->pOutputPortPrivate &&
878811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) &&
878911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
879011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) {
879111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
879211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
879311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
879411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
879511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
879611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFlags = 0;
879711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
879811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
879911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
880011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //rc = -1;
880111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
880211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen) {
880311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
880411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
880511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
880611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
880711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   } else {
880811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
880911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
881011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
881111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
881211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
881311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
881411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
881511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
881611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) {
881711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF;
881811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
881911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) {
882011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY;
882111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d",
882211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd);
882311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
882411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
882511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
882611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !omx->output_flush_progress &&
882711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
882811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) {
882911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       unsigned int index = v4l2_buf_ptr->index;
883011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       unsigned int extra_idx = EXTRADATA_IDX(omx->drv_ctx.num_planes);
883111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->time_stamp_dts.remove_time_stamp(
883211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omxhdr->nTimeStamp,
883311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
883411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               ?true:false);
883511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].bytesused = 0;
883611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].m.userptr =
883711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].bufferaddr -
883811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].offset;
883911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].reserved[0] = omx->drv_ctx.ptr_outputbuffer[index].pmem_fd;
884011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].reserved[1] = omx->drv_ctx.ptr_outputbuffer[index].offset;
884111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].data_offset = 0;
884211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       v4l2_buf_ptr->flags = 0x0;
884311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
884411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].bytesused = 0;
884511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].length = omx->drv_ctx.extradata_info.buffer_size;
884611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].m.userptr = (long unsigned int) (omx->drv_ctx.extradata_info.uaddr + index * omx->drv_ctx.extradata_info.buffer_size);
884711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
884811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].reserved[0] = omx->drv_ctx.extradata_info.ion.fd_ion_data.fd;
884911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
885011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].reserved[1] = v4l2_buf_ptr->index * omx->drv_ctx.extradata_info.buffer_size;
885111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].data_offset = 0;
885211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else if (extra_idx >= VIDEO_MAX_PLANES) {
885311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
885411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           return -1;
885511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
885611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
885711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_LOW("SENDING FTB TO F/W from async_message_process - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d",
885811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], omx->output_flush_progress);
885911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if(ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_QBUF, v4l2_buf_ptr)) {
886011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Failed to queue buffer back to driver: %d, %d, %d", v4l2_buf_ptr->length, v4l2_buf_ptr->m.planes[0].reserved[0], v4l2_buf_ptr->m.planes[1].reserved[0]);
886111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return -1;
886211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
886311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       break;
886411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
886511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
886611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
886711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
886811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
886911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf = (struct vdec_output_frameinfo *)\
887011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            omxhdr->pOutputPortPrivate;
887111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (!output_respbuf) {
887211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("async_message_process: invalid output buf received");
887311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     return -1;
887411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
887511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf->len = vdec_msg->msgdata.output_frame.len;
887611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
887711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
887811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
887911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_I;
888011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
888111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
888211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_P;
888311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
888411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
888511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_B;
888611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
888711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
888811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (vdec_msg->msgdata.output_frame.len) {
888942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                       if (!omx->output_flush_progress && (omxhdr->nFilledLen > 0)) {
889042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // set the default colorspace advised by client, since the bitstream may be
889142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // devoid of colorspace-info.
889242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           if (omx->m_enable_android_native_buffers) {
889342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               ColorSpace_t color_space = ITU_R_601;
889442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
889542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Disabled ?
889642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // WA for VP8. Vp8 encoder does not embed color-info (yet!).
889742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Encoding RGBA results in 601-LR for all resolutions.
889842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // This conflicts with the client't defaults which are based on resolution.
889942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           //   Eg: 720p will be encoded as 601-LR. Client will say 709.
890042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Re-enable this code once vp8 encoder generates color-info and hence the
890142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // decoder will be able to override with the correct source color.
890242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#if 0
890342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               switch (omx->m_client_color_space.sAspects.mPrimaries) {
890442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT601_6_625:
890542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT601_6_525:
890642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
890742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space = omx->m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ?
890842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                               ITU_R_601_FR : ITU_R_601;
890942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
891042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
891142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT709_5:
891242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
891342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space = ITU_R_709;
891442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
891542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
891642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   default:
891742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
891842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
891942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
892042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               }
892142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif
892242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)",
892342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
892442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               omx->set_colorspace_in_handle(color_space, omxhdr - omx->m_out_mem_ptr);
892542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           }
892642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                       }
892742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
892811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_LOW("Processing extradata");
892911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->handle_extradata(omxhdr);
893011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
893111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (omx->m_extradata_info.output_crop_updated) {
893211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_LOW("Read FBD crop from output extra data");
893311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left = omx->m_extradata_info.output_crop_rect.nLeft;
893411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top = omx->m_extradata_info.output_crop_rect.nTop;
893511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right = omx->m_extradata_info.output_crop_rect.nWidth;
893611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom = omx->m_extradata_info.output_crop_rect.nHeight;
893711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_width = omx->m_extradata_info.output_width;
893811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_height = omx->m_extradata_info.output_height;
893911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else {
894011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields");
894111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left = plane[0].reserved[2];
894211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top = plane[0].reserved[3];
894311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right = plane[0].reserved[2] + plane[0].reserved[4];
894411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom = plane[0].reserved[3] + plane[0].reserved[5];
894511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
894611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
8947fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
8948fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           /* Copy these values back to OMX internal variables to make both handlign same*/
8949fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
8950fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
8951fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nTop = vdec_msg->msgdata.output_frame.framesize.top;
8952fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
8953fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
8954fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
8955fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
895611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
895711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
895811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
895911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   vdec_msg->msgdata.output_frame.bufferaddr =
896011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
896111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                   if (vdec_msg->msgdata.output_frame.len)
8963fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                       memcpy(&omx->drv_ctx.frame_size,
8964fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               &vdec_msg->msgdata.output_frame.framesize,
8965fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               sizeof(struct vdec_framesize));
896611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                   DEBUG_PRINT_LOW("[RespBufDone] Fd(%d) Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x)"
8968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                           " FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)",
8969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                           omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd,
897011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp,
897111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags,
897211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned int)vdec_msg->msgdata.output_frame.len,
897311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left,
897411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top,
897511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right,
897611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom);
897711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
897811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* Post event if resolution OR crop changed */
897911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* filled length will be changed if resolution changed */
898011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* Crop parameters can be changed even without resolution change */
898111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen
898211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       && ((omx->prev_n_filled_len != omxhdr->nFilledLen)
898311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left)
898411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top)
898511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right)
898611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom)
898711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width)
898811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) {
898911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
899011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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",
899111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->prev_n_filled_len,
899211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.video_resolution.frame_width,
899311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.video_resolution.frame_height,
899411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top,
899511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom,
899611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width,
899711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_height,
899811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.left,
899911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.top,
900011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.right,
900111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.bottom);
900211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
900311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.video_resolution.frame_width =
900411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_width;
900511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.video_resolution.frame_height =
900611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_height;
900711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
900811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.stride =
900911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width);
901011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
901111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height);
901211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
901311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.stride =
901411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width);
901511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
901611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height);
9017b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                       } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
9018b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                           omx->drv_ctx.video_resolution.stride =
9019b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_width);
9020b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
9021b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_height);
9022b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        }
902311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
902411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX,
902511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_IndexConfigCommonOutputCrop,
902611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
902711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
902811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
902911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen)
903011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->prev_n_filled_len = omxhdr->nFilledLen;
903111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
903211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr && omxhdr->nFilledLen && !omx->high_fps) {
903311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx->request_perf_level(VIDC_NOMINAL);
903411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
903511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omx->output_use_buffer && omxhdr->pBuffer &&
903611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       vdec_msg->msgdata.output_frame.bufferaddr)
903711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       memcpy ( omxhdr->pBuffer, (void *)
903811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
903911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned long)vdec_msg->msgdata.output_frame.offset),
904011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.len);
904111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               } else {
904211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u",
904311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned int)vdec_msg->msgdata.output_frame.len,
904411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omxhdr->nAllocLen, omx->prev_n_filled_len);
904511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFilledLen = 0;
904611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
904711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
904811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code,
904911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_FBD);
905011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
905111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) {
905211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned long)NULL, vdec_msg->status_code,
905311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EOS_DONE);
905411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
905511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
905611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
905711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
905811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
905911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_CONFIG_CHANGED:
906011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Port settings changed");
906111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
906211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
906311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
906411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
906511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!omx->high_fps) {
906611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->request_perf_level(VIDC_NOMINAL);
906711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
906811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
906911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
907011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
907111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
907211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
907311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
907411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
907511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
907611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_HANDLETYPE hComp,
907711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *buffer
907811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
907911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
908011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned address,p2,id;
908111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Empty this arbitrary");
908211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
908311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
908411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
908511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
908611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
908711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld",
908811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp);
908911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
909011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return zero length and not an EOS buffer */
909111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return buffer if input flush in progress */
909211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
909311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
909411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
909511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
909611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
909711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
909811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
909911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (psource_frame == NULL) {
910011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
910111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = buffer;
910211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
910311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        push_input_buffer (hComp);
910411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
910511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
910611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL,
910711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL)) {
910811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
910911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
911011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
911111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
911211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
911311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = false;
911411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
911511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
911611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
911711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
911811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
911911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
912011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address,p2,id;
912111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
912211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
912311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pdest_frame == NULL || psource_frame == NULL) {
912411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if we have a destination buffer*/
912511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame == NULL) {
912611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
912711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_free_q.m_size) {
912811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_free_q.pop_entry(&address,&p2,&id);
912911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
913011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen = 0;
913111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nTimeStamp = LLONG_MAX;
913211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
913311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
913411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
913511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
913611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if we have a destination buffer*/
913711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame == NULL) {
913811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Get a source buffer from the queue");
913911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pending_q.m_size) {
914011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_pending_q.pop_entry(&address,&p2,&id);
914111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
914211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
914311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        psource_frame->nTimeStamp);
914411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
914511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
914611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
914711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
914811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
914911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
915011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
915111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
915211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
915311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_type_parse) {
915411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_MPEG4:
915511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_H263:
915611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_MPEG2:
915711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret =  push_input_sc_codec(hComp);
915811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
915911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_H264:
916011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_h264(hComp);
916111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
916211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_HEVC:
916311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_hevc(hComp);
916411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
916511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_VC1:
916611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_vc1(hComp);
916711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
916811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
916911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
917011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
917111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret != OMX_ErrorNone) {
917211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
917311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx_report_error ();
917411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
917511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
917611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
917711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
917811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
917911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
918011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
918111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
918211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
918311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
918411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
918511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address = 0, p2 = 0, id = 0;
918611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
918711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld",
918811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame,psource_frame->nTimeStamp);
918911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_frame_parser.parse_sc_frame(psource_frame,
919011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame,&partial_frame) == -1) {
919111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
919211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
919311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
919411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
919511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
919611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Frame size %u source %p frame count %d",
919711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count);
919811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
919911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
920011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp);
920111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*First Parsed buffer will have only header Hence skip*/
920211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frame_count == 0) {
920311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
920411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
920511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
920611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    codec_type_parse == CODEC_TYPE_DIVX) {
920711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                mp4StreamType psBits;
920811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
920911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psBits.numBytes = pdest_frame->nFilledLen;
921011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                mp4_headerparser.parseHeader(&psBits);
921111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
921211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
921311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_count++;
921411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
921511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
921611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame->nFilledLen) {
921711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
921811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
921911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
922011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
922111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
922211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
922311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
922411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_input_free_q.m_size) {
922511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_input_free_q.pop_entry(&address,&p2,&id);
922611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
922711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFilledLen = 0;
922811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
922911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
923011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
923111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL,
923211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned)NULL);
923311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
923411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
923511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
923611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
923711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen);
923811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if Destination Buffer is full*/
923911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame->nAllocLen ==
924011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen + pdest_frame->nOffset) {
924111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
924211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
924311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
924411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
924511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
924611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (psource_frame->nFilledLen == 0) {
924711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
924811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
924911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFlags |= psource_frame->nFlags;
9250fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
925111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld",
925211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
925311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
925411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
925511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
925611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
925711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
925811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
925911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
926011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
926111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
926211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
926311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
926411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
926511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
926611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (generate_ebd) {
926711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
926811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
926911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
927011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
927111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pending_q.m_size) {
927211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
927311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_pending_q.pop_entry(&address,&p2,&id);
927411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
927511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
927611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        psource_frame->nTimeStamp);
927711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
927811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
927911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
928011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
928111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
928211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
928311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
928411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
928511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
928611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
928711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
928811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address = 0, p2 = 0, id = 0;
928911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL isNewFrame = OMX_FALSE;
929011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
929111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
929211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer == NULL) {
929311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
929411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
929511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
929611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u "
929711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal);
929811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen);
929911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.nFilledLen && look_ahead_nal) {
930011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
930111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
930211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen) {
930311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
930411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
930511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
930611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
930711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFilledLen = 0;
930811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
930911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
931011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
931111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
931211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
931311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
931411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result
931511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       in EOS flag getting associated with the destination
931611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    */
931711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) &&
931811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen) {
931911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'");
932011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        generate_ebd = OMX_FALSE;
932111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
932211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
932311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nal_length == 0) {
932411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
932511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_sc_frame(psource_frame,
932611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
932711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
932811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
932911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
933011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
933111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
933211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_h264_nallength(psource_frame,
933311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
933411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
933511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
933611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
933711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
933811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
933911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
934011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
934111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
934211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nal_count++;
934311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
934411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFlags = psource_frame->nFlags;
934511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
934611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen);
934711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (h264_scratch.nFilledLen) {
934811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
934911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        NALU_TYPE_SPS);
935011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
935111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
935211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
935311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
935411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
935511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // If timeinfo is present frame info from SEI is already processed
935611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
935711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
935811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
935911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
936011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_count++;
936111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
936211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nTimeStamp = h264_last_au_ts;
936311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFlags = h264_last_au_flags;
936411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef PANSCAN_HDLR
936511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
936611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_parser->update_panscan_data(h264_last_au_ts);
936711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
936811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
936911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
937011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
937111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_ts = h264_scratch.nTimeStamp;
937211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_flags = h264_scratch.nFlags;
937311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
937411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
937511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
937611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (!VALID_TS(h264_last_au_ts))
937711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_last_au_ts = ts_in_sei;
937811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
937911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
938011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else
938111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_ts = LLONG_MAX;
938211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
938311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
938411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!isNewFrame) {
938511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
938611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen) {
938711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u",
938811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)h264_scratch.nFilledLen);
938911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
939011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
939111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
939211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
939311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
939411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nFilledLen = 0;
939511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
939611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
939711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
939811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
939911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if(h264_scratch.nFilledLen) {
940011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                look_ahead_nal = true;
940111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu",
940211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
940311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
940411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
940511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
940611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pdest_frame->nFilledLen == 0) {
940711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
940811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    look_ahead_nal = false;
940911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
941011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen) {
941111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
941211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
941311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
941411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen = 0;
941511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
941611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
941711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
941811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
941911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
942011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
942111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Reset the EOS Flag");
942211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
942311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
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                    if (m_input_free_q.m_size) {
943111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_input_free_q.pop_entry(&address,&p2,&id);
943211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
943311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
943411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen = 0;
943511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags = 0;
943611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = LLONG_MAX;
943711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
943811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
943911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
944011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
944111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
944211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen);
944311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if Destination Buffer is full*/
944411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (h264_scratch.nAllocLen ==
944511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen + h264_scratch.nOffset) {
944611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
944711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
944811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
944911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
945011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
945111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen) {
945211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
945311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
945411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
945511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
945611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
945711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
945811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen) {
945911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(pdest_frame->nFilledLen == 0) {
946011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        /* No residual frame from before, send whatever
946111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         * we have left */
946211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
946311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                h264_scratch.pBuffer, h264_scratch.nFilledLen);
946411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
946511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen = 0;
946611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
946711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
946811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
946911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if(!isNewFrame) {
947011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Have a residual frame, but we know that the
947111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * AU in this frame is belonging to whatever
947211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * frame we had left over.  So append it */
947311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
947411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
947511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
947611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             h264_scratch.nFilledLen = 0;
947711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             if (h264_last_au_ts != LLONG_MAX)
947811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 pdest_frame->nTimeStamp = h264_last_au_ts;
947911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else {
948011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Completely new frame, let's just push what
948111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * we have now.  The resulting EBD would trigger
948211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * another push */
948311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            generate_ebd = OMX_FALSE;
948411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pdest_frame->nTimeStamp = h264_last_au_ts;
948511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_last_au_ts = h264_scratch.nTimeStamp;
948611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
948711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
948811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
948911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
949011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
949111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
949211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
949311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Iff we coalesced two buffers, inherit the flags of both bufs */
949411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(generate_ebd == OMX_TRUE) {
949511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
949611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
949711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
949811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu",
949911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
950011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
950111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
950211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
950311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
950411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!VALID_TS(pdest_frame->nTimeStamp))
950511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = ts_in_sei;
950611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
950711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
950811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
950911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
951011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
951111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
951211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
951311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
951411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
951511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
951611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
951711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
951811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
951911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
952011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
952111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (generate_ebd && !psource_frame->nFilledLen) {
952211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
952311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = NULL;
952411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pending_q.m_size) {
952511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
952611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&address,&p2,&id);
952711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
952811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u",
952911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
953011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
953111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
953211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
953311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
953411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
953511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
953611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
953711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE rc = OMX_ErrorNone;
953811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
953911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
954011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pDst->nTimeStamp == LLONG_MAX) {
954111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pDst->nTimeStamp = pSrc->nTimeStamp;
954211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp);
954311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
954411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pDst->nFilledLen += pSrc->nFilledLen;
954511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pSrc->nFilledLen = 0;
954611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
954711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
954811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = OMX_ErrorBadParameter;
954911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
955011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
955111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
955211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
955311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp)
955411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
955511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
955611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address,p2,id;
955711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL isNewFrame = OMX_FALSE;
955811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
955911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE rc = OMX_ErrorNone;
956011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer == NULL) {
956111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
956211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
956311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
956411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
956511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \
956611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame nFilledLen %u nTimeStamp %lld",
956711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
956811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
956911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.nFilledLen && look_ahead_nal) {
957011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
957111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = copy_buffer(pdest_frame, &h264_scratch);
957211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc != OMX_ErrorNone) {
957311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
957411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
957511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
957611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
957711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nal_length == 0) {
957811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_sc_frame(psource_frame,
957911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
958011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
958111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
958211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
958311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
958411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
958511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_h264_nallength(psource_frame,
958611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
958711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
958811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
958911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
959011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
959111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
959211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
959311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
959411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
959511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nal_count++;
959611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
959711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFlags = psource_frame->nFlags;
959811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
959911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen);
960011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (h264_scratch.nFilledLen) {
960111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame);
960211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_count++;
960311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
960411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
960511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!isNewFrame) {
960611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \
960711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld",
960811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp,
960911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
961011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = copy_buffer(pdest_frame, &h264_scratch);
961111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc != OMX_ErrorNone) {
961211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return rc;
961311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
961411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
961511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                look_ahead_nal = true;
961611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pdest_frame->nFilledLen == 0) {
961711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    look_ahead_nal = false;
961811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
961911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc = copy_buffer(pdest_frame, &h264_scratch);
962011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (rc != OMX_ErrorNone) {
962111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
962211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
962311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
962411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
962511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
962611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
962711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \
962811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            nTimeStamp %lld, look_ahead_nal in h264_scratch \
962911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            nFilledLen %u nTimeStamp %lld",
963011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            frame_count++, (unsigned int)pdest_frame->nFilledLen,
963111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen,
963211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nTimeStamp);
963311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
963411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
963511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
963611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = NULL;
963711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_input_free_q.m_size) {
963811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_input_free_q.pop_entry(&address, &p2, &id);
963911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
964011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame);
964111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen = 0;
964211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags = 0;
964311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = LLONG_MAX;
964411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
964511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
964611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
964711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
964811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
964911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \
965011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \
965111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nFilledLen %u nTimeStamp %lld",
965211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp,
965311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp,
965411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
965511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
965611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (h264_scratch.nAllocLen ==
965711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen + h264_scratch.nOffset) {
965811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
965911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
966011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
966111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
966211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
966311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen) {
966411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame);
966511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
966611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
966711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
966811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = copy_buffer(pdest_frame, &h264_scratch);
966911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( rc != OMX_ErrorNone ) {
967011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return rc;
967111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
967211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
967311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
967411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld",
967511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
967611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
967711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
967811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
967911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
968011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
968111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
968211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
968311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
968411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
968511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
968611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
968711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
968811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
968911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (generate_ebd && !psource_frame->nFilledLen) {
969011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame);
969111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = NULL;
969211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pending_q.m_size) {
969311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&address, &p2, &id);
969411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = (OMX_BUFFERHEADERTYPE *)address;
969511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld",
969611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp);
969711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
969811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
969911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
970011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
970111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
970211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp)
970311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
970411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buf, *pdest;
970511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
970611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 buf_len, dest_len;
970711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
970811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (first_frame == 0) {
970911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        first_frame = 1;
971011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
971111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_vendor_config.pData) {
971211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
971311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf = psource_frame->pBuffer;
971411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_len = psource_frame->nFilledLen;
971511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
971611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
971711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VC1_SP_MP_START_CODE) {
971811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_vc1_profile = VC1_SP_MP_RCV;
971911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
972011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_vc1_profile = VC1_AP;
972111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
972211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
972311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorStreamCorrupt;
972411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
972511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
972611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
972711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nOffset;
972811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
972911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nOffset);
973011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
973111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dest_len < m_vendor_config.nDataSize) {
973211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Destination buffer full");
973311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
973411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
973511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
973611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
973711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
973811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
973911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
974011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
974111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (m_vc1_profile) {
974211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VC1_AP:
974311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
974411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
974511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
974611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
974711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
974811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
974911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
975011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VC1_SP_MP_RCV:
975111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
975211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
975311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
975411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
975511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
975611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
975711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
975811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef USE_ION
975911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
976011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 alignment)
976111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
976211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem_allocation allocation;
976311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocation.size = buffer_size;
976411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocation.align = clip2(alignment);
976511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocation.align < 4096) {
976611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocation.align = 4096;
976711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
976811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
976911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
977011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                allocation.align, allocation.size);
977111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
977211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
977311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
977411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
977511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
977611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
977711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
977811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
977911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_fd_data *fd_data, int flag)
978011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
978111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fd = -EINVAL;
978211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = -EINVAL;
978311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_dev_flag;
978411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion ion_buf_info;
978511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!alloc_data || buffer_size <= 0 || !fd_data) {
978611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
978711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -EINVAL;
978811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
978911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ion_dev_flag = O_RDONLY;
979011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd = open (MEM_DEVICE, ion_dev_flag);
979111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
979211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
979311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return fd;
979411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
979511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
979611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->flags = flag;
979711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->len = buffer_size;
979811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->align = clip2(alignment);
979911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (alloc_data->align < 4096) {
980011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->align = 4096;
980111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
980211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
980311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
980411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (secure_mode && (alloc_data->flags & ION_SECURE)) {
980511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
980611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
980711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
980811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Use secure display cma heap for obvious reasons. */
980911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) {
981011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID);
981111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
981211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
981311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
981411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc || !alloc_data->handle) {
981511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION ALLOC memory failed");
981611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->handle = 0;
981711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(fd);
981811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = -ENOMEM;
981911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return fd;
982011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
982111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd_data->handle = alloc_data->handle;
982211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(fd,ION_IOC_MAP,fd_data);
982311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
982411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION MAP failed ");
982511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.ion_alloc_data = *alloc_data;
982611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.ion_device_fd = fd;
982711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.fd_ion_data = *fd_data;
982811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_ion_memory(&ion_buf_info);
982911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd_data->fd =-1;
983011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = -ENOMEM;
983111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
983211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
983311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return fd;
983411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
983511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
983611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
983711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
983811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
983911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buf_ion_info) {
984011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
984111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
984211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
984311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
984411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &buf_ion_info->ion_alloc_data.handle)) {
984511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION: free failed" );
984611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
984711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(buf_ion_info->ion_device_fd);
984811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->ion_device_fd = -1;
984911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->ion_alloc_data.handle = 0;
985011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->fd_ion_data.fd = -1;
985111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
985211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
985311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_output_buffer_header()
985411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
985511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
985611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_use_buffer = false;
985711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers = false;
985811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
985911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
986011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (m_out_mem_ptr);
986111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = NULL;
986211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
986311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
986411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_platform_list) {
986511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_platform_list);
986611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_platform_list = NULL;
986711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
986811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
986911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_respbuffer) {
987011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_respbuffer);
987111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = NULL;
987211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
987311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_outputbuffer) {
987411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_outputbuffer);
987511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = NULL;
987611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
987711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
987811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.op_buf_ion_info) {
987911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free o/p ion context");
988011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(drv_ctx.op_buf_ion_info);
988111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = NULL;
988211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
988311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
988411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ref_remove();
988511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
988611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
988711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_input_buffer_header()
988811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
988911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_use_buffer = false;
989011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
989111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr) {
989211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free input Heap Pointer");
989311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free (m_inp_heap_ptr);
989411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_heap_ptr = NULL;
989511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
989611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
989711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_phdr_pmem_ptr) {
989811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free input pmem header Pointer");
989911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free (m_phdr_pmem_ptr);
990011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_phdr_pmem_ptr = NULL;
990111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
990211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
990311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr) {
990411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free input pmem Pointer area");
990511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (m_inp_mem_ptr);
990611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = NULL;
990711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
990811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* We just freed all the buffer headers, every thing in m_input_free_q,
990911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * m_input_pending_q, pdest_frame, and psource_frame is now invalid */
991011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_input_free_q.m_size) {
991111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long address, p2, id;
991211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_input_free_q.pop_entry(&address, &p2, &id);
991311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
991411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_input_pending_q.m_size) {
991511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long address, p2, id;
991611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_input_pending_q.pop_entry(&address, &p2, &id);
991711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
991811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pdest_frame = NULL;
991911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    psource_frame = NULL;
992011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_inputbuffer) {
992111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Driver Context pointer");
992211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_inputbuffer);
992311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer = NULL;
992411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
992511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
992611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ip_buf_ion_info) {
992711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free ion context");
992811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(drv_ctx.ip_buf_ion_info);
992911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info = NULL;
993011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
993111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
993211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
993311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
993411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::stream_off(OMX_U32 port)
993511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
993611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_buf_type btype;
993711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
993811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_ports v4l2_port = OUTPUT_PORT;
993911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
994011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
994111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
994211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        v4l2_port = OUTPUT_PORT;
994311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
994411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
994511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        v4l2_port = CAPTURE_PORT;
994611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_ALL) {
994711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
994811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
994911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
995011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc_input)
995111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc_input;
995211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
995311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc_output;
995411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
995511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
995611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[v4l2_port]) {
995711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // already streamed off, warn and move on
995811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
995911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " which is already streamed off", v4l2_port);
996011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
996111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
996211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
996311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
996411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
996511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
996611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
996711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
996811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
996911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
997011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[v4l2_port] = false;
997111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
997211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
997311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
997411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
997511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
997611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
997711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
997811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
997911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
998011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0;
998111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int final_extra_data_size = 0;
998211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
998311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = 0;
998411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
998511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
998611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
998711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = 1;
998811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
998911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
999011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
999111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
999211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
999311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
999411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
999511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
999611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
999711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
999811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
999911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet==OMX_ErrorNone) {
1000011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1000111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1000211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
1000311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
1000411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
1000511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
1000611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1000711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1000811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_res_1080p_or_below = (drv_ctx.video_resolution.frame_width <= 1920 &&
1000911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     drv_ctx.video_resolution.frame_height <= 1088) ||
1001011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (drv_ctx.video_resolution.frame_height <= 1088 &&
1001111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      drv_ctx.video_resolution.frame_width <= 1920);
1001211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1001311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int fps = drv_ctx.frame_rate.fps_numerator / (float)drv_ctx.frame_rate.fps_denominator;
1001411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool fps_above_180 =  (fps >= 180 || operating_frame_rate >= 180) ? true : false;
1001511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool increase_output = (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) && (bufreq.count >= 16);
1001611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1001711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (increase_output && fps_above_180 &&
1001811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            output_capability == V4L2_PIX_FMT_H264 &&
1001911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            is_res_1080p_or_below) {
1002011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            high_fps = true;
1002111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("High fps - fps = %d operating_rate = %d", fps, operating_frame_rate);
1002211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("getbufreq[output]: Increase buffer count (%d) to (%d) to support high fps",
1002311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            bufreq.count, bufreq.count + 10);
1002411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count += 10;
1002511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1002611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
1002711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("(Failed to set updated buffer count to driver");
1002811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
1002911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return eRet;
1003011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1003111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("new buf count = %d set to driver", bufreq.count);
1003211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
1003311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1003411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1003511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->actualcount = bufreq.count;
1003611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->mincount = bufreq.count;
1003711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
1003811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1003911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
1004011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1004111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1004211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1004311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1004411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
1004511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
1004611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
1004711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1004811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
1004911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
1005011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
1005111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
1005211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1005311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int extra_idx = 0;
1005411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1005511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = is_video_session_supported();
1005611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet)
1005711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return eRet;
1005811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1005911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
1006011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = buffer_prop->buffer_size;
1006111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
1006211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
1006311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
1006411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (extra_idx >= VIDEO_MAX_PLANES) {
1006511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
1006611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
1006711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1006811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1006911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default_extra_data_size = VENUS_EXTRADATA_SIZE(
1007011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height,
1007111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_width);
1007211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        final_extra_data_size = extra_data_size > default_extra_data_size ?
1007311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size : default_extra_data_size;
1007411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1007511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) &
1007611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (~(buffer_prop->alignment - 1));
1007711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1007811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size;
1007911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.count = buffer_prop->actualcount;
1008011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.buffer_size = final_extra_data_size;
1008111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
1008211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)",
1008311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size);
1008411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_data_size)
1008511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)",
1008611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size);
1008711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1008811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (in_reconfig) // BufReq will be set to driver when port is disabled
1008911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->buffer_size = buf_size;
1009011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (buf_size != buffer_prop->buffer_size) {
1009111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->buffer_size = buf_size;
1009211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = set_buffer_req(buffer_prop);
1009311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1009411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1009511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)",
1009611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1009711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1009811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1009911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1010011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
1010111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1010211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1010311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned buf_size = 0;
101042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_format fmt, c_fmt;
1010511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
101062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    int ret = 0;
1010711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)",
1010811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1010911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
1011011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buf_size != buffer_prop->buffer_size) {
1011111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)",
1011211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)buffer_prop->buffer_size, buf_size);
1011311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
1011411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1011511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
101162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        memset(&c_fmt, 0x0, sizeof(struct v4l2_format));
1011711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1011811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1011911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
1012011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1012111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1012211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1012311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fmt.fmt.pix_mp.pixelformat = output_capability;
101242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1012511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
101262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
101272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.fmt.pix_mp.pixelformat = capture_capability;
101282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &c_fmt);
101292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
101302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &c_fmt);
1013111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1013211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
1013311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1013411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1013511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
1013611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
1013711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
1013811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1013911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1014011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1014111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
1014211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = buffer_prop->actualcount;
1014311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1014411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1014511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
1014611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1014711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1014811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
1014911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1015011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1015111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet==OMX_ErrorNone) {
1015211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1015311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1015411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1015511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
1015611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
1015711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
1015811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1015911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (bufreq.count < buffer_prop->actualcount) {
1016011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
1016111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
1016211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buffer_prop->actualcount, bufreq.count);
1016311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1016411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1016511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!client_buffers.update_buffer_req()) {
1016611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
1016711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
1016811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1016911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1017011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1017111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1017211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1017311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1017411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_picture_resolution()
1017511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1017611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1017711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1017811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1017911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1018011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
1018111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1018211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1018311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
1018411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!portDefn) {
1018511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1018611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1018711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
1018811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
1018911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1019011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->eDomain    = OMX_PortDomainVideo;
1019111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
1019211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (0 == portDefn->nPortIndex) {
1019311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir =  OMX_DirInput;
1019411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
1019511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
1019611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
1019711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
1019811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eCompressionFormat = eCompressionFormat;
10199fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        //for input port, always report the fps value set by client,
10200fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        //to distinguish whether client got valid fps from parser.
10201fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        portDefn->format.video.xFramerate = m_fps_received;
1020211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bEnabled   = m_inp_bEnabled;
1020311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bPopulated = m_inp_bPopulated;
1020411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1020511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1020611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
102072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1020811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (1 == portDefn->nPortIndex) {
1020911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int buf_size = 0;
1021011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret = 0;
102112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel       if (!is_down_scalar_enabled) {
102122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
102132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
102142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.fmt.pix_mp.pixelformat = capture_capability;
102152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
102162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
102172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel       }
102182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1021911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1022011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       fmt.fmt.pix_mp.pixelformat = capture_capability;
1022111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1022211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (ret) {
1022311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Get Resolution failed");
1022411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           return OMX_ErrorHardware;
1022511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1022611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       drv_ctx.op_buf.buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
1022711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (!client_buffers.update_buffer_req()) {
1022811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
1022911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           return OMX_ErrorHardware;
1023011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1023111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1023211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.get_buffer_req(buf_size)) {
1023311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("update buffer requirements");
1023411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
1023511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1023611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferSize = buf_size;
1023711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir =  OMX_DirOutput;
1023811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
1023911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
1024011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
10241fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (drv_ctx.frame_rate.fps_denominator > 0)
10242fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator /
10243fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format
10244fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        else {
10245fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_ERROR("Error: Divide by zero");
10246fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            return OMX_ErrorBadParameter;
10247fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
1024811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bEnabled   = m_out_bEnabled;
1024911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bPopulated = m_out_bPopulated;
1025011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
1025111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error in getting color format");
1025211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
1025311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1025411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1025511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1025611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1025711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir = OMX_DirMax;
1025811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
1025911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (int)portDefn->nPortIndex);
1026011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
1026111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
102622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
102632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
102642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1026511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
1026611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
1026711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
1026811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
1026911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1027011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
1027111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
1027211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16);
1027311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height;
1027411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1027511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d "
1027611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u",
1027711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nPortIndex,
1027811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameWidth,
1027911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameHeight,
1028011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (int)portDefn->format.video.nStride,
1028111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nSliceHeight,
1028211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.eColorFormat,
1028311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nBufferSize,
1028411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nBufferCountActual);
1028511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1028611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1028711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1028811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1028911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_headers()
1029011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1029111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1029211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
1029311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i= 0;
1029411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1029511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
1029611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
1029711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nBufHdrSize        = 0;
1029811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformEntrySize = 0;
1029911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformListSize  = 0;
1030011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPMEMInfoSize = 0;
1030111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
1030211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
1030311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
1030411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1030511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
1030611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
1030711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufHdrSize        = drv_ctx.op_buf.actualcount *
1030811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_BUFFERHEADERTYPE);
1030911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1031011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
1031111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
1031211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformListSize  = drv_ctx.op_buf.actualcount *
1031311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
1031411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
1031511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
1031611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1031711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
1031811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
1031911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,
1032011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPlatformListSize);
1032111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize,
1032211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_bm_count);
1032311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
1032411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Alloc mem for platform specific info
1032511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        char *pPtr=NULL;
1032611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
1032711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,1);
1032811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
1032911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       calloc (sizeof(struct vdec_bufferpayload),
1033011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               drv_ctx.op_buf.actualcount);
1033111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
1033211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     calloc (sizeof (struct vdec_output_frameinfo),
1033311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             drv_ctx.op_buf.actualcount);
1033411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
1033511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer");
1033611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1033711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1033811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1033911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1034011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
1034111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
1034211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.op_buf_ion_info) {
1034311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
1034411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1034511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1034611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1034711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dynamic_buf_mode) {
1034811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            out_dynamic_list = (struct dynamic_buf_list *) \
1034911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount);
1035011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (out_dynamic_list) {
1035111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++)
1035211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  out_dynamic_list[i].dup_fd = -1;
1035311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1035411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1035511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1035611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
1035711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && drv_ctx.ptr_respbuffer) {
1035811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufHdr          =  m_out_mem_ptr;
1035911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
1036011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
1036111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_list)  + nPlatformListSize);
1036211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
1036311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_entry) + nPlatformEntrySize);
1036411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformList   = m_platform_list;
1036511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformEntry  = m_platform_entry;
1036611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPMEMInfo       = m_pmem_info;
1036711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1036811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
1036911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1037011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Settting the entire storage nicely
1037111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
1037211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr,pPlatformEntry);
1037311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
1037411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
1037511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
1037611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
1037711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Set the values when we determine the right HxW param
1037811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nAllocLen          = 0;
1037911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nFilledLen         = 0;
1038011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pAppPrivate        = NULL;
1038111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
1038211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1038311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->entry      = pPMEMInfo;
1038411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform List
1038511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->nEntries    = 1;
1038611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->entryList   = pPlatformEntry;
1038711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Keep pBuffer NULL till vdec is opened
1038811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pBuffer            = NULL;
1038911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->offset          =  0;
1039011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->pmem_fd = -1;
1039111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pPlatformPrivate = pPlatformList;
1039211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
1039311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1039411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
1039511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1039611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Create a mapping between buffers*/
1039711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
1039811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
1039911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    &drv_ctx.ptr_outputbuffer[i];
1040011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Move the buffer and buffer header pointers
1040111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr++;
1040211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo++;
1040311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry++;
1040411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList++;
1040511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1040611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1040711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
1040811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr, pPtr);
1040911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_out_mem_ptr) {
1041011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_out_mem_ptr);
1041111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr = NULL;
1041211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1041311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pPtr) {
1041411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(pPtr);
1041511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPtr = NULL;
1041611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1041711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_outputbuffer) {
1041811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_outputbuffer);
1041911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer = NULL;
1042011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1042111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_respbuffer) {
1042211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_respbuffer);
1042311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer = NULL;
1042411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1042511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1042611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.op_buf_ion_info) {
1042711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free o/p ion context");
1042811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.op_buf_ion_info);
1042911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info = NULL;
1043011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1043111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1043211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet =  OMX_ErrorInsufficientResources;
1043311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1043411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1043511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet =  OMX_ErrorInsufficientResources;
1043611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1043711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1043811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1043911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1044011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::complete_pending_buffer_done_cbs()
1044111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1044211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1, p2, ident;
1044311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue tmp_q, pending_bd_q;
1044411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1044511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pop all pending GENERATE FDB from ftb queue
1044611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_ftb_q.m_size) {
1044711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.pop_entry(&p1,&p2,&ident);
1044811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_FBD) {
1044911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_bd_q.insert_entry(p1,p2,ident);
1045011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1045111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            tmp_q.insert_entry(p1,p2,ident);
1045211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1045311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1045411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return all non GENERATE FDB to ftb queue
1045511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (tmp_q.m_size) {
1045611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tmp_q.pop_entry(&p1,&p2,&ident);
1045711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.insert_entry(p1,p2,ident);
1045811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1045911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pop all pending GENERATE EDB from etb queue
1046011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_etb_q.m_size) {
1046111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.pop_entry(&p1,&p2,&ident);
1046211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_EBD) {
1046311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_bd_q.insert_entry(p1,p2,ident);
1046411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1046511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            tmp_q.insert_entry(p1,p2,ident);
1046611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1046711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1046811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return all non GENERATE FDB to etb queue
1046911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (tmp_q.m_size) {
1047011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tmp_q.pop_entry(&p1,&p2,&ident);
1047111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.insert_entry(p1,p2,ident);
1047211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1047311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
1047411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // process all pending buffer dones
1047511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (pending_bd_q.m_size) {
1047611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pending_bd_q.pop_entry(&p1,&p2,&ident);
1047711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (ident) {
1047811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_EBD:
1047911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
1048011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
1048111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
1048211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1048311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1048411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1048511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_FBD:
1048611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
1048711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
1048811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
1048911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1049011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1049111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1049211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1049311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1049411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1049511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
1049611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1049711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 new_frame_interval = 0;
1049811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
1049911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && llabs(act_timestamp - prev_ts) > 2000) {
1050011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ?
1050111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual);
1050211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (new_frame_interval != frm_int || frm_int == 0) {
1050311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frm_int = new_frame_interval;
1050411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (frm_int) {
1050511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.frame_rate.fps_numerator = 1e6;
1050611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.frame_rate.fps_denominator = frm_int;
1050711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
1050811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
1050911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (float)drv_ctx.frame_rate.fps_denominator);
1051011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_perf_control.request_cores(frm_int);
1051111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* We need to report the difference between this FBD and the previous FBD
1051211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * back to the driver for clock scaling purposes. */
1051311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_outputparm oparm;
1051411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*XXX: we're providing timing info as seconds per frame rather than frames
1051511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * per second.*/
1051611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
1051711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
1051811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1051911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_streamparm sparm;
1052011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1052111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sparm.parm.output = oparm;
1052211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
1052311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
1052411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            performance might be affected");
1052511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1052611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1052711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1052811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1052911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1053011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts = act_timestamp;
1053111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1053211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1053311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
1053411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1053511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rst_prev_ts && VALID_TS(act_timestamp)) {
1053611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = act_timestamp;
1053711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts_actual = act_timestamp;
1053811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = false;
1053911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (VALID_TS(prev_ts)) {
1054011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool codec_cond = (drv_ctx.timestamp_adjust)?
1054111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) :
1054211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual);
1054311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             prev_ts_actual = act_timestamp; //unadjusted previous timestamp
1054411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frm_int > 0 && codec_cond) {
1054511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
1054611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            act_timestamp = prev_ts + frm_int;
1054711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
1054811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            prev_ts = act_timestamp;
1054911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1055011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) {
1055111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // ensure that timestamps can never step backwards when in display order
1055211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                act_timestamp = prev_ts;
1055311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1055411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            set_frame_rate(act_timestamp);
1055511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1055611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (frm_int > 0)          // In this case the frame rate was set along
1055711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {                               // with the port definition, start ts with 0
1055811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
1055911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
1056011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1056111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1056211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1056311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::get_omx_output_buffer_header(int index)
1056411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1056511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_out_mem_ptr + index;
1056611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1056711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10568fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
10569fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects)
10570fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
10571fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (primaries) {
10572fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT709_5:
10573fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            *color_space = ITU_R_709;
10574fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
10575fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10576fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT470_6_M:
10577fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT470_6M;
10578fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10579fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT601_6_625:
10580fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10581fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10582fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT601_6_525:
10583fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            *color_space = range ? ITU_R_601_FR : ITU_R_601;
10584fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525;
10585fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10586fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_GENERIC_FILM:
10587fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesGenericFilm;
10588fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10589fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT2020:
10590fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10591fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10592fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_UNSPECIFIED:
10593fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default
10594fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10595fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mPrimaries = ColorAspects::PrimariesOther;
10596fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10597fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10598fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10599fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10600fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
10601fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10602fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (transfer) {
10603fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT709_5:
10604fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625:
10605fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10606fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10607fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_470_6_M:
10608fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferGamma22;
10609fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10610fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_470_6_BG:
10611fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferGamma28;
10612fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10613fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_SMPTE_240M:
10614fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10615fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10616fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_LINEAR:
10617fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferLinear;
10618fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10619fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_IEC_61966:
10620fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferXvYCC;
10621fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10622fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_1361:
10623fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferBT1361;
10624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_SRGB:
10626fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSRGB;
10627fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10628fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10629fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mTransfer = ColorAspects::TransferOther;
10630fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = m_client_color_space.sAspects.mTransfer;
10631fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10632fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10633fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10634fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (matrix) {
10635fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_709_5:
10636fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10637fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10638fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_FCC_47:
10639fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M;
10640fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10641fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_601_6_625:
10642fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_601_6_525:
10643fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10644fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10645fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_SMPTE_240M:
10646fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M;
10647fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10648fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_2020:
10649fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10650fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10651fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_2020_CONST:
10652fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant;
10653fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10654fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10655fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10656fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10657fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10658fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10659fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10660fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10661fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) {
10662fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d",
10663fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs);
10664fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10665fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10666fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_color_space_info(void *data, unsigned int buf_index)
10667fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
10668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorSpace_t color_space = ITU_R_601;
10669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorAspects tempAspects;
10670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&tempAspects, 0x0, sizeof(ColorAspects));
10671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorAspects *aspects = &tempAspects;
10672fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10673fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch(output_capability) {
10674fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_MPEG2:
10675fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10676fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
10677fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data;
10678fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10679fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to
10680fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * understand this code */
10681fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10682fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (seqdisp_payload && seqdisp_payload->color_descp) {
10683fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10684fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(seqdisp_payload->color_primaries, 1,
10685fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
10686fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            &color_space,aspects);
10687fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    m_disp_hor_size = seqdisp_payload->disp_width;
10688fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    m_disp_vert_size = seqdisp_payload->disp_height;
10689fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10690fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10691fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10692fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_H264:
10693fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_HEVC:
10694fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10695fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vui_display_info_payload *display_info_payload;
10696fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                display_info_payload = (struct msm_vidc_vui_display_info_payload*)data;
10697fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */
10699fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10700fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (display_info_payload->video_signal_present_flag &&
10701fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        display_info_payload->color_description_present_flag) {
10702fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(display_info_payload->color_primaries,
10703fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->video_full_range_flag,
10704fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->transfer_characteristics,
10705fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->matrix_coefficients,
10706fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            &color_space,aspects);
10707fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10708fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10709fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10710fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VC1_ANNEX_G:
10711fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VC1_ANNEX_L:
10712fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10713fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload;
10714fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data;
10715fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10716fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23
10717fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * SMPTE 421M to understand this code */
10718fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10719fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (m_enable_android_native_buffers &&
10720fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        vc1_seq_disp_payload->color_primaries) {
10721fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10722fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(vc1_seq_disp_payload->color_primaries,
10723fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            1,
10724fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            vc1_seq_disp_payload->transfer_char,
10725fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            vc1_seq_disp_payload->matrix_coeffs,
10726fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            &color_space,aspects);
10727fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10728fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10729fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10730fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VP8:
10731fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10732fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10733fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10734fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10735fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011
10736fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * to understand this code */
10737fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10738fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (vpx_color_space_payload->color_space == 0) {
10739fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    color_space = ITU_R_601;
10740fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                } else {
10741fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Unsupported Color space for VP8");
10742fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
10743fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10744fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10745fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10746fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VP9:
10747fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10748fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10749fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10750fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10751fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016
10752fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * to understand this code */
10753fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch(vpx_color_space_payload->color_space) {
10755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_601:
10756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10760fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_709:
10762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = ITU_R_709;
10763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries =  ColorAspects::PrimariesBT709_5;
10766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_SMPTE_170:
10769fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_SMPTE_240:
10775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_2020:
10781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects:: TransferSMPTE170M;
10783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10784fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10785fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_RESERVED:
10787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10788fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferOther;
10789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10790fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_RGB:
10793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
10799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10802fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10803fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10804fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10805fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10806fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_enable_android_native_buffers) {
10807fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry 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);
10808fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        set_colorspace_in_handle(color_space, buf_index);
10809fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10810fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    print_debug_color_aspects(aspects, "Bitstream");
10811fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10812fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries ||
10813fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mTransfer != aspects->mTransfer ||
10814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs ||
10815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mRange != aspects->mRange) {
10816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects));
10817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_internal_color_space.bDataSpaceChanged = OMX_TRUE;
10818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10819fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to Color Aspects Change");
10820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal");
10821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(m_client_color_space.sAspects), "Client");
10822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        post_event(OMX_CORE_OUTPUT_PORT_INDEX,
10824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_QTIIndexConfigDescribeColorAspects,
10825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
10826fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return true;
10827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10828fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return false;
10829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) {
10832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    private_handle_t *private_handle = NULL;
10833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (buf_index < drv_ctx.op_buf.actualcount &&
10834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
10835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            native_buffer[buf_index].privatehandle) {
10836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        private_handle = native_buffer[buf_index].privatehandle;
10837fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10838fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (private_handle) {
10839fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space);
10840fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10841fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10842fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10843fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelvoid omx_vdec::print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix)
10844fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
10845fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (!hdr_info->mID) {
10846fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mR.x = %d mR.y = %d", prefix,
10847fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mR.x, hdr_info->sType1.mR.y);
10848fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mG.x = %d mG.y = %d", prefix,
10849fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mG.x, hdr_info->sType1.mG.y);
10850fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mB.x = %d mB.y = %d", prefix,
10851fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mB.x, hdr_info->sType1.mB.y);
10852fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mW.x = %d mW.y = %d", prefix,
10853fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mW.x, hdr_info->sType1.mW.y);
10854fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: maxDispLum = %d minDispLum = %d", prefix,
10855fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mMaxDisplayLuminance, hdr_info->sType1.mMinDisplayLuminance);
10856fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo CLL: CLL = %d FLL = %d", prefix,
10857fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        hdr_info->sType1.mMaxContentLightLevel, hdr_info->sType1.mMaxFrameAverageLightLevel);
10858fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
10859fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10860fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
10861fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10862fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10863fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10864fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_content_light_level_info(void* data)
10865fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
10866fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    struct msm_vidc_content_light_level_sei_payload *light_level_payload =
10867fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (msm_vidc_content_light_level_sei_payload*)(data);
10868fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10869fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if ((m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel != light_level_payload->nMaxContentLight) ||
10870fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel != light_level_payload->nMaxPicAverageLight)) {
10871fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel = light_level_payload->nMaxContentLight;
10872fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel = light_level_payload->nMaxPicAverageLight;
10873fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return true;
10874fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
10875fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return false;
10876fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
10877fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10878fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_mastering_display_color_info(void* data)
10879fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
10880fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    struct msm_vidc_mastering_display_colour_sei_payload *mastering_display_payload =
10881fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (msm_vidc_mastering_display_colour_sei_payload*)(data);
10882fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    HDRStaticInfo* hdr_info = &m_internal_hdr_info.sInfo;
10883fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool internal_disp_changed_flag = false;
10884fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10885fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag  = (hdr_info->sType1.mR.x != mastering_display_payload->nDisplayPrimariesX[0]) ||
10886fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mR.y != mastering_display_payload->nDisplayPrimariesY[0]);
10887fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mG.x != mastering_display_payload->nDisplayPrimariesX[1]) ||
10888fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mG.y != mastering_display_payload->nDisplayPrimariesY[1]);
10889fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mB.x != mastering_display_payload->nDisplayPrimariesX[2]) ||
10890fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mB.y != mastering_display_payload->nDisplayPrimariesY[2]);
10891fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10892fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mW.x != mastering_display_payload->nWhitePointX) ||
10893fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mW.y != mastering_display_payload->nWhitePointY);
10894fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10895af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    /* Maximum Display Luminance from the bitstream is in 0.0001 cd/m2 while the HDRStaticInfo extension
10896af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel       requires it in cd/m2, so dividing by 10000 and rounding the value after division
10897af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    */
10898af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    uint16_t max_display_luminance_cd_m2 =
10899af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        static_cast<int>((mastering_display_payload->nMaxDisplayMasteringLuminance / LUMINANCE_DIV_FACTOR) + 0.5);
10900af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mMaxDisplayLuminance != max_display_luminance_cd_m2) ||
10901fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mMinDisplayLuminance != mastering_display_payload->nMinDisplayMasteringLuminance);
10902fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10903fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (internal_disp_changed_flag) {
10904fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mR.x = mastering_display_payload->nDisplayPrimariesX[0];
10905fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mR.y = mastering_display_payload->nDisplayPrimariesY[0];
10906fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mG.x = mastering_display_payload->nDisplayPrimariesX[1];
10907fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mG.y = mastering_display_payload->nDisplayPrimariesY[1];
10908fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mB.x = mastering_display_payload->nDisplayPrimariesX[2];
10909fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mB.y = mastering_display_payload->nDisplayPrimariesY[2];
10910fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mW.x = mastering_display_payload->nWhitePointX;
10911fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mW.y = mastering_display_payload->nWhitePointY;
10912fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10913af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel        hdr_info->sType1.mMaxDisplayLuminance = max_display_luminance_cd_m2;
10914fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mMinDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance;
10915fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
10916fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10917fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return internal_disp_changed_flag;
10918fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
10919fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1092011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
1092111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
109222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_client_extra = NULL;
109232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_U8 *pBuffer = NULL;
1092411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_conceal_MB = 0;
1092511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_TICKS time_stamp = 0;
1092611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 frame_rate = 0;
1092711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long consumed_len = 0;
1092811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_MB_in_frame;
1092911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 recovery_sei_flags = 1;
1093011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int enable = OMX_InterlaceFrameProgressive;
10931fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool internal_hdr_info_changed_flag = false;
10932fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool color_event = false;
1093311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (output_flush_progress)
1093411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1093511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1093611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int buf_index = p_buf_hdr - m_out_mem_ptr;
1093711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buf_index >= drv_ctx.extradata_info.count) {
1093811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
1093911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf_index, drv_ctx.extradata_info.count);
1094011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1094111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1094211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
1094311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1094411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) {
1094511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL");
1094611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1094711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1094811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1094911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!drv_ctx.extradata_info.uaddr) {
1095011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
1095111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1095211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1095311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) {
1095411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data");
1095511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
1095611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1095711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
109582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (!secure_mode) {
109592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        pBuffer = (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[buf_index].buffer_len,
109602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, drv_ctx.ptr_outputbuffer[buf_index].pmem_fd, 0);
109612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (pBuffer == MAP_FAILED) {
109622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_ERROR("handle_extradata output buffer mmap failed - errno: %d", errno);
109632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            return;
109642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1096511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)
1096611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
109672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    } else
1096811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = m_other_extradata;
109692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
109702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    AutoUnmap autounmap(pBuffer, drv_ctx.ptr_outputbuffer[buf_index].buffer_len);
109712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (m_client_extradata_info.getBase() &&
109722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        m_client_extradata_info.getSize() >= drv_ctx.extradata_info.buffer_size) {
109732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (m_client_extradata_info.getBase() +
109742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            buf_index * m_client_extradata_info.getSize());
109752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
109762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1097711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
1097811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1097911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1098011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
1098111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
1098211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1098311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1098411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata_info.output_crop_updated = OMX_FALSE;
1098511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
1098611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (data && p_extra) {
1098711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
1098811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
1098911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) {
1099011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Invalid extra data size");
1099111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1099211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1099311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1099411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1099511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra = NULL;
1099611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
1099711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return;
1099811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1099911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType);
1100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch ((unsigned long)data->eType) {
1100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
1100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_interlace_payload *payload;
1100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U32 interlace_color_format;
1100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    payload = (struct msm_vidc_interlace_payload *)(void *)data->data;
1100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (payload) {
1100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        enable = OMX_InterlaceFrameProgressive;
1100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (payload->format) {
1100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE:
1101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST:
1101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                enable = OMX_InterlaceInterleaveFrameTopFieldFirst;
1101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST:
1101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
1101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                enable = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            default:
1102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("default case - set to progressive");
1102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (payload->color_format) {
1102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12:
1102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
1102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC:
1102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
1103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
1103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           default:
1103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame");
1103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_enable_android_native_buffers) {
1103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d",
1103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         payload->format, interlace_color_format ,enable,
1104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false);
1104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
1104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               PP_PARAM_INTERLACED, (void*)&enable);
1104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
1104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
1104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               LINEAR_FORMAT, (void*)&interlace_color_format);
11048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        } else if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
11049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
11050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               LINEAR_FORMAT, NULL);
1105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_INTERLACE_EXTRADATA) {
1105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_interlace_extradata(p_extra, payload->format);
110552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
110562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
110572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_interlace_extradata(p_client_extra, payload->format);
110582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *)
110592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                (((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4));
110602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_RATE:
1106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_framerate_payload *frame_rate_payload;
1106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data;
1106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frame_rate = frame_rate_payload->frame_rate;
1106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_TIMESTAMP:
1106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_ts_payload *time_stamp_payload;
1107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data;
1107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp = time_stamp_payload->timestamp_lo;
1107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
1107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    p_buf_hdr->nTimeStamp = time_stamp;
1107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
1107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
1107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data;
1107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
1108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_INDEX:
1108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int *etype;
1108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    etype  = (int *)(void *)data->data;
1108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) {
1108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
1108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
1108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (aspect_ratio_payload) {
1108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((struct vdec_output_frameinfo *)
1109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
1109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((struct vdec_output_frameinfo *)
1109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
1109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else if (etype && *etype == MSM_VIDC_EXTRADATA_OUTPUT_CROP) {
1109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct msm_vidc_output_crop_payload *output_crop_payload;
1109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        output_crop_payload = (struct msm_vidc_output_crop_payload *)(++etype);
1109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (output_crop_payload) {
1109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nLeft = output_crop_payload->left;
1109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nTop = output_crop_payload->top;
1110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nWidth = output_crop_payload->left + output_crop_payload->display_width;
1110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nHeight = output_crop_payload->top + output_crop_payload->display_height;
1110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_width = output_crop_payload->width;
1110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_height = output_crop_payload->height;
1110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_updated = OMX_TRUE;
1110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
1110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
1111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data;
1111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    recovery_sei_flags = recovery_sei_payload->flags;
1111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
1111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
1111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("***************************************************");
1111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
1111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("***************************************************");
1111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
1112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data;
1112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) {
1112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Panscan windows are more than supported\n");
1112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n",
1112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows);
1112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return;
1112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP:
11129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO:
11130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VC1_SEQDISP:
11131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO:
11132fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    color_event = handle_color_space_info((void *)data->data, buf_index);
1113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING:
1113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload;
1113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data;
1113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    switch (s3d_frame_packing_payload->fpa_type) {
1113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case MSM_VIDC_FRAMEPACK_SIDE_BY_SIDE:
1113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (s3d_frame_packing_payload->content_interprtation_type == 1)
1114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_3D_SIDE_BY_SIDE_L_R;
1114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            else if (s3d_frame_packing_payload->content_interprtation_type == 2)
1114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_3D_SIDE_BY_SIDE_R_L;
1114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            else {
1114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_ERROR("Unsupported side-by-side framepacking type");
1114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_NO_3D;
1114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
1114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
1114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case MSM_VIDC_FRAMEPACK_TOP_BOTTOM:
1114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            stereo_output_mode = HAL_3D_TOP_BOTTOM;
1115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
1115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        default:
1115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Unsupported framepacking type");
1115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            stereo_output_mode = HAL_NO_3D;
1115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("setMetaData FRAMEPACKING : fpa_type = %u, content_interprtation_type = %u, stereo_output_mode= %d",
1115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        s3d_frame_packing_payload->fpa_type, s3d_frame_packing_payload->content_interprtation_type, stereo_output_mode);
1115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
1115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_framepack_extradata(p_extra, s3d_frame_packing_payload);
111592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_framepack_extradata(p_client_extra, s3d_frame_packing_payload);
111622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_QP:
1116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_frame_qp_payload *qp_payload;
1116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data;
1116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_QP_EXTRADATA) {
1117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_qp_extradata(p_extra, qp_payload);
111712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_qp_extradata(p_client_extra, qp_payload);
111742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO:
1117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_frame_bits_info_payload *bits_info_payload;
1118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data;
1118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_BITSINFO_EXTRADATA) {
1118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_bitsinfo_extradata(p_extra, bits_info_payload);
111832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_bitsinfo_extradata(p_client_extra, bits_info_payload);
111862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111872601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_STREAM_USERDATA:
1119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
1119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_user_extradata(p_extra, data);
111932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_user_extradata(p_client_extra, data);
111962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_VQZIP_SEI:
1120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_vqzip_sei_payload *vqzip_payload;
1120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data;
1120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_VQZIPSEI_EXTRADATA) {
1120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_vqzip_extradata(p_extra, vqzip_payload);
112062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
112072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
112082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_vqzip_extradata(p_client_extra, vqzip_payload);
112092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
112102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
11213fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                case MSM_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI:
11214fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    internal_hdr_info_changed_flag |= handle_content_light_level_info((void*)data->data);
11215fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    break;
11216fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                case MSM_VIDC_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI:
11217fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    internal_hdr_info_changed_flag |= handle_mastering_display_color_info((void*)data->data);
11218fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    break;
1121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
1122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Unrecognized extradata");
1122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    goto unrecognized_extradata;
1122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            consumed_len += data->nSize;
1122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
1122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
1122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            append_frame_info_extradata(p_extra,
1122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
1123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
1123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
112322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
112332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (p_client_extra) {
112342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                append_frame_info_extradata(p_client_extra,
112352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
112362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
112372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
112382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
112392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
1124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) {
1124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            append_frame_dimension_extradata(p_extra);
112432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
112442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (p_client_extra) {
112452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                append_frame_dimension_extradata(p_client_extra);
112462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
112472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
1124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
11249fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11250fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if(internal_hdr_info_changed_flag) {
11251fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "Internal");
11252fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "Client");
11253fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            auto_lock lock(m_hdr_info_client_lock);
11254fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_change_client_hdr_info = true;
11255fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if(!color_event) {
11256fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to HDR Info Change");
11257fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                post_event(OMX_CORE_OUTPUT_PORT_INDEX,
11258fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           OMX_QTIIndexConfigDescribeHDRColorInfo,
11259fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           OMX_COMPONENT_GENERATE_PORT_RECONFIG);
11260fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
11261fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
11262fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunrecognized_extradata:
1126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (client_extradata && p_extra) {
1126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        append_terminator_extradata(p_extra);
112682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (p_client_extra) {
112692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            append_terminator_extradata(p_client_extra);
112702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (secure_mode && p_extradata && m_other_extradata) {
1127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_output_frameinfo  *ptr_extradatabuff = NULL;
1127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size);
1127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate;
1127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata;
1127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size;
1127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.fd = drv_ctx.extradata_info.ion.fd_ion_data.fd;
1127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.offset = buf_index * drv_ctx.extradata_info.buffer_size;
1128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.buffer_size = drv_ctx.extradata_info.size;
1128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11285fa202b9b18f17f7835fd602db5fff530e61112b4Thierry StrudelOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U64 requested_extradata,
1128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_internal, bool enable)
1128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
1128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
1129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateLoaded) {
1129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
1129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
1129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d",
1129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal);
1129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!is_internal) {
1129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (enable)
1129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= requested_extradata;
1130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata = client_extradata & ~requested_extradata;
1130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable) {
1130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
1130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
1130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
1131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        " Quality of interlaced clips might be impacted.");
1131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
1131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
1131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
1131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
1132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
1132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
1132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
1132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
1133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
1133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_MPEG2) {
1134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
1134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
1134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
1135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
1135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && (requested_extradata & OMX_FRAMEPACK_EXTRADATA)) {
1135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_H264) {
1135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA");
1135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value =  V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING;
1135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata");
1136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only");
1136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_QP_EXTRADATA) {
1136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
1136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set QP extradata");
1137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_BITSINFO_EXTRADATA) {
1137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO;
1137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set frame bits info extradata");
1137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && (requested_extradata & OMX_EXTNUSER_EXTRADATA)) {
1138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA;
1138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set stream userdata extradata");
1138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) {
1138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI;
1139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata");
1139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= OMX_VQZIPSEI_EXTRADATA;
1139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
1139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set QP extradata");
1139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= OMX_QP_EXTRADATA;
1140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) {
1140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_OUTPUT_CROP;
1140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Enable output crop extra data");
1140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set output crop extradata");
1140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
11410fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) {
11411fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
11412fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            switch(output_capability) {
11413fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_H264:
11414fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_HEVC:
11415fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
11416fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11417fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case CODEC_TYPE_MPEG2:
11418fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
11419fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11420fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VP8:
11421fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VP9:
11422fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE;
11423fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11424fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VC1_ANNEX_G:
11425fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VC1_ANNEX_L:
11426fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP;
11427fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11428fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                default:
11429fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind);
11430fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    return ret;
11431fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11432fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11433fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11434fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_HIGH("Failed to set Display info extradata");
11435fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11436fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
11437fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (requested_extradata & OMX_HDR_COLOR_INFO_EXTRADATA) {
11438fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
11439fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (output_capability == V4L2_PIX_FMT_H264 ||
11440fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                output_capability == V4L2_PIX_FMT_HEVC) {
11441fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_DISPLAY_COLOUR_SEI;
11442fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11443fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    DEBUG_PRINT_HIGH("Failed to set Display Colour SEI extradata");
11444fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
11445fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI;
11446fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11447fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    DEBUG_PRINT_HIGH("Failed to set Content Light Level SEI extradata");
11448fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
11449fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
11450fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
1145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = get_buffer_req(&drv_ctx.op_buf);
1145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
1145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
1145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *data_ptr = extra->data, data = 0;
1146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (byte_count < extra->nDataSize) {
1146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data = *data_ptr;
1146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (data) {
1146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            num_MB += (data&0x01);
1146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data >>= 1;
1146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data_ptr++;
1146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        byte_count++;
1146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
1147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_debug_extradata || !extra)
1147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH(
1148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "============== Extra Data ==============\n"
1148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "           Size: %u\n"
1148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "        Version: %u\n"
1148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "      PortIndex: %u\n"
1148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "           Type: %x\n"
1148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "       DataSize: %u",
1148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion,
1148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize);
1148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
1149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "------ Interlace Format ------\n"
1149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                Size: %u\n"
1149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             Version: %u\n"
1149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           PortIndex: %u\n"
1149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " Is Interlace Format: %d\n"
1149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   Interlace Formats: %u\n"
1149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "=========== End of Interlace ===========",
1150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex,
1150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats);
1150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
1150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "-------- Frame Format --------\n"
1150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             Picture Type: %d\n"
1150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Interlace Type: %d\n"
1150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " Pan Scan Total Frame Num: %u\n"
1151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   Concealed Macro Blocks: %u\n"
1151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               frame rate: %u\n"
1151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               Time Stamp: %llu\n"
1151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Aspect Ratio X: %u\n"
1151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Aspect Ratio Y: %u",
1151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->ePicType,
1151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->interlaceType,
1151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->panScan.numWindows,
1151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->nConcealedMacroblocks,
1151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->nFrameRate,
1152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->nTimeStamp,
1152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->aspectRatio.aspectRatioX,
1152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->aspectRatio.aspectRatioY);
1152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
1152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH(
1152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "------------------------------"
1152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "     Pan Scan Frame Num: %u\n"
1152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "            Rectangle x: %d\n"
1152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "            Rectangle y: %d\n"
1153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "           Rectangle dx: %d\n"
1153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "           Rectangle dy: %d",
1153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y,
1153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy);
1153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
1153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) {
1153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
1153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "------------------ Framepack Format ----------\n"
1154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                           id: %u \n"
1154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                  cancel_flag: %u \n"
1154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                         type: %u \n"
1154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " quincunx_sampling_flagFormat: %u \n"
1154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "  content_interpretation_type: %u \n"
1154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "        spatial_flipping_flag: %u \n"
1154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "          frame0_flipped_flag: %u \n"
1154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             field_views_flag: %u \n"
1154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " current_frame_is_frame0_flag: %u \n"
1155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   frame0_self_contained_flag: %u \n"
1155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   frame1_self_contained_flag: %u \n"
1155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame0_grid_position_x: %u \n"
1155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame0_grid_position_y: %u \n"
1155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame1_grid_position_x: %u \n"
1155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame1_grid_position_y: %u \n"
1155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                reserved_byte: %u \n"
1155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "            repetition_period: %u \n"
1155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               extension_flag: %u \n"
1155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "================== End of Framepack ===========",
1156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->id,
1156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->cancel_flag,
1156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->type,
1156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->quincunx_sampling_flag,
1156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->content_interpretation_type,
1156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->spatial_flipping_flag,
1156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_flipped_flag,
1156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->field_views_flag,
1156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->current_frame_is_frame0_flag,
1156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_self_contained_flag,
1157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_self_contained_flag,
1157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_grid_position_x,
1157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_grid_position_y,
1157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_grid_position_x,
1157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_grid_position_y,
1157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->reserved_byte,
1157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->repetition_period,
1157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->extension_flag);
1157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) {
1157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
1158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "---- QP (Frame quantization parameter) ----\n"
1158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Frame QP: %u \n"
1158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "================ End of QP ================\n",
1158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)qp->nQP);
1158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) {
1158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data;
1158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------- Input bits information --------\n"
1158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Header bits: %u \n"
1159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "     Frame bits: %u \n"
1159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "===== End of Input bits information =====\n",
1159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits);
1159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) {
1159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data;
1159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *data_ptr = (OMX_U8 *)userdata->data;
1159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type);
1159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 i = 0;
1159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------------  Userdata  -------------\n"
1160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Stream userdata type: %u\n"
1160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "          userdata size: %u\n"
1160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    STREAM_USERDATA:",
1160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)userdata->type, (unsigned int)userdata_size);
1160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                for (i = 0; i < userdata_size; i+=4) {
1160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("        %x %x %x %x",
1160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        data_ptr[i], data_ptr[i+1],
1160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        data_ptr[i+2], data_ptr[i+3]);
1160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "=========== End of Userdata ===========");
1161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) {
1161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
1161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------------  VQZip  -------------\n"
1161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Size: %u\n",
1161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)vq->nSize);
1161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH( "=========== End of VQZip ===========");
1161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == OMX_ExtraDataNone) {
1161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
1162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
1162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 interlaced_format_type)
1162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STREAMINTERLACEFORMAT *interlace_format;
1162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
1163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!extra) {
1163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input");
1163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return;
1163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
1163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
1164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
1164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
1164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_FALSE;
1164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) {
1165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_TRUE;
1165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
1165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) {
1165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_TRUE;
1165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
1165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //default case - set to progressive
1166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_FALSE;
1166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension;
1167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) {
1167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE;
1167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension;
1167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION);
1167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data;
1168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nDecWidth = rectangle.nLeft;
1168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nDecHeight = rectangle.nTop;
1168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nActualWidth = rectangle.nWidth;
1168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nActualHeight = rectangle.nHeight;
1168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::fill_aspect_ratio_info(
1168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_aspectratioinfo *aspect_ratio_info,
1168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
1168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata = frame_info;
1169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
1169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
1169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX,
1169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)m_extradata->aspectRatio.aspectRatioY);
1169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
1169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload,
1170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_aspectratioinfo *aspect_ratio_info)
1170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
1170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_panscan_window *panscan_window;
1170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
1170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
1170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
1171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
1171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (picture_type) {
1171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_I:
1171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
1171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_P:
1171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
1171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_B:
1172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
1172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
1172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
1172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
1172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
1173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
1173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
1173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
1173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nConcealedMacroblocks = num_conceal_mb;
1173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nFrameRate = frame_rate;
1173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nTimeStamp = time_stamp;
1173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->panScan.numWindows = 0;
1173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (output_capability == V4L2_PIX_FMT_MPEG2) {
1173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disp_hor_size && m_disp_vert_size) {
1173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
1174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
1174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayHorizontalSize = 0;
1174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayVerticalSize = 0;
1174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (panscan_payload) {
1174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
1174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        panscan_window = &panscan_payload->wnd[0];
1175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
1175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
1175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
1175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
1175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
1175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            panscan_window++;
1175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
1175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
1176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
1176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
1176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data;
1177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *portDefn = m_port_def;
1177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u "
1177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight,
1177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameWidth,
1177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nStride,
1177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nSliceHeight);
1177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload)
1178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack;
1178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) {
1178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("frame packing size mismatch");
1178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE;
1178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement;
1179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
1179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nVersion.nVersion = OMX_SPEC_VERSION;
1179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&framepack->id, s3d_frame_packing_payload,
1179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sizeof(struct msm_vidc_s3d_frame_packing_payload));
1179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&m_frame_pack_arrangement, framepack,
1179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
1180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct msm_vidc_frame_qp_payload *qp_payload)
1180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_QP * qp = NULL;
1180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!qp_payload) {
1180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("QP payload is NULL");
1180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_QP_EXTRADATA_SIZE;
1181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP;
1181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP);
1181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
1181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    qp->nQP = qp_payload->frame_qp;
1181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct msm_vidc_frame_bits_info_payload *bits_payload)
1182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL;
1182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bits_payload) {
1182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("bits info payload is NULL");
1182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_BITSINFO_EXTRADATA_SIZE;
1183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo;
1183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO);
1183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data;
1183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits->frame_bits = bits_payload->frame_bits;
1183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits->header_bits = bits_payload->header_bits;
1183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_OTHER_EXTRADATATYPE *p_user)
1184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int userdata_size = 0;
1184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_stream_userdata_payload *userdata_payload = NULL;
1184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    userdata_payload =
1184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data;
1184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    userdata_size = p_user->nDataSize;
1184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size;
1184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
1185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = userdata_size;
1185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize))
1185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy(extra->data, p_user->data, extra->nDataSize);
1185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!client_extradata) {
1186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
1186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = OMX_ExtraDataNone;
1186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = 0;
1186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->data[0] = 0;
1186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct msm_vidc_vqzip_sei_payload *vqzip_payload)
1187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL;
1187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size;
1187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI;
1188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size;
1188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
1188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vq->nSize = vqzip_payload->size;
1188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(vq->data, vqzip_payload->data, vqzip_payload->size);
1188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
1189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index >= drv_ctx.ip_buf.actualcount) {
1189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
1189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr == NULL) {
1189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_desc_buffer_ptr = (desc_buffer_hdr*) \
1189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    calloc( (sizeof(desc_buffer_hdr)),
1190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.ip_buf.actualcount);
1190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_desc_buffer_ptr == NULL) {
1190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
1190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
1190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
1190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
1191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
1191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries);
1191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_demux_entries < 8192) {
1192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_offsets[m_demux_entries++] = address_offset;
1192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
1192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
1192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
1192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 index = 0;
1193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
1193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (index < bytes_to_parse) {
1193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
1193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (buf[index+2] == 0x01)) ) {
1193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Found start code, insert address offset
1193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            insert_demux_addr_offset(index);
1194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buf[index+2] == 0x01) // 3 byte start code
1194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                index += 3;
1194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else                      //4 byte start code
1194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                index += 4;
1194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            index++;
1194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries);
1194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
1195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //fix this, handle 3 byte start code, vc1 terminator entry
1195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *p_demux_data = NULL;
1195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 desc_data = 0;
1195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 start_addr = 0;
1195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nal_size = 0;
1195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 suffix_byte = 0;
1195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 demux_index = 0;
1196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 buffer_index = 0;
1196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr == NULL) {
1196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
1196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
1196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_index > drv_ctx.ip_buf.actualcount) {
1196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index);
1197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
1197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( ((OMX_U8*)p_demux_data == NULL) ||
1197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
1197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
1197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; demux_index < m_demux_entries; demux_index++) {
1198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0;
1198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            start_addr = m_demux_offsets[demux_index];
1198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
1198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
1198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
1198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (demux_index < (m_demux_entries - 1)) {
1198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
1199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
1199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)",
1199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)start_addr,
1199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)suffix_byte,
1199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)nal_size,
1199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)demux_index);
1199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = (start_addr >> 3) << 1;
1199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data |= (start_addr & 7) << 21;
1200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data |= suffix_byte << 24;
1200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
1200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_demux_data += 16;
1200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_type_parse == CODEC_TYPE_VC1) {
1201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VC1 terminator entry");
1201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0;
1201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0x82 << 24;
1201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
1201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_demux_data += 16;
1201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_demux_entries++;
1201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Add zero word to indicate end of descriptors
1202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(p_demux_data, 0, sizeof(OMX_U32));
1202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
1202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size);
1202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
1202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
1202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Demux table complete!");
1202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level)
1203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
1203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
1203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.turbo", property_value, "0");
1203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0, sizeof(v4l2_control));
1203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
1204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (perf_level) {
1204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VIDC_NOMINAL:
1204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value))
1204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
1204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
1204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VIDC_TURBO:
1204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
1204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     default:
1205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requested PERF level not supported");
1205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig)
1205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("changing performance level to %d", control.value);
1205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        current_perf_level = control.value;
1206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set PERF level");
1206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
1206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enabled = false;
1206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = NULL;
1206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_members();
1207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ColorFormat = OMX_COLOR_FormatMax;
1207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dest_format = YCbCr420P;
1207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_width = 0;
1207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_height = 0;
1207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
1207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = reinterpret_cast<omx_vdec*>(client);
1207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::init_members()
1208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocated_count = 0;
1208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_size_req = 0;
1208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_alignment_req = 0;
1208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_width = m_c2d_height = 0;
1208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
1208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
1208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
1209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
1209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
1209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (int i = 0; i < MAX_COUNT; i++)
1209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd[i] = -1;
1209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
1209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2d.destroy();
1210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
1210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int src_size = 0, destination_size = 0;
121072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    unsigned int height, width;
121082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_format fmt;
1210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_COLOR_FORMATTYPE drv_color_format;
121102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid client in color convert");
1211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
1211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("No color conversion required");
1211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return status;
1211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
121222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
121232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.pixelformat = omx->capture_capability;
121242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
121252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    width = fmt.fmt.pix_mp.width;
121262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    height =  fmt.fmt.pix_mp.height;
121272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
121282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    bool resolution_upgrade = (height > m_c2d_height ||
121292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            width > m_c2d_width);
1213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (resolution_upgrade) {
1213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // resolution upgraded ? ensure we are yet to allocate;
1213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // failing which, c2d buffers will never be reallocated and bad things will happen
1213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocated_count > 0) {
1213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Cannot change C2D buffer requirements with %d active allocations",
1213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    allocated_count);
1213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto fail_update_buf_req;
1213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
1214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
1214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
1214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
1214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto fail_update_buf_req;
1214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2d.close();
121482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    status = c2d.open(height,
121492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            width,
1215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            NV12_128m,dest_format);
1215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
1215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = c2d.get_buffer_size(C2D_INPUT,src_size);
1215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (status)
1215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
1215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
1215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
1215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !destination_size) {
1215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
1216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "driver size %u destination size %d",
1216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size,
1216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    destination_size);
1216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            c2d.close();
1216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req = 0;
1216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // TODO: make this fatal. Driver is not supposed to quote size
1216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //  smaller than what C2D needs !!
1216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req = destination_size;
121702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            m_c2d_height = height;
121712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            m_c2d_width = width;
1217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_update_buf_req:
1217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::set_color_format(
1218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE dest_color_format)
1218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
12182b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool status = true, drv_colorformat_c2d_enable = false;
12183b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool dest_color_format_c2d_enable = false;
12184b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    OMX_COLOR_FORMATTYPE drv_color_format = OMX_COLOR_FormatUnused;
1218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid client in color convert");
1218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
1218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
1219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
1219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
1219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
1219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
1219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
1219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         drv_color_format = (OMX_COLOR_FORMATTYPE)
1219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
12200b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel     } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
12201b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
12202b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed;
1220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     } else {
1220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Incorrect color format");
1220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
1220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
12207b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    drv_colorformat_c2d_enable = (drv_color_format != dest_color_format) &&
12208b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12209b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView) &&
12210b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12211b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) &&
12212b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12213b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed);
12214b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
12215b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    dest_color_format_c2d_enable = (dest_color_format != (OMX_COLOR_FORMATTYPE)
12216b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) &&
12217b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            (dest_color_format != (OMX_COLOR_FORMATTYPE)
12218b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed);
12219b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
12220b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (status && drv_colorformat_c2d_enable && dest_color_format_c2d_enable) {
1222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Enabling C2D");
1222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) &&
1222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) {
1222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
1222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat = dest_color_format;
1222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ?
1222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    YCbCr420P : YCbCr420SP;
1223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (enabled)
1223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                c2d.destroy();
1223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enabled = false;
1223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!c2d.init()) {
1223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("open failed for c2d");
1223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
1223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else
1223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                enabled = true;
1223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (enabled)
1224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            c2d.destroy();
1224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enabled = false;
1224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
1224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->m_out_mem_ptr;
1225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_out_mem_ptr_client;
1225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
1226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd)
1226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bufadd;
1226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index = 0;
1227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufadd - omx->m_out_mem_ptr;
1227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < omx->drv_ctx.op_buf.actualcount) {
1227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
1227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
1227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool status;
1227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
1227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_lock(&omx->c_lock);
1227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            cache_clean_buffer(index);
1227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
1227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
1228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_baseaddress[index], pmem_baseaddress[index]);
1228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!status) {
1228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
1228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr_client[index].nFilledLen = 0;
1228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_unlock(&omx->c_lock);
1228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return &m_out_mem_ptr_client[index];
1228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int filledLen = 0;
1228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                c2d.get_output_filled_length(filledLen);
1228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr_client[index].nFilledLen = filledLen;
1229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cache_clean_invalidate_buffer(index);
1229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_unlock(&omx->c_lock);
1229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_mem_ptr_client[index].nFilledLen = 0;
1229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return &m_out_mem_ptr_client[index];
1229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
1229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
1229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
1230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd)
1230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bufadd;
1231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index = 0;
1231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufadd - m_out_mem_ptr_client;
1231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < omx->drv_ctx.op_buf.actualcount) {
1231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return &omx->m_out_mem_ptr[index];
1231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
1231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
1231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
1231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(unsigned int &buffer_size)
1232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_size = omx->drv_ctx.op_buf.buffer_size;
1232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
1232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
1232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Get buffer size failed");
1232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto fail_get_buffer_size;
1233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_get_buffer_size:
1233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::set_buffer_req(
1233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 buffer_size, OMX_U32 actual_count) {
1233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 expectedSize = enabled ? buffer_size_req : omx->drv_ctx.op_buf.buffer_size;
1234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_size < expectedSize) {
1234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("OP Requirements: Client size(%u) insufficient v/s requested(%u)",
1234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer_size, expectedSize);
1234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (actual_count < omx->drv_ctx.op_buf.actualcount) {
1234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("OP Requirements: Client count(%u) insufficient v/s requested(%u)",
1234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                actual_count, omx->drv_ctx.op_buf.actualcount);
1234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool reqs_updated = false;
1235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled) {
1235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // disallow changing buffer size/count while we have active allocated buffers
1235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocated_count > 0) {
1235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Cannot change C2D buffer size from %u to %u with %d active allocations",
1235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buffer_size_req, buffer_size, allocated_count);
1235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInvalidState;
1235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_size_req = buffer_size;
1236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_size > omx->drv_ctx.op_buf.buffer_size) {
1236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->drv_ctx.op_buf.buffer_size = buffer_size;
1236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            reqs_updated = true;
1236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (actual_count > omx->drv_ctx.op_buf.actualcount) {
1237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.op_buf.actualcount = actual_count;
1237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        reqs_updated = true;
1237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (reqs_updated) {
1237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.extradata_info.count = omx->drv_ctx.op_buf.actualcount;
1237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.extradata_info.size = omx->drv_ctx.extradata_info.count *
1237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->drv_ctx.extradata_info.buffer_size;
1237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->set_buffer_req(&(omx->drv_ctx.op_buf));
1237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
1238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *bufhdr)
1238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
1238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->free_output_buffer(bufhdr);
1239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled && omx->is_component_secure())
1239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
1239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!allocated_count || !bufhdr) {
1239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
1239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufhdr - m_out_mem_ptr_client;
1239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index >= omx->drv_ctx.op_buf.actualcount) {
1239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
1239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_fd[index] >= 0) {
1240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        munmap(pmem_baseaddress[index], buffer_size_req);
1240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(pmem_fd[index]);
1240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_fd[index] = -1;
1240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx->free_ion_memory(&op_buf_ion_info[index]);
1240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr[index].video_heap_ptr = NULL;
1241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocated_count > 0)
1241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocated_count--;
1241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
1241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocated_count = 0;
1241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!allocated_count) {
1241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&omx->c_lock);
1241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        c2d.close();
1241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        init_members();
1241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&omx->c_lock);
1241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
1242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
1242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
1242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
1242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled && omx->is_component_secure()) {
1243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
1243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->is_component_secure());
1243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
1243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bufferHdr || bytes > buffer_size_req) {
1243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
1243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u",
1243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)buffer_size_req, (unsigned int)bytes);
1244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
1244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
1244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
1244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
1244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            port,appData,omx->drv_ctx.op_buf.buffer_size);
1244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
1245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
1245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
1245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (int)omx->drv_ctx.op_buf.actualcount) {
1245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid header index %ld",
1245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               (long int)(temp_bufferHdr - omx->m_out_mem_ptr));
1245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
1245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int i = allocated_count;
1246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Allocate color-conversion buffers as cached to improve software-reading
1246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // performance of YUV (thumbnails). NOTE: These buffers will need an explicit
1246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // cache invalidation.
1246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
1246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req,buffer_alignment_req,
1246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
1246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ION_FLAG_CACHED);
1246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
1246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (op_buf_ion_info[i].ion_device_fd < 0) {
1247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
1247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
1247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
1247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_baseaddress[i] == MAP_FAILED) {
1247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
1247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(pmem_fd[i]);
1247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->free_ion_memory(&op_buf_ion_info[i]);
1248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
1248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
1248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
1248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get();
1248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info_client[i].offset = 0;
1248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
1248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list_client[i].nEntries = 1;
1249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
1249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
1249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
1249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nFilledLen = 0;
1249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nFlags = 0;
1249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
1249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
1249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
1250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
1250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pAppPrivate = appData;
1250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *bufferHdr = &m_out_mem_ptr_client[i];
1250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr);
1250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocated_count++;
1250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::is_component_secure()
1250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return secure_mode;
1251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
1251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
1251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
1251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dest_color_format = (OMX_COLOR_FORMATTYPE)
1252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
1252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
1252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){
1252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
12525b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC){
12526b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed;
1252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
1253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
1253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = ColorFormat;
1253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops(
1254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int index, unsigned int cmd)
1254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
1254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx || index >= omx->drv_ctx.op_buf.actualcount) {
1254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Invalid param", __func__);
1254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_flush_data flush_data;
1255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_custom_data custom_data;
1255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&flush_data, 0x0, sizeof(flush_data));
1255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&custom_data, 0x0, sizeof(custom_data));
1255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.vaddr = pmem_baseaddress[index];
1255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd;
1255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle;
1256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.length = buffer_size_req;
1256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    custom_data.cmd = cmd;
1256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    custom_data.arg = (unsigned long)&flush_data;
1256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d",
1256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
1256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            flush_data.fd, flush_data.handle, flush_data.vaddr,
1256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            flush_data.length);
1256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data);
1256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret < 0) {
1257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Cache %s failed: %s\n",
1257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
1257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                strerror(errno));
1257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
1257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_add(int nPortIndex)
1257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long i = 0;
1258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool buf_present = false;
1258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
1258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
1258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dynamic_buf_mode || !out_dynamic_list) {
1258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //check the buffer fd, offset, uv addr with list contents
1259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //If present increment reference.
1259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((out_dynamic_list[i].fd == fd) &&
1259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (out_dynamic_list[i].offset == offset)) {
1259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u",
1259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (!secure_mode) {
1259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr;
1259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
1260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               buf_present = true;
1260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
1260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buf_present) {
1260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //search for a entry to insert details of the new buffer
1260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (out_dynamic_list[i].dup_fd < 0) {
1260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].fd = fd;
1260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].offset = offset;
1261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].dup_fd = dup(fd);
1261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].ref_count++;
1261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u",
1261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
1261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr =
1261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len,
1261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          PROT_READ|PROT_WRITE, MAP_SHARED,
1261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0);
1262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //mmap returns (void *)-1 on failure and sets error code in errno.
1262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) {
1262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno);
1262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL;
1262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
1262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr;
1262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len;
1262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
1262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   pthread_mutex_unlock(&m_lock);
1263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_remove()
1263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long i = 0;
1264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dynamic_buf_mode || !out_dynamic_list) {
1264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) {
1264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
1264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap(out_dynamic_list[i].buffaddr,
1265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        out_dynamic_list[i].mapped_size);
1265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u",
1265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         close(out_dynamic_list[i].dup_fd);
1265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         out_dynamic_list[i].dup_fd = -1;
1265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
1265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (out_dynamic_list) {
1266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(out_dynamic_list);
1266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        out_dynamic_list = NULL;
1266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
1266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::send_codec_config() {
1266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag) {
1266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p1 = 0; // Parameter - 1
1267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p2 = 0; // Parameter - 2
1267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long ident = 0;
1267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&m_lock);
1267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n");
1267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (m_etb_q.m_size) {
1267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_etb_q.pop_entry(&p1,&p2,&ident);
1267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
1267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
1267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
1268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
1268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx_report_error();
1268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
1268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
1268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
1268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
1268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
1269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
1269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
1269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx_report_error ();
1269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
1269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pending_input_buffers++;
12696b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
1269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
1269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
1269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
1270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
1270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
1270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_BUFFERHEADERTYPE *)p1);
1270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
1270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&m_lock);
1270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::perf_control()
1271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lib = NULL;
1271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_handle = 0;
1271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock_acquire = NULL;
1271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock_release = NULL;
1271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::~perf_control()
1272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_handle != 0 && m_perf_lock_release) {
1272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("NOTE2: release perf lock");
1272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release(m_perf_handle);
1272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib) {
1272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(m_perf_lib);
1272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0};
1273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock;
1273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state)
1273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (load_lib() == false) {
1273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return;
1273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock.lock();
1274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* 0x4401 maps to video decode playback hint
1274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * in perflock, enum number is 44 and state
1274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * being sent on perflock acquire is 01 (true)
1274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
1274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int arg = 0x4401;
1274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (state == true) {
1274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_inst_count++;
1274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (state == false) {
1275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_inst_count--;
1275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) {
1275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int));
1275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_acquired = true;
1275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Video slvp perflock acquired");
1275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) {
1275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release(mpctl_obj.vid_disp_handle);
1275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_acquired = false;
1276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Video slvp perflock released");
1276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock.unlock();
1276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::request_cores(int frame_duration_us)
1276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) {
1276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool retVal = load_lib();
1277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (retVal && m_perf_lock_acquire && m_perf_handle == 0) {
1277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int arg = 0x700 /*base value*/ + 2 /*cores*/;
1277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int));
1277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_handle) {
1277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("perf lock acquired");
1277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::perf_control::load_lib()
1278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char perf_lib_path[PROPERTY_VALUE_MAX] = {0};
1278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib)
1278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
1278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) {
1278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library");
1278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto handle_err;
1278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) {
1279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror());
1279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto handle_err;
1279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq");
1279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_lock_acquire == NULL) {
1279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq");
1279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto handle_err;
1279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel");
1280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_lock_release == NULL) {
1280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel");
1280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto handle_err;
1280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
1280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelhandle_err:
1280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib) {
1281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(m_perf_lib);
1281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lib = NULL;
1281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return false;
1281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth,
1281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            unsigned long nMaxFrameHeight)
1281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = 0;
1282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long min_res_buf_count = 0;
1282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    eRet = enable_smoothstreaming();
1282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone) {
1282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver");
1282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu",
1283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             nMaxFrameWidth,
1283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             nMaxFrameHeight);
1283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_mode = true;
1283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_width = nMaxFrameWidth;
1283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_height = nMaxFrameHeight;
1283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     //Get upper limit buffer count for min supported resolution
1283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     struct v4l2_format fmt;
1283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.height = m_decoder_capability.min_height;
1284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.width = m_decoder_capability.min_width;
1284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.pixelformat = output_capability;
1284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (ret) {
1284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u",
1284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_decoder_capability.min_height,
1284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_decoder_capability.min_width);
1284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return OMX_ErrorUnsupportedSetting;
1285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req");
1285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     min_res_buf_count = drv_ctx.op_buf.mincount;
1285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u",
1286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width);
1286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12862fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nLeft = 0;
12863fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nTop = 0;
12864fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nWidth = m_smoothstreaming_width;
12865fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nHeight = m_smoothstreaming_height;
12866fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     update_resolution(m_smoothstreaming_width, m_smoothstreaming_height,
1286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       m_smoothstreaming_width, m_smoothstreaming_height);
1286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = is_video_session_supported();
1287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("video session is not supported");
1287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     //Get upper limit buffer size for max smooth streaming resolution set
1287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.pixelformat = output_capability;
1288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (ret) {
1288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback");
1288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return OMX_ErrorUnsupportedSetting;
1288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req!!");
1288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u",
1289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)drv_ctx.op_buf.buffer_size);
1289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.mincount = min_res_buf_count;
1289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.actualcount = min_res_buf_count;
1289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size;
1289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = set_buffer_req(&drv_ctx.op_buf);
1289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to set_buffer_req");
1290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req!!!");
1290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u",
1290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size);
1291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     return eRet;
1291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//static
1291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) {
1291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef FLEXYUV_SUPPORTED
1291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorUndefined;
1291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
1291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pParam == NULL) {
1292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("describeColorFormat: invalid params");
1292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam;
1292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MediaImage *img = &(params->sMediaImage);
1292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch(params->eColorFormat) {
1292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m:
1293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
1293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
1293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mNumPlanes = 3;
1293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // mWidth and mHeight represent the W x H of the largest plane
1293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // In our case, this happens to be the Stride x Scanlines of Y plane
1293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mWidth = params->nFrameWidth;
1293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mHeight = params->nFrameHeight;
1293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight);
1293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mBitDepth = 8;
1294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 0 (Y)
1294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mOffset = 0;
1294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mColInc = 1;
1294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride
1294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mHorizSubsampling = 1;
1294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mVertSubsampling = 1;
1294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 1 (U)
1294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight;
1294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mColInc = 2;           //interleaved UV
1294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mRowInc =
1295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mHorizSubsampling = 2;
1295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mVertSubsampling = 2;
1295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 2 (V)
1295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1;
1295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mColInc = 2;           //interleaved UV
1295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mRowInc =
1295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mHorizSubsampling = 2;
1295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mVertSubsampling = 2;
1296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420Planar:
1296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420SemiPlanar:
1296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // We need not describe the standard OMX linear formats as these are
1296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // understood by client. Fail this deliberately to let client fill-in
1296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorUnsupportedSetting;
1296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
1297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Rest all formats which are non-linear cannot be described
1297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat);
1297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
1297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorNone;
1297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
1297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat);
1297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("  FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight);
1297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("  YWidth x YHeight : %d x %d", img->mWidth, img->mHeight);
1297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (size_t i = 0; i < img->mNumPlanes; ++i) {
1298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("  Plane[%zu] : offset=%d / xStep=%d / yStep = %d",
1298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc);
1298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //FLEXYUV_SUPPORTED
1298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::prefetchNewBuffers() {
1298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_decoder_cmd dec;
1299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t prefetch_count;
1299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t prefetch_size;
1299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t want_size;
1299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t have_size;
1299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int color_fmt, rc;
1299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_calculated_size;
1299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_buffer_size;
1299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_buffer_count;
1299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t old_buffer_size;
1299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t old_buffer_count;
1300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&dec, 0 , sizeof(dec));
1300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Old size : %zu, count : %d, width : %u, height : %u\n",
1300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount,
1300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
1300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height);
1300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT;
1300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
1300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno);
1300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n",
1301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dec.raw.data[0], dec.raw.data[1]);
1301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)drv_ctx.output_format) {
1301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VDEC_YUV_FORMAT_NV12:
1301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = COLOR_FMT_NV12;
1301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VDEC_YUV_FORMAT_NV12_UBWC:
1301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = COLOR_FMT_NV12_UBWC;
1302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
13021b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case VDEC_YUV_FORMAT_NV12_TP10_UBWC:
13022b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        color_fmt = COLOR_FMT_NV12_BPP10_UBWC;
13023b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
1302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = -1;
1302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Color format : %x not supported for secure memory prefetching\n", drv_ctx.output_format);
1302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height);
1303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n",
1303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_reconfig_width, m_reconfig_height, new_calculated_size);
1303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size;
1303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_count = dec.raw.data[1];
1303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    old_buffer_size = drv_ctx.op_buf.buffer_size;
1303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    old_buffer_count = drv_ctx.op_buf.actualcount;
1303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count;
1303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prefetch_count = new_buffer_count;
1304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prefetch_size = new_buffer_size - old_buffer_size;
1304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    want_size = new_buffer_size * new_buffer_count;
1304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    have_size = old_buffer_size * old_buffer_count;
1304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (want_size > have_size) {
1304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size);
1304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size);
1304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ion_fd = open(MEM_DEVICE, O_RDONLY);
1305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ion_fd < 0) {
1305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd);
1305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return;
1305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data));
1305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data));
1305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions));
1305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count);
1305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) {
1306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("prefetch data allocation failed");
1306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto prefetch_exit;
1306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (uint32_t i = 0; i < prefetch_count; i++) {
1306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizes[i] = prefetch_size;
1306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].nr_sizes = prefetch_count;
1307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].sizes = sizes;
1307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].vmid = ION_FLAG_CP_PIXEL;
1307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->nr_regions = 1;
1307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->regions = regions;
1307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID);
1307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        custom_data->cmd = ION_IOC_PREFETCH;
1307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        custom_data->arg = (unsigned long )prefetch_data;
1307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data);
1308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
1308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno);
1308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelprefetch_exit:
1308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(ion_fd);
1308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(sizes);
1308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(regions);
1308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(prefetch_data);
1309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(custom_data);
1309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
13093