omx_vdec_v4l2.cpp revision b50ee0d49e33884a5f998649944fff0a8e27cda6
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
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingWidth = 1920;
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_U32 maxSmoothStreamingHeight = 1088;
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* async_message_thread (void *input)
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *buffer;
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pollfd pfds[2];
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event dqevent;
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec *omx = reinterpret_cast<omx_vdec*>(input);
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].events = POLLIN | POLLERR;
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].fd = omx->drv_ctx.video_driver_fd;
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].fd = omx->m_poll_efd;
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int error_code = 0,rc=0,bytes_read = 0,bytes_written = 0;
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: Async thread start");
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoDecCallBackThread", 0, 0, 0);
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->async_thread_force_stop) {
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = poll(pfds, 2, POLL_TIMEOUT);
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc) {
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Poll timedout");
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (rc < 0 && errno != EINTR && errno != EAGAIN) {
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno);
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) {
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("async_message_thread interrupted to be exited");
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) {
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_msginfo vdec_msg;
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&vdec_msg, 0, sizeof(vdec_msg));
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = omx->drv_ctx.num_planes;
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.client_data=(void*)&v4l2_buf;
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.len=plane[0].bytesused;
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.bufferaddr=(void*)plane[0].m.userptr;
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (uint64_t)v4l2_buf.timestamp.tv_usec;
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) {
20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_msginfo vdec_msg;
20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = 1;
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_INPUT_BUFFER_DONE;
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.input_frame_clientdata=(void*)&v4l2_buf;
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pfds[0].revents & POLLPRI) {
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent);
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dqevent.type == V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT ) {
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_CONFIG_CHANGED;
22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.picsize.frame_height = ptr[0];
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.picsize.frame_width = ptr[1];
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Port Reconfig received insufficient");
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(ptr[2] & V4L2_EVENT_BITDEPTH_FLAG) {
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->dpb_bit_depth = ptr[3];
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig Bitdepth change - %d", ptr[3]);
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(ptr[2] & V4L2_EVENT_PICSTRUCT_FLAG) {
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->m_progressive = ptr[4];
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("VIDC Port Reconfig PicStruct change - %d", ptr[4]);
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_INPUT_DONE;
24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Input Flush Done Recieved");
24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_RESP_FLUSH_OUTPUT_DONE;
25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Output Flush Done Recieved");
25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) {
26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_HW_OVERLOAD;
26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Overload received");
26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED) {
27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode=VDEC_MSG_EVT_HW_UNSUPPORTED;
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code=VDEC_S_SUCCESS;
27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Unsupported received");
27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode = VDEC_MSG_EVT_HW_ERROR;
28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code = VDEC_S_SUCCESS;
28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("SYS Error Recieved");
28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exited");
28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE) {
28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("REFERENCE RELEASE EVENT RECVD fd = %d offset = %d", ptr[0], ptr[1]);
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER) {
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int *ptr = (unsigned int *)(void *)dqevent.u.data;
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_msginfo vdec_msg;
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Release unqueued buffer event recvd fd = %d offset = %d", ptr[0], ptr[1]);
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.memory = V4L2_MEMORY_USERPTR;
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.length = omx->drv_ctx.num_planes;
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.m.planes = plane;
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.index = ptr[5];
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf.flags = 0;
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE;
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.status_code = VDEC_S_SUCCESS;
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.client_data = (void*)&v4l2_buf;
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.len = 0;
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.bufferaddr = (void*)(intptr_t)ptr[2];
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg.msgdata.output_frame.time_stamp = ((uint64_t)ptr[3] * (uint64_t)1000000) +
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (uint64_t)ptr[4];
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&vdec_msg) < 0) {
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("async_message_thread Exitedn");
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("VIDC Some Event recieved");
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                continue;
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: Async thread stop");
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread_dec(void *input)
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec* omx = reinterpret_cast<omx_vdec*>(input);
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char id;
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int n;
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd_set readFds;
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int res = 0;
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct timeval tv;
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: message thread start");
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoDecMsgThread", 0, 0, 0);
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->message_thread_stop) {
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tv.tv_sec = 2;
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tv.tv_usec = 0;
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FD_ZERO(&readFds);
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FD_SET(omx->m_pipe_in, &readFds);
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv);
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (res < 0) {
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno));
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (res == 0 /*timeout*/ || omx->message_thread_stop) {
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        n = read(omx->m_pipe_in, &id, 1);
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (0 == n) {
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (1 == n) {
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->process_event_cb(omx, id);
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((n < 0) && (errno != EINTR)) {
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno);
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_vdec: message thread stop");
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_vdec *omx, unsigned char id)
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret_value;
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec: post_message %d pipe out%d", id,omx->m_pipe_out);
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret_value = write(omx->m_pipe_out, &id, 1);
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret_value <= 0) {
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno));
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value);
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::~omx_cmd_queue()
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Nothing to do
38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor
39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id)
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) {
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].id       = id;
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].param1   = p1;
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_q[m_write].param2   = p2;
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_write++;
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_size ++;
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) {
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_write = 0;
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s()::Command Queue Full", __func__);
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id)
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_size > 0) {
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *id = m_q[m_read].id;
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *p1 = m_q[m_read].param1;
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *p2 = m_q[m_read].param2;
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Move the read pointer ahead
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ++m_read;
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        --m_size;
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) {
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_read = 0;
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_vdec::omx_cmd_queue::get_q_msg_type()
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_q[m_read].id;
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::ts_arr_list()
44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //initialize timestamps array
44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_ts_arr_list, 0, ( sizeof(ts_entry) * MAX_NUM_INPUT_OUTPUT_BUFFERS) );
44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::ts_arr_list::~ts_arr_list()
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //free m_ts_arr_list?
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::insert_ts(OMX_TICKS ts)
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool duplicate_ts = false;
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //insert at the first available empty location
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_ts_arr_list[idx].valid) {
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //found invalid or empty entry, save timestamp
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_ts_arr_list[idx].valid = true;
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_ts_arr_list[idx].timestamp = ts;
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Insert_ts(): Inserting TIMESTAMP (%lld) at idx (%d)",
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ts, idx);
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (idx == MAX_NUM_INPUT_OUTPUT_BUFFERS) {
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Timestamp array list is FULL. Unsuccessful insert");
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::pop_min_ts(OMX_TICKS &ts)
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int min_idx = -1;
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_TICKS min_ts = 0;
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_ts_arr_list[idx].valid) {
48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //found valid entry, save index
48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (min_idx < 0) {
49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //first valid entry
49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_ts = m_ts_arr_list[idx].timestamp;
49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_idx = idx;
49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (m_ts_arr_list[idx].timestamp < min_ts) {
49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_ts = m_ts_arr_list[idx].timestamp;
49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                min_idx = idx;
49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (min_idx < 0) {
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //no valid entries found
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Timestamp array list is empty. Unsuccessful pop");
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts = 0;
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = false;
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts = m_ts_arr_list[min_idx].timestamp;
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ts_arr_list[min_idx].valid = false;
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Pop_min_ts:Timestamp (%lld), index(%d)",
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ts, min_idx);
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::ts_arr_list::reset_ts_list()
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = true;
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int idx = 0;
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("reset_ts_list(): Resetting timestamp array list");
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for ( ; idx < MAX_NUM_INPUT_OUTPUT_BUFFERS; idx++) {
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ts_arr_list[idx].valid = false;
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// factory function executed by the core to create instances
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void)
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (new omx_vdec);
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int devicefd, size_t size, void* base,
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_user_handle_t handle, int ionMapfd)
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) devicefd;
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) size;
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) base;
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) handle;
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) ionMapfd;
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //    ionInit(devicefd, base, size, 0 , MEM_DEVICE,handle,ionMapfd);
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelVideoHeap::VideoHeap(int fd, size_t size, void* base)
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // dup file descriptor, map once, use pmem
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init(dup(fd), base, size, 0 , MEM_DEVICE);
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
557b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
558b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool is_platform_tp10capture_supported()
559b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{
560b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    char platform_name[PROPERTY_VALUE_MAX] = {0};
561b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    property_get("ro.board.platform", platform_name, "0");
562b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (!strncmp(platform_name, "msmcobalt", 9)) {
563b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_HIGH("TP10 on capture port is supported");
564b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        return true;
565b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
566b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    DEBUG_PRINT_HIGH("TP10 on capture port is not supported");
567b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    return false;
568b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel}
569b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::omx_vdec
57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Constructor
57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None
57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::omx_vdec(): m_error_propogated(false),
58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_state(OMX_StateInvalid),
58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_app_data(NULL),
58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_mem_ptr(NULL),
58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr(NULL),
58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_flush_progress (false),
58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_flush_progress (false),
59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_use_buffer (false),
59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_use_buffer (false),
59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers(false),
59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_output_pmem(OMX_FALSE),
59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_region_smi(OMX_FALSE),
59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_pvt_entry_pmem(OMX_FALSE),
59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers(0),
59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers(0),
59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bm_count(0),
59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bm_count(0),
60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bPopulated(OMX_FALSE),
60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bPopulated(OMX_FALSE),
60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_flags(0),
60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr(NULL),
60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_bEnabled(OMX_TRUE),
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_bEnabled(OMX_TRUE),
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_in_alloc_cnt(0),
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list(NULL),
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry(NULL),
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info(NULL),
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_parser(NULL),
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    arbitrary_bytes (true),
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    psource_frame (NULL),
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pdest_frame (NULL),
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_inp_heap_ptr (NULL),
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_phdr_pmem_ptr(NULL),
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_inp_bm_count (0),
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    codec_type_parse ((codec_type)0),
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame_meta (true),
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_count (0),
62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nal_count (0),
62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nal_length(0),
62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    look_ahead_nal (false),
62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame(0),
62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_buffer(NULL),
62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    first_frame_size (0),
62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_device_file_ptr(NULL),
62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_vc1_profile((vc1_profile_type)0),
63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_last_au_ts(LLONG_MAX),
63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264_last_au_flags(0),
63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disp_hor_size(0),
63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disp_vert_size(0),
63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts(LLONG_MAX),
63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts_actual(LLONG_MAX),
63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rst_prev_ts(true),
63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frm_int(0),
638fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_fps_received(0),
639fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_fps_prev(0),
640fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_drc_enable(0),
64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    in_reconfig(false),
64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_display_id(NULL),
64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_extradata(0),
64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reject_avc_1080p_mp (0),
64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_enable_android_native_buffers(OMX_FALSE),
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_android_native_buffers(OMX_FALSE),
64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_desc_buffer_ptr(NULL),
65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_mode(false),
65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocate_native_handle(false),
65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_other_extradata(NULL),
65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_profile(0),
65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_set_fps(false),
65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    stereo_output_mode(HAL_NO_3D),
65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_last_rendered_TS(-1),
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_queued_codec_config_count(0),
65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    current_perf_level(V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL),
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_scaling_to_non_secure_opb(false),
660b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_force_compressed_for_dpb(true),
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_is_display_session(false)
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_in = -1;
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_out = -1;
66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = -1;
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_driver_fd = -1;
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.extradata_info.ion.fd_ion_data.fd = -1;
66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Assumption is that , to begin with , we have all the frames with decoder */
66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In %u bit OMX vdec Constructor", (unsigned int)sizeof(long) * 8);
67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_debug,0,sizeof(m_debug));
67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.level", property_value, "1");
674b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    debug_level = strtoul(property_value, NULL, 16);
67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In OMX vdec Constructor");
67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.perf", property_value, "0");
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    perf_flag = atoi(property_value);
68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("vidc.dec.debug.perf is %d", perf_flag);
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec_time.start();
68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
685fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    proc_frms = latency = 0;
68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_n_filled_len = 0;
68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.ts", property_value, "0");
68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_timestamp = atoi(property_value);
69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.ts value is %d",m_debug_timestamp);
69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        time_stamp_dts.set_timestamp_reorder_mode(true);
69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        time_stamp_dts.enable_debug_print(true);
69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.concealedmb", property_value, "0");
69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_concealedmb = atoi(property_value);
69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.concealedmb value is %d",m_debug_concealedmb);
70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.profile.check", property_value, "0");
70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reject_avc_1080p_mp = atoi(property_value);
70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.profile.check value is %d",m_reject_avc_1080p_mp);
70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.log.in", property_value, "0");
70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.in_buffer_log = atoi(property_value);
70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.log.out", property_value, "0");
71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_buffer_log = atoi(property_value);
71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.meta.log.out", property_value, "0");
71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_meta_buffer_log = atoi(property_value);
71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.log.loc", property_value, "");
72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (*property_value)
72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.120fps.enabled", property_value, "0");
72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //if this feature is not enabled then reset this value -ve
72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(atoi(property_value)) {
73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("feature 120 FPS decode enabled");
73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_last_rendered_TS = 0;
73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.dyn.disabled", property_value, "0");
73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_dynamic_buf_mode = atoi(property_value);
73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.dyn.disabled value is %d",m_disable_dynamic_buf_mode);
73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
739fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    property_value[0] = '\0';
740fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    property_get("vidc.dec.drc.enable", property_value, "0");
741fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (atoi(property_value)) {
742fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_drc_enable = true;
743fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_HIGH("DRC enabled");
744fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
745fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_
74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0");
74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_ubwc_mode = atoi(property_value);
75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("UBWC mode is %s", m_disable_ubwc_mode ? "disabled" : "enabled");
75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_disable_ubwc_mode = true;
75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_cmp,0,sizeof(m_cmp));
75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_cb,0,sizeof(m_cb));
75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&drv_ctx,0,sizeof(drv_ctx));
75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&m_client_color_space, 0, sizeof(DescribeColorAspectsParams));
763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&m_internal_color_space, 0, sizeof(DescribeColorAspectsParams));
764fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    memset(&m_client_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams));
765fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    memset(&m_internal_hdr_info, 0, sizeof(DescribeHDRStaticInfoParams));
76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    msg_thread_id = 0;
76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_id = 0;
76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    msg_thread_created = false;
77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_created = false;
77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_force_stop = false;
77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    message_thread_stop = false;
77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&drv_ctx.extradata_info, 0, sizeof(drv_ctx.extradata_info));
77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* invalidate m_frame_pack_arrangement */
77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_frame_pack_arrangement, 0, sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_frame_pack_arrangement.cancel_flag = 1;
78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.timestamp_adjust = false;
78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_vendor_config.pData = NULL;
78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&m_lock, NULL);
78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&c_lock, NULL);
78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&buf_lock, NULL);
78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_init(&m_cmd_lock,0,0);
78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_init(&m_safe_flush, 0, 0);
78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    streaming[CAPTURE_PORT] =
79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[OUTPUT_PORT] = false;
79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char extradata_value[PROPERTY_VALUE_MAX] = {0};
79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.extradata", extradata_value, "0");
79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug_extradata = atoi(extradata_value);
79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("vidc.dec.debug.extradata value is %d",m_debug_extradata);
79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_fill_output_msg = OMX_COMPONENT_GENERATE_FTB;
79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    client_buffers.set_vdec_client(this);
79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dynamic_buf_mode = false;
80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    out_dynamic_list = NULL;
80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = false;
80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_downscalar_width = 0;
80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_downscalar_height = 0;
80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_force_down_scalar = 0;
80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reconfig_height = 0;
80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_reconfig_width = 0;
80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_mode = false;
80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_width = 0;
80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_height = 0;
81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_q6_platform = false;
81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_control.send_hint_to_mpctl(true);
81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_input_pass_buffer_fd = false;
81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_extradata_info, 0, sizeof(m_extradata_info));
814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_client_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
819fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mRange =  ColorAspects::RangeUnspecified;
822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.sAspects.mTransfer = ColorAspects::TransferUnspecified;
825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_internal_color_space.nSize = sizeof(DescribeColorAspectsParams);
826fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
827fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_client_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_INPUT_PORT_INDEX;
828fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_internal_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
829fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    m_change_client_hdr_info = false;
830fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    pthread_mutex_init(&m_hdr_info_client_lock, NULL);
831b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_dither_config = is_platform_tp10capture_supported() ? DITHER_DISABLE : DITHER_ALL_COLORSPACE;
832b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_color_space = EXCEPT_BT2020;
83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = {
83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_SUFFICIENT,
83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_CHANGED_INSUFFICIENT,
83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_PORT_SETTINGS_BITDEPTH_CHANGED_INSUFFICIENT,
84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_RELEASE_BUFFER_REFERENCE,
84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_RELEASE_UNQUEUED_BUFFER,
84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_SYS_ERROR,
84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_HW_OVERLOAD,
84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_HW_UNSUPPORTED
84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd)
84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < array_sz) {
86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (--i; i >=0 ; i--) {
86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&sub, 0, sizeof(sub));
87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sub.type = event_type[i];
87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid input: %d", fd);
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::~omx_vdec
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Destructor
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::~omx_vdec()
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info = NULL;
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("In OMX vdec Destructor");
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (msg_thread_created) {
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Signalling close to OMX Msg Thread");
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        message_thread_stop = true;
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_message(this, OMX_COMPONENT_CLOSE_MSG);
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Waiting on OMX Msg Thread exit");
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_join(msg_thread_id,NULL);
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_pipe_in);
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_pipe_out);
93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_in = -1;
93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pipe_out = -1;
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(eventfd_write(m_poll_efd, 1)) {
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno);
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         async_thread_force_stop = true;
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (async_thread_created)
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_join(async_thread_id,NULL);
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsubscribe_to_events(drv_ctx.video_driver_fd);
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(m_poll_efd);
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(drv_ctx.video_driver_fd);
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&m_lock);
94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&c_lock);
94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&buf_lock);
94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_destroy(&m_cmd_lock);
947fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    pthread_mutex_destroy(&m_hdr_info_client_lock);
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("--> TOTAL PROCESSING TIME");
95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec_time.end();
95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("Exit OMX vdec Destructor: fd=%d",drv_ctx.video_driver_fd);
95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_control.send_hint_to_mpctl(false);
95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint release_buffers(omx_vdec* obj, enum vdec_buffer buffer_type)
95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = 0;
96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if(buffer_type == VDEC_BUFFER_TYPE_INPUT) {
96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = 0;
96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(obj->drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_dpb(bool is_split_mode, int dpb_color_format)
97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[2];
97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("DPB mode: %s DPB color format: %s OPB color format: %s",
98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         is_split_mode ? "split" : "combined",
98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC ? "nv12_ubwc":
98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC ? "nv12_10bit_ubwc":
98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         dpb_color_format == V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE ? "same as opb":
98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "unknown",
98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         capture_capability == V4L2_PIX_FMT_NV12 ? "nv12":
98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         capture_capability == V4L2_PIX_FMT_NV12_UBWC ? "nv12_ubwc":
988b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel         capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC ? "nv12_10bit_ubwc":
98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "unknown");
99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_MODE;
99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (is_split_mode) {
99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_SECONDARY;
99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_OUTPUT_PRIMARY;
99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_DPB_COLOR_FORMAT;
99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].value = dpb_color_format;
100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 2;
100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_EXT_CTRLS, &controls);
100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set ext ctrls for opb_dpb: %d\n", rc);
100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1014b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE omx_vdec::decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt)
101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
1019b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool cpu_access = (capture_capability != V4L2_PIX_FMT_NV12_UBWC) &&
1020b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        capture_capability != V4L2_PIX_FMT_NV12_TP10_UBWC;
1021b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool tp10_enable = !cpu_access &&
1022b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10;
1023b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool dither_enable = true;
1024b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1025b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    switch (m_dither_config) {
1026b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_DISABLE:
1027b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = false;
1028b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1029b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_COLORSPACE_EXCEPTBT2020:
1030b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = (m_color_space == EXCEPT_BT2020);
1031b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1032b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case DITHER_ALL_COLORSPACE:
1033b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        dither_enable = true;
1034b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1035b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    default:
1036b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_ERROR("Unsupported dither configuration:%d", m_dither_config);
1037b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1038b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1039b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (tp10_enable && !dither_enable) {
1040b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_TP10_UBWC;
1041b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        capture_capability = V4L2_PIX_FMT_NV12_TP10_UBWC;
1042b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1043b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
1044b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1045b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1046b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1047b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("%s: Failed get format on capture mplane", __func__);
1048b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return OMX_ErrorUnsupportedSetting;
1049b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1050b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1051b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1052b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1053b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
1054b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return OMX_ErrorUnsupportedSetting;
1055b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1056b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1057b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1058b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_IDLE_PENDING) &&
106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Invalid state to decide on dpb-opb split");
106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cpu_access) {
106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Disabled split mode for VP9. In split mode the DPB buffers are part of the internal
107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * scratch buffers and the driver does not does the reference buffer management for
107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * scratch buffers. In case of VP9 with spatial scalability, when a sequence changed
107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * event is received with the new resolution, and when a flush is sent by the driver, it
107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * releases all the references of internal scratch buffers. However as per the VP9
107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * spatial scalability, even after the flush, the buffers which have not yet received
107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * release reference event should not be unmapped and freed. Currently in driver,
107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * reference buffer management of the internal scratch buffer is not implemented
107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * and hence the DPB buffers get unmapped. For other codecs it does not matter
107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * as with the new SPS/PPS, the DPB is flushed.
107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             */
1080b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bool is_not_vp9 = eCompressionFormat != OMX_VIDEO_CodingVP9;
1081b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bool eligible_for_split_dpb_ubwc =
1082b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               m_progressive == MSM_VIDC_PIC_STRUCT_PROGRESSIVE &&     //@ Due to Venus limitation for Interlaced, Split mode enabled only for Progressive.
1083b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               is_not_vp9                                       &&     //@ Split mode disabled for VP9.
1084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               !drv_ctx.idr_only_decoding                       &&     //@ Split mode disabled for Thumbnail usecase.
1085b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel               !m_disable_split_mode;                                  //@ Set prop to disable split mode
1086b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1087b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            //Since opb is linear, dpb should also be linear.
1088b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (split_opb_dpb_with_same_color_fmt) {
1089b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eligible_for_split_dpb_ubwc = false;
1090b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            }
1091b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
1092b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (eligible_for_split_dpb_ubwc) {
109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //split DPB-OPB
109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB -> UBWC , OPB -> Linear
109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
1096b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            } else if (split_opb_dpb_with_same_color_fmt) {
109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //DPB -> Linear, OPB -> Linear
109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //DPB-OPB combined linear
110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //split DPB-OPB
110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //DPB -> UBWC, OPB -> Linear
110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else { //no cpu access
110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_8) {
1110b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (split_opb_dpb_with_same_color_fmt) {
111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //split DPB-OPB
111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB -> UBWC, OPB -> UBWC
111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_UBWC);
111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DPB-OPB combined UBWC
111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_NONE);
111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (dpb_bit_depth == MSM_VIDC_BIT_DEPTH_10) {
1119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (dither_enable) {
1120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //split DPB-OPB
1121b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //DPB -> TP10UBWC, OPB -> UBWC
1122b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eRet = set_dpb(true, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1123b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            } else {
1124b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //combined DPB-OPB
1125b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                //DPB -> TP10UBWC, OPB -> TP10UBWC
1126b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                eRet = set_dpb(false, V4L2_MPEG_VIDC_VIDEO_DPB_COLOR_FMT_TP10_UBWC);
1127b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            }
112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet) {
113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Failed to set DPB buffer mode: %d", eRet);
113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1134b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::enable_downscalar()
114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (is_down_scalar_enabled) {
114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: already enabled", __func__);
114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec::enable_downscalar");
115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = decide_dpb_buffer_mode(true);
115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: decide_dpb_buffer_mode Failed ", __func__);
115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = true;
115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0x0, sizeof(struct v4l2_control));
115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_KEEP_ASPECT_RATIO;
116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed to set VIDEO_KEEP_ASPECT_RATIO", __func__);
116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::disable_downscalar()
117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!is_down_scalar_enabled) {
117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("omx_vdec::disable_downscalar: already disabled");
117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = decide_dpb_buffer_mode(false);
118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s:decide_dpb_buffer_mode failed\n", __func__);
118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_down_scalar_enabled = false;
118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::decide_downscalar()
119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum color_fmts color_format;
11952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_U32 width, height;
119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1197b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (capture_capability == V4L2_PIX_FMT_NV12_TP10_UBWC) {
1198b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        rc = disable_downscalar();
1199b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (rc) {
1200b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_ERROR("Disable downscalar failed!");
1201b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            return rc;
1202b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1203b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        return 0;
1204b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
1205b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if  (!m_downscalar_width || !m_downscalar_height) {
120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: downscalar not supported", __func__);
120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_force_down_scalar) {
121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: m_force_down_scalar %d ", __func__, m_force_down_scalar);
121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return rc;
122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    height = fmt.fmt.pix_mp.height;
12262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    width = fmt.fmt.pix_mp.width;
12272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("%s: driver wxh = %dx%d, downscalar wxh = %dx%d m_is_display_session = %d", __func__,
122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, m_downscalar_width, m_downscalar_height, m_is_display_session);
123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if ((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height >= m_downscalar_width * m_downscalar_height) &&
123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         m_is_display_session) {
123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = enable_downscalar();
123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc < 0) {
123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        width = m_downscalar_width > fmt.fmt.pix_mp.width ?
124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fmt.fmt.pix_mp.width : m_downscalar_width;
12412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        height = m_downscalar_height > fmt.fmt.pix_mp.height ?
124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fmt.fmt.pix_mp.height : m_downscalar_height;
124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (capture_capability) {
124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12:
124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12;
124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_UBWC:
124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_UBWC;
124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_TP10_UBWC:
125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_BPP10_UBWC;
125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Color format not recognized\n");
125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = OMX_ErrorUndefined;
125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return rc;
125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = disable_downscalar();
126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc < 0) {
126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
12692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.height = height;
12702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.width = width;
127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = capture_capability;
127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed set format on capture mplane", __func__);
127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = get_buffer_req(&drv_ctx.op_buf);
127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Failed to get output buffer requirements", __func__);
128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return rc;
128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::OMXCntrlProcessMsgCb
129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL Client callbacks are generated through this routine. The decoder
129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   provides the thread context for this routine.
129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ctxt -- Context information related to the self.
129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   id   -- Event identifier. This could be any of the following:
129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   1. Command completion event
129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   2. Buffer done callback event
130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   3. Frame done callback event
130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::process_event_cb(void *ctxt, unsigned char id)
130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1; // Parameter - 1
130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2; // Parameter - 2
131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident;
131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned qsize=0; // qsize
131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec *pThis = (omx_vdec *) ctxt;
131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!pThis) {
131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s()::Context is incorrect, bailing out",
131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__);
131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Protect the shared queue data structure
132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    do {
132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Read the message id's from the queue*/
132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&pThis->m_lock);
132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        qsize = pThis->m_cmd_q.m_size;
132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize) {
132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pThis->m_cmd_q.pop_entry(&p1, &p2, &ident);
132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize = pThis->m_ftb_q.m_size;
133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qsize) {
133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pThis->m_ftb_q.pop_entry(&p1, &p2, &ident);
133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize == 0 && pThis->m_state != OMX_StatePause) {
133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize = pThis->m_etb_q.m_size;
133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qsize) {
133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pThis->m_etb_q.pop_entry(&p1, &p2, &ident);
134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&pThis->m_lock);
134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*process message if we have one*/
134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (qsize > 0) {
134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id = ident;
134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (id) {
134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT:
134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pThis->m_cb.EventHandler) {
135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (p1) {
135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandStateSet:
135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_state = (OMX_STATETYPE) p2;
135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandStateSet complete, m_state = %d",
135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->m_state);
135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL);
135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_EventError:
136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (p2 == OMX_StateInvalid) {
136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("OMX_EventError: p2 is OMX_StateInvalid");
136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_state = (OMX_STATETYPE) p2;
136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_EventError, OMX_ErrorInvalidState, p2, NULL);
136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (p2 == (unsigned long)OMX_ErrorHardware) {
136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->omx_report_error();
136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_EventError, p2, (OMX_U32)NULL, NULL );
137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandPortDisable:
137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandPortDisable complete for port [%lu]", p2);
137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (BITMASK_PRESENT(&pThis->m_flags,
137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    BITMASK_SET(&pThis->m_flags, OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    break;
137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (p2 == OMX_CORE_OUTPUT_PORT_INDEX) {
138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_ERRORTYPE eRet = OMX_ErrorNone;
138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (release_buffers(pThis, VDEC_BUFFER_TYPE_OUTPUT))
138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Failed to release output buffers");
138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_ERRORTYPE eRet1 = pThis->get_buffer_req(&pThis->drv_ctx.op_buf);
138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    pThis->in_reconfig = false;
138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet !=  OMX_ErrorNone) {
138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("set_buffer_req failed eRet = %d",eRet);
138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_error();
139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case OMX_CommandPortEnable:
139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("OMX_CommandPortEnable complete for port [%lu]", p2);
139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\
139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            default:
140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_EventCmdComplete, p1, p2, NULL );
140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_ETB_ARBITRARY:
141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pThis->empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("empty_this_buffer_proxy_arbitrary failure");
141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_ETB: {
142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_ERRORTYPE iret;
142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2);
142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (iret == OMX_ErrorInsufficientResources) {
142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload");
142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_hw_overload ();
142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else if (iret != OMX_ErrorNone) {
142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure");
142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_error ();
142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_FTB:
143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)(intptr_t)p1,\
143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)(intptr_t)p2) != OMX_ErrorNone) {
143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("fill_this_buffer_proxy failure");
143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_COMMAND:
144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\
144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_U32)p2,(OMX_PTR)NULL);
144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EBD:
144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (p2 != VDEC_S_SUCCESS && p2 != VDEC_S_INPUT_BITSTREAM_ERR) {
144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EBD failure");
144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pThis->omx_report_error ();
145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (p2 == VDEC_S_INPUT_BITSTREAM_ERR && p1) {
145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->time_stamp_dts.remove_time_stamp(
145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((OMX_BUFFERHEADERTYPE *)(intptr_t)p1)->nTimeStamp,
145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ?true:false);
145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if ( pThis->empty_buffer_done(&pThis->m_cmp,
145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone) {
146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("empty_buffer_done failure");
146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pThis->omx_report_error ();
146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED: {
146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            int64_t *timestamp = (int64_t *)(intptr_t)p1;
146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p1) {
146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->time_stamp_dts.remove_time_stamp(*timestamp,
146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        (pThis->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        ?true:false);
147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                free(timestamp);
147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_FBD:
147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (p2 != VDEC_S_SUCCESS) {
147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->omx_report_error ();
147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else if ( pThis->fill_buffer_done(&pThis->m_cmp,
148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) {
148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("fill_buffer_done failure");
148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->omx_report_error ();
148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Driver flush i/p Port complete");
148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!pThis->input_flush_progress) {
148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->execute_input_flush();
149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_cb.EventHandler) {
149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (p2 != VDEC_S_SUCCESS) {
149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH failure");
149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->omx_report_error ();
149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else {
149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    /*Check if we need generate event for Flush done*/
149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_INPUT_FLUSH_PENDING)) {
150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING);
150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Input Flush completed - Notify Client");
150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_EventCmdComplete,OMX_CommandFlush,
150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_CORE_INPUT_PORT_INDEX,NULL );
150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_IDLE_PENDING)) {
150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (pThis->stream_off(OMX_CORE_INPUT_PORT_INDEX)) {
150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on OUTPUT Port");
151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->omx_report_error ();
151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        } else {
151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->streaming[OUTPUT_PORT] = false;
151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (!pThis->output_flush_progress) {
151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_LOW("Input flush done hence issue stop");
151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH:
152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Driver flush o/p Port complete");
152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!pThis->output_flush_progress) {
153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("WARNING: Unexpected flush from driver");
153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->execute_output_flush();
153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_cb.EventHandler) {
153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (p2 != VDEC_S_SUCCESS) {
153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH failed");
153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->omx_report_error ();
153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else {
153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    /*Check if we need generate event for Flush done*/
153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) {
154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Notify Output Flush done");
154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_EventCmdComplete,OMX_CommandFlush,
154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_CORE_OUTPUT_PORT_INDEX,NULL );
154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags,
154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING)) {
154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_LOW("Internal flush complete");
155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        BITMASK_CLEAR (&pThis->m_flags,
155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (BITMASK_PRESENT(&pThis->m_flags,
155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED)) {
155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event(OMX_CommandPortDisable,
155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_CORE_OUTPUT_PORT_INDEX,
155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_EVENT);
155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            BITMASK_CLEAR (&pThis->m_flags,
155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED);
155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            BITMASK_CLEAR (&pThis->m_flags,
156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) {
156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (pThis->stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_ERROR("Failed to call streamoff on CAPTURE Port");
156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->omx_report_error ();
156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            break;
157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->streaming[CAPTURE_PORT] = false;
157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        if (!pThis->input_flush_progress) {
157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            DEBUG_PRINT_LOW("Output flush done hence issue stop");
157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->post_event ((unsigned int)NULL, VDEC_S_SUCCESS,\
157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                                    OMX_COMPONENT_GENERATE_STOP_DONE);
157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        }
157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_START_DONE:
158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_START_DONE");
158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_START_DONE Failure");
159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success");
159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Move to executing");
159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateExecuting;
159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateExecuting, NULL);
160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                } else if (BITMASK_PRESENT(&pThis->m_flags,
160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_COMPONENT_PAUSE_PENDING)) {
160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    if (/*ioctl (pThis->drv_ctx.video_driver_fd,
160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                          VDEC_IOCTL_CMD_PAUSE,NULL ) < */0) {
160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_PAUSE failed");
160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->omx_report_error ();
160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    }
160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_LOW("Event Handler callback is NULL");
161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_PAUSE_DONE:
161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_PAUSE_DONE");
161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_PAUSE_DONE ret failed");
162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->complete_pending_buffer_done_cbs();
162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) {
162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE nofity");
162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    //Send the callback now
162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING);
162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StatePause;
162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StatePause, NULL);
163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_RESUME_DONE:
164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_RESUME_DONE");
164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_RESUME_DONE failed");
164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) {
164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Moving the decoder to execute state");
164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING);
165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateExecuting;
165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateExecuting,NULL);
165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_STOP_DONE:
166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_STOP_DONE");
166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (p2 != VDEC_S_SUCCESS) {
166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_STOP_DONE ret failed");
166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->omx_report_error ();
166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->complete_pending_buffer_done_cbs();
167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE Success");
167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    // Send the callback now
167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING);
167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_state = OMX_StateIdle;
167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_LOW("Move to Idle State");
167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->m_cb.EventHandler(&pThis->m_cmp,pThis->m_app_data,
167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_EventCmdComplete,OMX_CommandStateSet,
167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            OMX_StateIdle,NULL);
168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (p2 == OMX_IndexParamPortDefinition) {
169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexParamPortDefinition");
169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->in_reconfig = true;
169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }  else if (p2 == OMX_IndexConfigCommonOutputCrop) {
169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_IndexConfigCommonOutputCrop");
169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Check if resolution is changed in smooth streaming mode */
169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->m_smoothstreaming_mode &&
169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                (pThis->framesize.nWidth !=
169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_width) ||
169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                (pThis->framesize.nHeight !=
170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height)) {
170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Resolution changed from: wxh = %dx%d to: wxh = %dx%d",
170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->framesize.nWidth,
170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->framesize.nHeight,
170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width,
170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height);
170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                /* Update new resolution */
170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->framesize.nWidth =
171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       pThis->drv_ctx.video_resolution.frame_width;
171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->framesize.nHeight =
171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       pThis->drv_ctx.video_resolution.frame_height;
171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                /* Update C2D with new resolution */
171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (!pThis->client_buffers.update_buffer_req()) {
171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_ERROR("Setting C2D buffer requirements failed");
171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Update new crop information */
172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nLeft = pThis->drv_ctx.frame_size.left;
172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nTop = pThis->drv_ctx.frame_size.top;
172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nWidth = pThis->drv_ctx.frame_size.right;
172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->rectangle.nHeight = pThis->drv_ctx.frame_size.bottom;
172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /* Validate the new crop information */
172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->rectangle.nLeft + pThis->rectangle.nWidth >
172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->drv_ctx.video_resolution.frame_width) {
172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Crop L[%u] + R[%u] > W[%u]",
173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->rectangle.nLeft, pThis->rectangle.nWidth,
173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width);
173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->rectangle.nLeft = 0;
173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (pThis->rectangle.nWidth >
173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_width) {
173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_HIGH("Crop R[%u] > W[%u]",
173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->rectangle.nWidth,
174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                            pThis->drv_ctx.video_resolution.frame_width);
174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nWidth =
174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_width;
174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (pThis->rectangle.nTop + pThis->rectangle.nHeight >
174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->drv_ctx.video_resolution.frame_height) {
174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                DEBUG_PRINT_HIGH("Crop T[%u] + B[%u] > H[%u]",
174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nTop, pThis->rectangle.nHeight,
175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height);
175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->rectangle.nTop = 0;
175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                if (pThis->rectangle.nHeight >
175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->drv_ctx.video_resolution.frame_height) {
175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    DEBUG_PRINT_HIGH("Crop B[%u] > H[%u]",
175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->rectangle.nHeight,
175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height);
175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nHeight =
176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        pThis->drv_ctx.video_resolution.frame_height;
176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                }
176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("Updated Crop Info: L: %u, T: %u, R: %u, B: %u",
176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nLeft, pThis->rectangle.nTop,
176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    pThis->rectangle.nWidth, pThis->rectangle.nHeight);
1766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                        } else if (p2 == OMX_QTIIndexConfigDescribeColorAspects) {
1767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeColorAspects");
1768fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                        } else if (p2 == OMX_QTIIndexConfigDescribeHDRColorInfo) {
1769fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                            DEBUG_PRINT_HIGH("Rxd PORT_RECONFIG: OMX_QTIIndexConfigDescribeHDRcolorinfo");
177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Rxd Invalid PORT_RECONFIG event (%lu)", p2);
177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            break;
177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.outfile) {
177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.outfile);
177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.outfile = NULL;
177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.out_ymeta_file) {
177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.out_ymeta_file);
178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.out_ymeta_file = NULL;
178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_debug.out_uvmeta_file) {
178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            fclose(pThis->m_debug.out_uvmeta_file);
178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_debug.out_uvmeta_file = NULL;
178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->secure_mode && pThis->m_cb.EventHandler && pThis->in_reconfig) {
178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->prefetchNewBuffers();
178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            uint32_t frame_data[4];
179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[0] = (p2 == OMX_IndexParamPortDefinition) ?
179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->m_reconfig_height : pThis->rectangle.nHeight;
179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[1] = (p2 == OMX_IndexParamPortDefinition) ?
179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                pThis->m_reconfig_width : pThis->rectangle.nWidth;
179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[2] = (p2 == OMX_IndexParamPortDefinition) ?
179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                frame_data[0] : pThis->drv_ctx.video_resolution.frame_height;
180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            frame_data[3] = (p2 == OMX_IndexParamPortDefinition) ?
180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                frame_data[1] : pThis->drv_ctx.video_resolution.frame_width;
180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    OMX_EventPortSettingsChanged, p1, p2, (void*) frame_data );
180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_EOS_DONE:
181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("Rxd OMX_COMPONENT_GENERATE_EOS_DONE");
181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (pThis->m_cb.EventHandler) {
181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data, OMX_EventBufferFlag,
181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                    OMX_CORE_OUTPUT_PORT_INDEX, OMX_BUFFERFLAG_EOS, NULL );
181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("ERROR: %s()::EventHandler is NULL", __func__);
181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->prev_ts = LLONG_MAX;
182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->rst_prev_ts = true;
182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_ERROR");
182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_error();
182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING:
182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING");
183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_unsupported_setting();
183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD:
183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD");
183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pThis->omx_report_hw_overload();
183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&pThis->m_lock);
184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        qsize = pThis->m_cmd_q.m_size;
184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pThis->m_state != OMX_StatePause)
184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            qsize += (pThis->m_ftb_q.m_size + pThis->m_etb_q.m_size);
184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&pThis->m_lock);
184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } while (qsize>0);
184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::update_resolution(int width, int height, int stride, int scan_lines)
185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int format_changed = 0;
185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((height != (int)drv_ctx.video_resolution.frame_height) ||
185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (width != (int)drv_ctx.video_resolution.frame_width)) {
185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("NOTE_CIF: W/H %d (%d), %d (%d)",
185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                width, drv_ctx.video_resolution.frame_width,
185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                height,drv_ctx.video_resolution.frame_height);
185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        format_changed = 1;
186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.frame_height = height;
186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.frame_width = width;
186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.scan_lines = scan_lines;
186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_resolution.stride = stride;
1865fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1866fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (!is_down_scalar_enabled) {
1867fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nLeft = m_extradata_info.output_crop_rect.nLeft;
1868fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nTop = m_extradata_info.output_crop_rect.nTop;
1869fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nWidth = m_extradata_info.output_crop_rect.nWidth;
1870fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        rectangle.nHeight = m_extradata_info.output_crop_rect.nHeight;
187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return format_changed;
187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::is_video_session_supported()
187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE) &&
187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_profile == HIGH_PROFILE || m_profile == MAIN_PROFILE)) {
188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_decoder_capability.max_width = 1280;
188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_decoder_capability.max_height = 720;
188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set max_width=1280 & max_height=720 for H264 HP/MP");
188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((drv_ctx.video_resolution.frame_width *
188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height >
188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_width *
188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_height) ||
188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (drv_ctx.video_resolution.frame_width*
189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             drv_ctx.video_resolution.frame_height <
189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             m_decoder_capability.min_width *
189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             m_decoder_capability.min_height)) {
189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR(
189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "Unsupported WxH = (%u)x(%u) supported range is min(%u)x(%u) - max(%u)x(%u)",
189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_width,
189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height,
189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.min_width,
189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.min_height,
189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_width,
190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_decoder_capability.max_height);
190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("video session supported");
190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len)
190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.in_buffer_log && !m_debug.infile) {
191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.m4v",
191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.mpg", m_debug.log_loc,
191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.263",
191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) ||
192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.264",
192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.265",
192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE)) {
193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.vc1",
193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.ivf",
193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               snprintf(m_debug.infile_name, OMX_MAX_STRINGNAME_SIZE, "%s/input_dec_%d_%d_%p.divx",
194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = fopen (m_debug.infile_name, "ab");
194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.infile) {
194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.infile_name[0] = '\0';
194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct ivf_file_header {
195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 signature[4]; //='DKIF';
195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 version         ; //= 0;
195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 headersize      ; //= 32;
195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 FourCC;
195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 width;
195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 height;
195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 rate;
195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 scale;
195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 length;
196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 unused[4];
196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } file_header;
196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset((void *)&file_header,0,sizeof(file_header));
196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[0] = 'D';
196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[1] = 'K';
196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[2] = 'I';
196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.signature[3] = 'F';
196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.version = 0;
196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            file_header.headersize = 32;
197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (drv_ctx.decoder_format) {
197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case VDEC_CODECTYPE_VP8:
197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    file_header.FourCC = 0x30385056;
197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case VDEC_CODECTYPE_VP9:
197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    file_header.FourCC = 0x30395056;
197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("unsupported format for VP8/VP9");
197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite((const char *)&file_header,
198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof(file_header),1,m_debug.infile);
198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         }
198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile && buffer_addr && buffer_len) {
198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vpx_ivf_frame_header {
198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 framesize;
199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 timestamp_lo;
199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 timestamp_hi;
199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } vpx_frame_header;
199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.framesize = buffer_len;
199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Currently FW doesn't use timestamp values */
199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.timestamp_lo = 0;
199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            vpx_frame_header.timestamp_hi = 0;
199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite((const char *)&vpx_frame_header,
199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof(vpx_frame_header),1,m_debug.infile);
199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fwrite(buffer_addr, buffer_len, 1, m_debug.infile);
200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::log_output_buffers(OMX_BUFFERHEADERTYPE *buffer) {
200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int buf_index = 0;
200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *temp = NULL;
200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_buffer_log && !m_debug.outfile && buffer->nFilledLen) {
201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.outfile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.yuv",
201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = fopen (m_debug.outfile_name, "ab");
201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.outfile) {
201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open output file: %s for logging", m_debug.log_loc);
201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.outfile_name[0] = '\0';
201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_meta_buffer_log && !m_debug.out_ymeta_file && !m_debug.out_uvmeta_file
202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        && buffer->nFilledLen) {
202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.out_ymetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.ymeta",
202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        snprintf(m_debug.out_uvmetafile_name, OMX_MAX_STRINGNAME_SIZE, "%s/output_%d_%d_%p.uvmeta",
202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_debug.log_loc, drv_ctx.video_resolution.frame_width, drv_ctx.video_resolution.frame_height, this);
202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_ymeta_file = fopen (m_debug.out_ymetafile_name, "ab");
202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_uvmeta_file = fopen (m_debug.out_uvmetafile_name, "ab");
202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.out_ymeta_file || !m_debug.out_uvmeta_file) {
202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open output y/uv meta file: %s for logging", m_debug.log_loc);
203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.out_ymetafile_name[0] = '\0';
203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.out_uvmetafile_name[0] = '\0';
203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((!m_debug.outfile && !m_debug.out_ymeta_file) || !buffer || !buffer->nFilledLen)
203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_index = buffer - m_out_mem_ptr;
204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2042b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC ||
2043b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Logging UBWC yuv width/height(%u/%u)",
204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height);
204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_debug.outfile)
204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite(temp, buffer->nFilledLen, 1, m_debug.outfile);
205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_debug.out_ymeta_file && m_debug.out_uvmeta_file) {
205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned int width = 0, height = 0;
205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned int y_plane, y_meta_plane;
205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int y_stride = 0, y_sclines = 0;
205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int y_meta_stride = 0, y_meta_scanlines = 0, uv_meta_stride = 0, uv_meta_scanlines = 0;
2056b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            int color_fmt = (drv_ctx.output_format== VDEC_YUV_FORMAT_NV12_UBWC)? COLOR_FMT_NV12_UBWC: COLOR_FMT_NV12_BPP10_UBWC;
205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int i;
205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int bytes_written = 0;
205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            width = drv_ctx.video_resolution.frame_width;
206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            height = drv_ctx.video_resolution.frame_height;
206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_stride = VENUS_Y_STRIDE(color_fmt, width);
206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_meta_plane = MSM_MEDIA_ALIGN(y_meta_stride * y_meta_scanlines, 4096);
207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr;
207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i = 0; i < y_meta_scanlines; i++) {
207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 bytes_written = fwrite(temp, y_meta_stride, 1, m_debug.out_ymeta_file);
207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 temp += y_meta_stride;
207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + y_meta_plane + y_plane;
207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for(i = 0; i < uv_meta_scanlines; i++) {
208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bytes_written += fwrite(temp, uv_meta_stride, 1, m_debug.out_uvmeta_file);
208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp += uv_meta_stride;
208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
2084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride = drv_ctx.video_resolution.stride;
208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int scanlines = drv_ctx.video_resolution.scan_lines;
208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_smoothstreaming_mode) {
208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = drv_ctx.video_resolution.frame_width;
208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = drv_ctx.video_resolution.frame_height;
209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = (stride + DEFAULT_WIDTH_ALIGNMENT - 1) & (~(DEFAULT_WIDTH_ALIGNMENT - 1));
209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = (scanlines + DEFAULT_HEIGHT_ALIGNMENT - 1) & (~(DEFAULT_HEIGHT_ALIGNMENT - 1));
209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned i;
209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Logging width/height(%u/%u) stride/scanlines(%u/%u)",
209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height, stride, scanlines);
209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int bytes_written = 0;
209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.video_resolution.frame_height; i++) {
209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             bytes_written = fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             temp += stride;
210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        temp = (char *)drv_ctx.ptr_outputbuffer[buf_index].bufferaddr + stride * scanlines;
210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride_c = stride;
210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for(i = 0; i < drv_ctx.video_resolution.frame_height/2; i++) {
210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bytes_written += fwrite(temp, drv_ctx.video_resolution.frame_width, 1, m_debug.outfile);
210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp += stride_c;
210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentInit
211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Initialize the component.
211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ctxt -- Context information related to the self.
212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   id   -- Event identifier. This could be any of the following:
212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   1. Command completion event
212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   2. Buffer done callback event
212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   3. Frame done callback event
212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_fmtdesc fdesc;
213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_frmsizeenum frmsize;
213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int   alignment = 0,buffer_size = 0;
214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fds[2];
214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int r,ret=0;
214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool codec_ambiguous = false;
214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STRING device_name = (OMX_STRING)"/dev/video32";
214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *soc_file = NULL;
214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char buffer[10];
214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char platform_name[PROPERTY_VALUE_MAX];
215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("ro.board.platform", platform_name, "0");
215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(platform_name, "msm8610", 7)) {
215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        device_name = (OMX_STRING)"/dev/video/q6_dec";
215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        is_q6_platform = true;
215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        maxSmoothStreamingWidth = 1280;
215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        maxSmoothStreamingHeight = 720;
215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_thulium_v1 = false;
216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    soc_file = fopen("/sys/devices/soc0/soc_id", "r");
216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (soc_file) {
216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fread(buffer, 1, 4, soc_file);
216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(soc_file);
216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(buffer) == 246) {
216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            soc_file = fopen("/sys/devices/soc0/revision", "r");
216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (soc_file) {
216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fread(buffer, 1, 4, soc_file);
216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fclose(soc_file);
216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (atoi(buffer) == 1) {
217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_thulium_v1 = true;
217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE");
217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*
217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * turn off frame parsing for Android by default.
218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Clients may configure OMX_QCOM_FramePacking_Arbitrary to enable this mode
218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    arbitrary_bytes = false;
218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (atoi(property_value)) {
218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("arbitrary_bytes mode enabled via property command");
218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = true;
218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(role, "OMX.qcom.video.decoder.avc.secure",
219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.avc";
219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg2.secure",
219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.mpeg2";
220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.hevc.secure",
220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.hevc";
220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.vc1.secure",
220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vc1";
221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.wmv.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.wmv";
221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.mpeg4.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.mpeg4";
222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(role, "OMX.qcom.video.decoder.vp9.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.vp9";
222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (!strncmp(role, "OMX.qcom.video.decoder.vp8.secure",
222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        secure_mode = true;
222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        role = (OMX_STRING)"OMX.qcom.video.decoder.vp8";
223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.video_driver_fd = open(device_name, O_RDWR);
223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("component_init: %s : fd=%d", role, drv_ctx.video_driver_fd);
223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.video_driver_fd < 0) {
223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Omx_vdec::Comp Init Returning failure, errno %d", errno);
223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    drv_ctx.frame_rate.fps_denominator = 1;
224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    operating_frame_rate = DEFAULT_FPS;
224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    high_fps = false;
224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = eventfd(0, 0);
224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_poll_efd < 0) {
224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to create event fd(%s)", strerror(errno));
224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = subscribe_to_events(drv_ctx.video_driver_fd);
225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!ret) {
225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        async_thread_created = true;
225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = pthread_create(&async_thread_id,0,async_message_thread,this);
225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to create async_message_thread");
225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        async_thread_created = false;
225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    outputExtradataFile = fopen (output_extradata_filename, "ab");
226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Copy the role information which provides the decoder kind
226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    strlcpy(drv_ctx.kind,role,128);
226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg4",\
226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mpeg4",\
227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.timestamp_adjust = true;
227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG4;
227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingMPEG4;
227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability=V4L2_PIX_FMT_MPEG4;
227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Initialize Start Code for MPEG4*/
227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_MPEG4;
227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2",\
228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mpeg2",\
228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MPEG2;
228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_MPEG2;
228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingMPEG2;
228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Initialize Start Code for MPEG2*/
228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_MPEG2;
228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",\
229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("H263 Decoder selected");
229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_H263;
229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingH263;
229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_H263;
229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H263;
229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",\
229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW ("DIVX 311 Decoder selected");
230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_3;
230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX_311;
230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4",\
230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR ("DIVX 4 Decoder selected");
231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_4;
231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX;
231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_ambiguous = true;
231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",\
232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR ("DIVX 5/6 Decoder selected");
232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_DIVX_6;
232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_DIVX;
232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingDivx;
232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_DIVX;
232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_ambiguous = true;
232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",\
233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_H264;
233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability=V4L2_PIX_FMT_H264;
233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingAVC;
233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H264;
233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (is_thulium_v1) {
234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            arbitrary_bytes = true;
234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enable arbitrary_bytes for h264");
234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc",\
234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_MVC;
234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_H264_MVC;
234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC;
234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_H264;
235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc",\
235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.hevc",OMX_MAX_STRINGNAME_SIZE);
235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_HEVC;
235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_HEVC;
235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingHevc;
235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_HEVC;
235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",\
236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1;
236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingWMV;
236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VC1;
236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VC1_ANNEX_G;
236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",\
237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE);
237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VC1_RCV;
237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingWMV;
237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VC1;
237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VC1_ANNEX_L;
237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_start_codes(codec_type_parse);
237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",    \
237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VP8;
238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VP8;
238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingVP8;
238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VP8;
238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",    \
238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE)) {
238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.decoder_format = VDEC_CODECTYPE_VP9;
238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_capability = V4L2_PIX_FMT_VP9;
239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eCompressionFormat = OMX_VIDEO_CodingVP9;
239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type_parse = CODEC_TYPE_VP9;
239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        arbitrary_bytes = false;
239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Unknown Component");
239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE dest_color_format;
240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disable_ubwc_mode) {
240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12;
240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.output_format = VDEC_YUV_FORMAT_NV12_UBWC;
240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eCompressionFormat == (OMX_VIDEO_CODINGTYPE)QOMX_VIDEO_CodingMVC)
240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = (OMX_COLOR_FORMATTYPE)
240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = (OMX_COLOR_FORMATTYPE)
241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.set_color_format(dest_color_format)) {
241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting color format failed");
241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dpb_bit_depth = MSM_VIDC_BIT_DEPTH_8;
241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_progressive = MSM_VIDC_PIC_STRUCT_PROGRESSIVE;
241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disable_ubwc_mode) {
242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            capture_capability = V4L2_PIX_FMT_NV12;
242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            capture_capability = V4L2_PIX_FMT_NV12_UBWC;
242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_capability cap;
242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to query capabilities");
242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " version = %d, capabilities = %x", cap.driver, cap.card,
243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cap.bus_info, cap.version, cap.capabilities);
243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=0;
243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index=0;
243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fdesc.pixelformat, fdesc.flags);
244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fdesc.index++;
244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index=0;
244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (ioctl(drv_ctx.video_driver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fdesc.pixelformat, fdesc.flags);
244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fdesc.index++;
245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
2451fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nLeft = 0;
2452fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nTop = 0;
2453fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nWidth = 320;
2454fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_extradata_info.output_crop_rect.nHeight = 240;
245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        update_resolution(320, 240, 320, 240);
2456fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set format on output port");
246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Format was successful");
246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_ambiguous) {
246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_DIVX) {
247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control divx_ctrl;
247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_4) {
247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_4;
247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if (drv_ctx.decoder_format == VDEC_CODECTYPE_DIVX_5) {
247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_5;
247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    divx_ctrl.value = V4L2_MPEG_VIDC_VIDEO_DIVX_FORMAT_6;
247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                divx_ctrl.id = V4L2_CID_MPEG_VIDC_VIDEO_DIVX_FORMAT;
248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &divx_ctrl);
248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ret) {
248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set divx version");
248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Codec should not be ambiguous");
248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("persist.vidc.dec.conceal_color", property_value, DEFAULT_CONCEAL_COLOR);
249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_conceal_color= atoi(property_value);
249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("trying to set 0x%u as conceal color\n", (unsigned int)m_conceal_color);
249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR;
249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = m_conceal_color;
249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set conceal color %d\n", ret);
249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Get the hardware capabilities
250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset((void *)&frmsize,0,sizeof(frmsize));
250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frmsize.index = 0;
250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frmsize.pixel_format = output_capability;
250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd,
250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VIDIOC_ENUM_FRAMESIZES, &frmsize);
250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to get framesizes");
250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.min_width = frmsize.stepwise.min_width;
251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.max_width = frmsize.stepwise.max_width;
251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.min_height = frmsize.stepwise.min_height;
251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_decoder_capability.max_height = frmsize.stepwise.max_height;
251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set format on capture port");
252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&framesize, 0, sizeof(OMX_FRAMESIZETYPE));
252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        framesize.nWidth = drv_ctx.video_resolution.frame_width;
253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        framesize.nHeight = drv_ctx.video_resolution.frame_height;
253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&rectangle, 0, sizeof(OMX_CONFIG_RECTTYPE));
253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rectangle.nWidth = drv_ctx.video_resolution.frame_width;
253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rectangle.nHeight = drv_ctx.video_resolution.frame_height;
253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Format was successful");
253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode) {
253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = 1;
254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Omx_vdec:: calling to open secure device %d", ret);
254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d", ret);
254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (output_capability == V4L2_PIX_FMT_H264_MVC) {
254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_MVC_BUFFER_LAYOUT;
254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_MVC_TOP_BOTTOM;
255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to set MVC buffer layout");
255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (is_thulium_v1) {
255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = enable_smoothstreaming();
255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet != OMX_ErrorNone) {
256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("Failed to enable smooth streaming on driver");
256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               return eRet;
256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Get the Buffer requirements for input and output ports*/
256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf.buffer_type = VDEC_BUFFER_TYPE_INPUT;
256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode) {
257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.alignment = SECURE_ALIGN;
257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf.alignment = SECURE_ALIGN;
257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.alignment = SZ_4K;
257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf.alignment = SZ_4K;
257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata = 0;
257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.picture_order = VDEC_ORDER_DISPLAY;
258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.idr_only_decoding = 0;
258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.dec.downscalar_width",property_value,"0");
258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value)) {
258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_width = atoi(property_value);
258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.dec.downscalar_height",property_value,"0");
259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value)) {
259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_height = atoi(property_value);
259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_downscalar_width < m_decoder_capability.min_width ||
259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_height < m_decoder_capability.min_height) {
259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_width = 0;
259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_height = 0;
259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Downscaler configured WxH %dx%d\n",
260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_downscalar_width, m_downscalar_height);
260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        property_get("vidc.disable.split.mode",property_value,"0");
260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_disable_split_mode = atoi(property_value);
260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("split mode is %s", m_disable_split_mode ? "disabled" : "enabled");
260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_state = OMX_StateLoaded;
260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef DEFAULT_EXTRADATA
261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enable_extradata(DEFAULT_EXTRADATA, true, true);
261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = get_buffer_req(&drv_ctx.ip_buf);
261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size);
261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        get_buffer_req(&drv_ctx.op_buf);
261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.decoder_format == VDEC_CODECTYPE_HEVC ||
261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nAllocLen = drv_ctx.ip_buf.buffer_size;
261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.pBuffer = (OMX_U8 *)malloc (drv_ctx.ip_buf.buffer_size);
262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nFilledLen = 0;
262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nOffset = 0;
262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (h264_scratch.pBuffer == NULL) {
262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("h264_scratch.pBuffer Allocation failed ");
262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264 ||
262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.decoder_format == VDEC_CODECTYPE_MVC) {
263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_frame_parser.mutils == NULL) {
263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_frame_parser.mutils = new H264_Utils();
263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_frame_parser.mutils == NULL) {
263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("parser utils Allocation failed ");
263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorInsufficientResources;
263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_frame_parser.mutils->initialize_frame_checking_environment();
263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_frame_parser.mutils->allocate_rbsp_buffer (drv_ctx.ip_buf.buffer_size);
263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_parser = new h264_stream_parser();
264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!h264_parser) {
264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: H264 parser allocation failed!");
264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pipe(fds)) {
264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("pipe creation failed");
265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pipe_in = fds[0];
265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pipe_out = fds[1];
265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            msg_thread_created = true;
265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            r = pthread_create(&msg_thread_id,0,message_thread_dec,this);
265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (r < 0) {
265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("component_init(): message_thread_dec creation failed");
265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                msg_thread_created = false;
266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone) {
266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Component Init Failed");
266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("omx_vdec::component_init() success : fd=%d",
266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_driver_fd);
267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //memset(&h264_mv_buff,0,sizeof(struct h264_mv_buffer));
267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetComponentVersion
267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns the component version.
268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   TBD.
268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_ErrorNone.
268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_component_version
269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp,
269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName,
269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion,
269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion,
269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID
269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel )
269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentName;
270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentVersion;
270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) componentUUID;
270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Comp Version in Invalid State");
270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* TBD -- Return the proper version */
270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (specVersion) {
270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        specVersion->nVersion = OMX_SPEC_VERSION;
270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommand
271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp,
272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_COMMANDTYPE cmd,
272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32 param1,
272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR cmdData
273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) cmdData;
273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command: Recieved a Command from Client");
273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State");
273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cmd == OMX_CommandFlush && param1 != OMX_CORE_INPUT_PORT_INDEX
274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && param1 != OMX_CORE_OUTPUT_PORT_INDEX && param1 != OMX_ALL) {
274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("send_command(): ERROR OMX_CommandFlush "
274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "to invalid port: %u", (unsigned int)param1);
274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_wait(&m_cmd_lock);
274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command: Command Processed");
274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommand
275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_COMMANDTYPE cmd,
276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32 param1,
276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR cmdData
277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) cmdData;
277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STATETYPE eState = (OMX_STATETYPE) param1;
277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int bFlag = 1,sem_posted = 0,ret=0;
277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command_proxy(): cmd = %d", cmd);
277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("send_command_proxy(): Current State %d, Expected State %d",
278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state, eState);
278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (cmd == OMX_CommandStateSet) {
278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandStateSet issued");
278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Current State %d, Expected State %d", m_state, eState);
278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Loaded */
278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_state == OMX_StateLoaded) {
278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateIdle) {
279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //if all buffers are allocated or all ports disabled
279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (allocate_done() ||
279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (m_inp_bEnabled == OMX_FALSE && m_out_bEnabled == OMX_FALSE)) {
279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle");
279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->Idle-Pending");
279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Skip the event notification
279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Loaded */
280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Loaded");
280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to WaitForResources */
280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Loaded-->WaitForResources");
281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Executing */
281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Executing");
281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Pause */
282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Pause");
282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Loaded to Invalid */
282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid");
283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Loaded-->Invalid(%d Not Handled)",\
283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eState);
283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is IDLE */
284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateIdle) {
284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateLoaded) {
284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (release_done()) {
284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*
284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       Since error is None , we will post an event at the end
284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       of this function definition
284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     */
285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded");
285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Loaded-Pending");
285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Skip the event notification
285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Executing */
285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //BITMASK_SET(&m_flags, OMX_COMPONENT_EXECUTE_PENDING);
286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state=OMX_StateExecuting;
286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Stream On CAPTURE Was successful");
286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Idle */
286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateIdle) {
286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Idle");
287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to WaitForResources */
287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->WaitForResources");
287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Pause */
288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*To pause the Video core we need to start the driver*/
288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (/*ioctl (drv_ctx.video_driver_fd,VDEC_IOCTL_CMD_START,
288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      NULL) < */0) {
288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("VDEC_IOCTL_CMD_START FAILED");
288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorHardware;
288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING);
289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Pause");
289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bFlag = 0;
289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Idle to Invalid */
289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle-->Invalid");
289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Idle --> %d Not Handled",eState);
290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /******************************/
290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Executing */
290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /******************************/
290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateExecuting) {
291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Command Recieved in OMX_StateExecuting");
291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Idle */
291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateIdle) {
291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition
291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 */
291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Executing --> Idle");
291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!sem_posted) {
291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_posted = 1;
292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post (&m_cmd_lock);
292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_ALL);
292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Paused */
292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("PAUSE Command Issued");
292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state = OMX_StatePause;
292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Loaded */
293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Loaded");
293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to WaitForResources */
293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> WaitForResources");
294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Executing */
294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Executing");
294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Executing to Invalid */
295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("send_command_proxy(): Executing --> Invalid");
295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Executing --> %d Not Handled",eState);
295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is Pause  */
296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StatePause) {
296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Executing */
296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateExecuting) {
296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pause --> Executing");
296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state = OMX_StateExecuting;
297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 1;
297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Idle */
297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateIdle) {
297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pause --> Idle");
297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!sem_posted) {
297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_posted = 1;
298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post (&m_cmd_lock);
298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_ALL);
298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to loaded */
298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateLoaded) {
298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> loaded");
298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to WaitForResources */
299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> WaitForResources");
299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Pause */
300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> Pause");
300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,\
300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from Pause to Invalid */
300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Pause --> Invalid");
300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Paused --> %d Not Handled",eState);
301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Current State is WaitForResources  */
301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /***************************/
301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (m_state == OMX_StateWaitForResources) {
302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Loaded */
302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eState == OMX_StateLoaded) {
302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Since error is None , we will post an event
302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   at the end of this function definition */
302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): WaitForResources-->Loaded");
302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to WaitForResources */
302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateWaitForResources) {
302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->WaitForResources");
302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorSameState,
303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorSameState;
303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Executing */
303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateExecuting) {
303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Executing");
303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Pause */
304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StatePause) {
304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Pause");
304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\
304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorIncorrectStateTransition;
304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Invalid */
304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (eState == OMX_StateInvalid) {
304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): WaitForResources-->Invalid");
305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT);
305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidState;
305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Requesting transition from WaitForResources to Loaded -
305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               is NOT tested by Khronos TS */
305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): %d --> %d(Not Handled)",m_state,eState);
305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /********************************/
306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Current State is Invalid */
306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*******************************/
306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (m_state == OMX_StateInvalid) {
306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* State Transition from Inavlid to any state */
306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eState == (OMX_StateLoaded || OMX_StateWaitForResources
306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || OMX_StateIdle || OMX_StateExecuting
306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || OMX_StatePause || OMX_StateInvalid)) {
306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR::send_command_proxy(): Invalid -->Loaded");
307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_EventError,OMX_ErrorInvalidState,\
307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInvalidState;
307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (cmd == OMX_CommandFlush) {
307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandFlush issued"
307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        send_codec_config();
307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX ||
308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    param1 == OMX_ALL)) {
308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (android_atomic_add(0, &m_queued_codec_config_count) > 0) {
308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               struct timespec ts;
308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               clock_gettime(CLOCK_REALTIME, &ts);
308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               ts.tv_sec += 2;
308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ",
308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       m_queued_codec_config_count);
308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED);
309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (sem_timedwait(&m_safe_flush, &ts)) {
309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers");
309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               BITMASK_CLEAR (&m_flags,OMX_COMPONENT_FLUSH_DEFERRED);
309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING);
309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (OMX_CORE_OUTPUT_PORT_INDEX == param1 || OMX_ALL == param1) {
310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING);
310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!sem_posted) {
310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sem_posted = 1;
310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set the Semaphore");
310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sem_post (&m_cmd_lock);
310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            execute_omx_flush(param1);
310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bFlag = 0;
311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ( cmd == OMX_CommandPortEnable) {
311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortEnable issued"
311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bEnabled = OMX_TRUE;
311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_state == OMX_StateLoaded &&
311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || allocate_input_done()) {
311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,OMX_CORE_INPUT_PORT_INDEX,
312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Enable output Port command recieved");
313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bEnabled = OMX_TRUE;
313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_state == OMX_StateLoaded &&
313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    || (allocate_output_done())) {
313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,OMX_CORE_OUTPUT_PORT_INDEX,
313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("send_command_proxy(): Disabled-->Enabled Pending");
314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* enable/disable downscaling if required */
314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = decide_downscalar();
314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ret) {
314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("decide_downscalar failed\n");
314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (cmd == OMX_CommandPortDisable) {
315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("send_command_proxy(): OMX_CommandPortDisable issued"
315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "with param1: %u", (unsigned int)param1);
315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL) {
315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            codec_config_flag = false;
315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bEnabled = OMX_FALSE;
315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    && release_input_done()) {
315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortDisable,OMX_CORE_INPUT_PORT_INDEX,
315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!sem_posted) {
316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_posted = 1;
316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_post (&m_cmd_lock);
316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_CORE_INPUT_PORT_INDEX);
316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL) {
317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bEnabled = OMX_FALSE;
317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Disable output Port command recieved");
317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    && release_output_done()) {
317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortDisable,OMX_CORE_OUTPUT_PORT_INDEX,\
318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) {
318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!sem_posted) {
318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_posted = 1;
318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sem_post (&m_cmd_lock);
318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING);
318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    execute_omx_flush(OMX_CORE_OUTPUT_PORT_INDEX);
319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Skip the event notification
319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bFlag = 0;
319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Command other than StateSet (%d)",cmd);
319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone && bFlag) {
320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!sem_posted) {
320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sem_post(&m_cmd_lock);
320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ExecuteOmxFlush
321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Executes the OMX flush.
321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   flushtype - input flush(1)/output flush(0)/ both.
321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_omx_flush(OMX_U32 flushType)
322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane;
322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_decoder_cmd dec;
323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("in %s, flushing %u", __func__, (unsigned int)flushType);
323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&v4l2_buf,0,sizeof(v4l2_buf));
323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dec.cmd = V4L2_DEC_QCOM_CMD_FLUSH;
323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("in %s: reconfig? %d", __func__, in_reconfig);
323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (in_reconfig && flushType == OMX_CORE_OUTPUT_PORT_INDEX) {
323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_flush_progress = true;
323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* XXX: The driver/hardware does not support flushing of individual ports
324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * in all states. So we pretty much need to flush both ports internally,
324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it
324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * requested.  Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set,
324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * we automatically omit sending the FLUSH done for the "opposite" port. */
324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_flush_progress = true;
324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_flush_progress = true;
324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dec.flags = V4L2_DEC_QCOM_CMD_FLUSH_OUTPUT | V4L2_DEC_QCOM_CMD_FLUSH_CAPTURE;
324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        request_perf_level(VIDC_TURBO);
324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Flush Port (%u) Failed ", (unsigned int)flushType);
325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = false;
325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*=========================================================================
325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush
326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION
326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at OUTPUT PORT.
326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS
326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone.
326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE
326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false
326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/
327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_output_flush()
327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1 = 0; // Parameter - 1
327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2 = 0; // Parameter - 2
327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident = 0;
327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = true;
327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Generate FBD for all Buffers in the FTBq*/
327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Initiate Output Flush");
328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //reset last render TS
328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(m_last_rendered_TS > 0) {
328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_last_rendered_TS = 0;
328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_ftb_q.m_size) {
328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer queue size %lu pending buf cnt %d",
328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_ftb_q.m_size,pending_output_buffers);
328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.pop_entry(&p1,&p2,&ident);
329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ID(%lx) P1(%lx) P2(%lx)", ident, p1, p2);
329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == m_fill_output_msg ) {
329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.FillBufferDone(&m_cmp, m_app_data, (OMX_BUFFERHEADERTYPE *)(intptr_t)p2);
329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_FBD) {
329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)(intptr_t)p1);
329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_flush_progress = false;
329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = LLONG_MAX;
330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX flush o/p Port complete PenBuf(%d)", pending_output_buffers);
330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*=========================================================================
330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush
330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION
331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT PORT.
331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS
331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone.
331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE
331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false
331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/
331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::execute_input_flush()
332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned       i =0;
332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1 = 0; // Parameter - 1
332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p2 = 0; // Parameter - 2
332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long ident = 0;
332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = true;
332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Generate EBD for all Buffers in the ETBq*/
332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Initiate Input Flush");
332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Check if the Queue is empty");
333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_etb_q.m_size) {
333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.pop_entry(&p1,&p2,&ident);
333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_input_buffers++;
3340b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Flush Input OMX_COMPONENT_GENERATE_EBD %p",
334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_BUFFERHEADERTYPE *)p1);
334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    time_stamp_dts.flush_timestamp();
335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if Heap Buffers are to be flushed*/
335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes && !(codec_config_flag)) {
335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Reset all the variables before flusing");
335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.nFilledLen = 0;
335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_count = 0;
335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_count = 0;
335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_ts = LLONG_MAX;
335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_flags = 0;
336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_entries = 0;
336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Initialize parser");
336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.mutils) {
336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_frame_parser.mutils->initialize_frame_checking_environment();
336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (m_input_pending_q.m_size) {
336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&p1,&p2,&ident);
336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p1);
337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame) {
337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp ,m_app_data,psource_frame);
337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame) {
337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen = 0;
337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned int)NULL,
338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)NULL);
338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = NULL;
338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.flush();
338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec_config_flag) {
338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("frame_parser flushing skipped due to codec config buffer "
338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "is not sent to the driver yet");
338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_flush_progress = false;
339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes) {
339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = LLONG_MAX;
339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_timestamp_list.reset_ts_list();
339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX flush i/p Port complete PenBuf(%d)", pending_input_buffers);
340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SendCommandEvent
340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Send the event to decoder pipe.  This is needed to generate the callbacks
341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   in decoder thread context.
341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::post_event(unsigned long p1,
342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p2,
342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long id)
342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Just drop messages typically generated by hardware (w/o client request),
342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * if we've reported an error to client. */
342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_error_propogated) {
342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (id) {
342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_PORT_RECONFIG:
343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Dropping message %lx "
343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "since client expected to be in error state", id);
343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* whatever */
343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (id == m_fill_output_msg ||
344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_FBD ||
344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_PORT_RECONFIG ||
344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH) {
344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.insert_entry(p1,p2,id);
344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (id == OMX_COMPONENT_GENERATE_ETB ||
344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EBD ||
344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_ETB_ARBITRARY ||
345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH) {
345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.insert_entry(p1,p2,id);
345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cmd_q.insert_entry(p1,p2,id);
345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet = true;
345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this);
345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_message(this, id);
345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType)
346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!profileLevelType)
346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (profileLevelType->nPortIndex == 0) {
347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
3473d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            profileLevelType->eLevel = OMX_VIDEO_AVCLevel52;
347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline;
347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain;
347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 2) {
347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh;
348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 3) {
348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline;
348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 4) {
348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh;
348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)profileLevelType->nProfileIndex);
348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = QOMX_VIDEO_MVCProfileStereoHigh;
349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = QOMX_VIDEO_MVCLevel51;
349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain;
350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain10;
350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_HEVCMainTierLevel51;
350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)profileLevelType->nProfileIndex);
350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE))) {
351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline;
351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_H263Level70;
351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG4Level5;
352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE) ||
353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (profileLevelType->nProfileIndex == 0) {
353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileSimple;
353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (profileLevelType->nProfileIndex == 1) {
353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eProfile = OMX_VIDEO_MPEG2ProfileMain;
354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                profileLevelType->eLevel   = OMX_VIDEO_MPEG2LevelHL;
354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u",
354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)profileLevelType->nProfileIndex);
354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNoMore;
354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore for codec: %s", drv_ctx.kind);
354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queries on Input port only %u",
355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          (unsigned int)profileLevelType->nPortIndex);
355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetParameter
356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Get Parameter method implementation
356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Error None if successful.
357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE     hComp,
357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE paramIndex,
357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_PTR     paramData)
357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_parameter:");
358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Param in Invalid State");
358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL) {
358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Get Param in Invalid paramData");
358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)paramIndex) {
358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition: {
359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn =
359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition");
359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               decide_dpb_buffer_mode(is_down_scalar_enabled);
359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = update_portdef(portDefn);
359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (eRet == OMX_ErrorNone)
359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_port_def = *portDefn;
359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoInit: {
360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *portParamType =
360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit");
360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nPorts           = 2;
360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              portParamType->nStartPortNumber = 0;
361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat: {
361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat");
361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                portFmt->nVersion.nVersion = OMX_SPEC_VERSION;
361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                portFmt->nSize             = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE);
362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (0 == portFmt->nPortIndex) {
362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (0 == portFmt->nIndex) {
362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat =  OMX_COLOR_FormatUnused;
362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eCompressionFormat = eCompressionFormat;
362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoPortFormat:"\
362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore compression formats");
362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet =  OMX_ErrorNoMore;
362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (1 == portFmt->nPortIndex) {
363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    portFmt->eCompressionFormat =  OMX_VIDEO_CodingUnused;
363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // Distinguish non-surface mode from normal playback use-case based on
363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // usage hinted via "OMX.google.android.index.useAndroidNativeBuffer2"
363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // For non-android, use the default list
363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // Also use default format-list if FLEXIBLE YUV is supported,
363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    // as the client negotiates the standard color-format if it needs to
363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    bool useNonSurfaceMode = false;
363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_) && !defined(FLEXYUV_SUPPORTED)
364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    useNonSurfaceMode = (m_enable_android_native_buffers == OMX_FALSE);
364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (is_thulium_v1) {
364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat = getPreferredColorFormatDefaultMode(portFmt->nIndex);
364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat = useNonSurfaceMode ?
364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            getPreferredColorFormatNonSurfaceMode(portFmt->nIndex) :
364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            getPreferredColorFormatDefaultMode(portFmt->nIndex);
364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == OMX_COLOR_FormatMax ) {
365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorNoMore;
365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat:"\
365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore Color formats");
365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_HIGH("returning color-format: 0x%x", portFmt->eColorFormat);
365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("get_parameter: Bad port index %d",
365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (int)portFmt->nPortIndex);
365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorBadPortIndex;
366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /*Component should support this port definition*/
366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamAudioInit: {
366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *audioPortParamType =
366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit");
366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nPorts           = 0;
367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              audioPortParamType->nStartPortNumber = 0;
367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          /*Component should support this port definition*/
367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamImageInit: {
367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PORT_PARAM_TYPE *imagePortParamType =
367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  (OMX_PORT_PARAM_TYPE *) paramData;
368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit");
368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nVersion.nVersion = OMX_SPEC_VERSION;
368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nSize = sizeof(OMX_PORT_PARAM_TYPE);
368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nPorts           = 0;
368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              imagePortParamType->nStartPortNumber = 0;
368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          /*Component should support this port definition*/
368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamOtherInit: {
369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamOtherInit %08x",
369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              eRet =OMX_ErrorUnsupportedIndex;
369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole: {
369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role->nVersion.nVersion = OMX_SPEC_VERSION;
370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role->nSize = sizeof(*comp_role);
370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",
370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          paramIndex);
370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  strlcpy((char*)comp_role->cRole,(const char*)m_cRole,
370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          OMX_MAX_STRINGNAME_SIZE);
370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              /* Added for parameter test */
370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt: {
371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PRIORITYMGMTTYPE *priorityMgmType =
371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 (OMX_PRIORITYMGMTTYPE *) paramData;
371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt");
371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             priorityMgmType->nVersion.nVersion = OMX_SPEC_VERSION;
371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             priorityMgmType->nSize = sizeof(OMX_PRIORITYMGMTTYPE);
371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         /* Added for parameter test */
372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier: {
372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType =
372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier");
372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bufferSupplierType->nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE);
372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (0 == bufferSupplierType->nPortIndex)
372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else if (1 == bufferSupplierType->nPortIndex)
373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       bufferSupplierType->nPortIndex = OMX_BufferSupplyUnspecified;
373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else
373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadPortIndex;
373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc: {
373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc %08x",
374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("get_parameter: QOMX_IndexParamVideoMvc %08x",
374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263: {
374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263 %08x",
375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4: {
375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4 %08x",
375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg2: {
375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg2 %08x",
376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelQuerySupported: {
376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported %08x", paramIndex);
376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType =
376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = get_supported_profile_level(profileLevelType);
376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        break;
377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: {
377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        VALIDATE_OMX_PARAM_DATA(paramData, GetAndroidNativeBufferUsageParams);
377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_LOW("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage");
377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        GetAndroidNativeBufferUsageParams* nativeBuffersUsage = (GetAndroidNativeBufferUsageParams *) paramData;
377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (nativeBuffersUsage->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            if (secure_mode && !secure_scaling_to_non_secure_opb) {
377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                nativeBuffersUsage->nUsage = (GRALLOC_USAGE_PRIVATE_MM_HEAP | GRALLOC_USAGE_PROTECTED |
378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                        GRALLOC_USAGE_PRIVATE_UNCACHED);
378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            } else {
378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                nativeBuffersUsage->nUsage = GRALLOC_USAGE_PRIVATE_UNCACHED;
378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            }
378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_HIGH("get_parameter: OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage failed!");
378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorBadParameter;
378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    break;
379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED
379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexFlexibleYUVDescription: {
379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("get_parameter: describeColorFormat");
379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VALIDATE_OMX_PARAM_DATA(paramData, DescribeColorFormatParams);
379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = describeColorFormat(paramData);
379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent: {
380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             struct v4l2_control profile_control, level_control;
380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             switch (drv_ctx.decoder_format) {
380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 case VDEC_CODECTYPE_H264:
380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     profile_control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     level_control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     break;
381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 default:
381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("get_param of OMX_IndexParamVideoProfileLevelCurrent only available for H264");
381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     eRet = OMX_ErrorNotImplemented;
381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     break;
381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &profile_control)) {
381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch ((enum v4l2_mpeg_video_h264_profile)profile_control.value) {
381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileBaseline;
382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileMain;
382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileExtended;
382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh;
383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh10;
383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eProfile = OMX_VIDEO_AVCProfileHigh422;
383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA:
383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA:
384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA:
384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA:
384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE:
384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH:
384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA:
384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH:
384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH:
384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH:
384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = OMX_ErrorUnsupportedIndex;
384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (!eRet && !ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &level_control)) {
385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch ((enum v4l2_mpeg_video_h264_level)level_control.value) {
385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel1;
386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel1b;
386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel11;
386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel12;
386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel13;
387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel2;
387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel21;
387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel22;
388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel3;
388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel31;
388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel32;
389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel4;
389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel41;
389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel42;
389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel5;
390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel51;
3905d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                        break;
390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_LEVEL_5_2:
390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->eLevel = OMX_VIDEO_AVCLevel52;
390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         }
39172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QTIIndexParamVideoClientExtradata:
39182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
39192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
39202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVideoClientExtradata");
39212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
39222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
39232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            pParam->nExtradataSize = VENUS_EXTRADATA_SIZE(4096, 2160);
39242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            pParam->nExtradataAllocSize = pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS;
39252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            eRet = OMX_ErrorNone;
39262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
39272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default: {
392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet =OMX_ErrorUnsupportedIndex;
393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_parameter returning WxH(%d x %d) SxSH(%d x %d)",
393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
393711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height,
393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.stride,
393911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.scan_lines);
394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data)
394611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
394711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside use_android_native_buffer");
394811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
394911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)data;
395011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((params == NULL) ||
395211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (params->nativeBuffer == NULL) ||
395311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (params->nativeBuffer->handle == NULL) ||
395411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            !m_enable_android_native_buffers)
395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_use_android_native_buffers = OMX_TRUE;
395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sp<android_native_buffer_t> nBuf = params->nativeBuffer;
395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private_handle_t *handle = (private_handle_t *)nBuf->handle;
395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_CORE_OUTPUT_PORT_INDEX == params->nPortIndex) { //android native buffers can be used only on Output port
396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *buffer = NULL;
396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = (OMX_U8*)mmap(0, handle->size,
396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buffer == MAP_FAILED) {
396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = use_buffer(hComp,params->bufferHeader,params->nPortIndex,data,handle->size,buffer);
397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_smoothstreaming() {
397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER;
398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc < 0) {
398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to enable Smooth Streaming on driver.");
398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorHardware;
398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_smoothstreaming_mode = true;
398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::Setparameter
399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Set Parameter method implementation.
399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE paramIndex,
400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR        paramData)
400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret=0;
401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Set Param in Invalid State");
401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL) {
402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Param in Invalid paramData");
402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((m_state != OMX_StateLoaded) &&
402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_ABSENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING) &&
402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_out_bEnabled == OMX_TRUE) &&
402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_ABSENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING) &&
402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_inp_bEnabled == OMX_TRUE)) {
402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Set Param in Invalid State");
402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)paramIndex) {
403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition: {
403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               //TODO: Check if any allocate buffer/use buffer/useNativeBuffer has
403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               //been called.
403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (int)portDefn->format.video.nFrameHeight,
404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       (int)portDefn->format.video.nFrameWidth);
404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_ERROR("ERROR: Buffers requested exceeds max limit %d",
404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                          portDefn->nBufferCountActual);
404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorBadParameter;
404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (OMX_DirOutput == portDefn->eDir) {
404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition OP port");
405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bool port_format_changed = false;
405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_display_id = portDefn->format.video.pNativeWindow;
405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   unsigned int buffer_size;
405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   /* update output port resolution with client supplied dimensions
405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      in case scaling is enabled, else it follows input resolution set
405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   */
405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   decide_dpb_buffer_mode(is_down_scalar_enabled);
405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (is_down_scalar_enabled) {
405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("SetParam OP: WxH(%u x %u)",
405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameWidth,
406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameHeight);
406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (portDefn->format.video.nFrameHeight != 0x0 &&
406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->format.video.nFrameWidth != 0x0) {
406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Get Resolution failed");
406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorHardware;
407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if ((portDefn->format.video.nFrameHeight != (unsigned int)fmt.fmt.pix_mp.height) ||
407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (portDefn->format.video.nFrameWidth != (unsigned int)fmt.fmt.pix_mp.width)) {
407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   port_format_changed = true;
407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           /* set crop info */
407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nLeft = 0;
407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nTop = 0;
408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nWidth = portDefn->format.video.nFrameWidth;
408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rectangle.nHeight = portDefn->format.video.nFrameHeight;
408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4083fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nLeft = 0;
4084fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nTop = 0;
4085fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nWidth = rectangle.nWidth;
4086fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nHeight = rectangle.nHeight;
4087fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = is_video_session_supported();
408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (eRet)
409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           memset(&fmt, 0x0, sizeof(struct v4l2_format));
409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
40932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           fmt.fmt.pix_mp.height = (unsigned int)portDefn->format.video.nFrameHeight;
40942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           fmt.fmt.pix_mp.width = (unsigned int)portDefn->format.video.nFrameWidth;
409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           fmt.fmt.pix_mp.pixelformat = capture_capability;
409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_LOW("fmt.fmt.pix_mp.height = %d , fmt.fmt.pix_mp.width = %d",
409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.width);
409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Set Resolution failed");
410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else
410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = get_buffer_req(&drv_ctx.op_buf);
410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (eRet) {
410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (secure_mode) {
411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           struct v4l2_control control;
411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE_SCALING_THRESHOLD;
411311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
411411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Failed getting secure scaling threshold : %d, id was : %x", errno, control.id);
411511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorHardware;
411611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else {
411711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               /* This is a workaround for a bug in fw which uses stride
411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                * and slice instead of width and height to check against
411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                * the threshold.
412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                */
412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               OMX_U32 stride, slice;
412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
412311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth);
412411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nFrameHeight);
412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameWidth);
412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, portDefn->format.video.nFrameHeight);
4128b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                               } else if (drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
4129b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                                   stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameWidth);
4130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                                   slice = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, portDefn->format.video.nFrameHeight);
413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               } else {
413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   stride = portDefn->format.video.nFrameWidth;
413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   slice = portDefn->format.video.nFrameHeight;
413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("Stride is %d, slice is %d, sxs is %d\n", stride, slice, stride * slice);
413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("Threshold value is %d\n", control.value);
413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (stride * slice <= (OMX_U32)control.value) {
414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   secure_scaling_to_non_secure_opb = true;
414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   DEBUG_PRINT_HIGH("Enabling secure scalar out of CPZ");
414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_NON_SECURE_OUTPUT2;
414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   control.value = 1;
414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) {
414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       DEBUG_PRINT_ERROR("Enabling non-secure output2 failed");
414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       eRet = OMX_ErrorUnsupportedSetting;
414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   }
414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (eRet) {
415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Requested o/p buf count (%u) exceeds limit (%u)",
415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   } else if (!client_buffers.get_buffer_req(buffer_size)) {
416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Error in getting buffer requirements");
416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   } else if (!port_format_changed) {
416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                       // Buffer count can change only when port is unallocated
4167fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                       if (m_out_mem_ptr &&
4168fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                (portDefn->nBufferCountActual != drv_ctx.op_buf.actualcount ||
4169fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                portDefn->nBufferSize != drv_ctx.op_buf.buffer_size)) {
4170fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Cannot change o/p buffer count since all buffers are not freed yet !");
417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorInvalidState;
417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // route updating of buffer requirements via c2d proxy.
417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // Based on whether c2d is enabled, requirements will be handed
417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // to the vidc driver appropriately
417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = client_buffers.set_buffer_req(portDefn->nBufferSize,
418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                portDefn->nBufferCountActual);
418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (eRet == OMX_ErrorNone) {
418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           m_port_def = *portDefn;
418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("ERROR: OP Requirements(#%d: %u) Requested(#%u: %u)",
418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   drv_ctx.op_buf.mincount, (unsigned int)buffer_size,
418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorBadParameter;
418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else if (OMX_DirInput == portDefn->eDir) {
419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   bool port_format_changed = false;
419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if ((portDefn->format.video.xFramerate >> 16) > 0 &&
419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // Frame rate only should be set if this is a "known value" or to
419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // activate ts prediction logic (arbitrary mode only) sending input
419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       // timestamps with max value (LLONG_MAX).
4198fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                       m_fps_received = portDefn->format.video.xFramerate;
419911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: frame rate set by omx client : %u",
420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.xFramerate >> 16);
420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       Q16ToFraction(portDefn->format.video.xFramerate, drv_ctx.frame_rate.fps_numerator,
420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.frame_rate.fps_denominator);
420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (!drv_ctx.frame_rate.fps_numerator) {
420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator = 30;
420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (drv_ctx.frame_rate.fps_denominator)
420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator = (int)
420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.frame_rate.fps_denominator = 1;
421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.frame_rate.fps_numerator;
421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)",
421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (float)drv_ctx.frame_rate.fps_denominator);
421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_outputparm oparm;
421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       /*XXX: we're providing timing info as seconds per frame rather than frames
421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        * per second.*/
422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_streamparm sparm;
422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sparm.parm.output = oparm;
422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected");
422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorHardware;
422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           break;
423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_perf_control.request_cores(frm_int);
423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (drv_ctx.video_resolution.frame_height !=
423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           portDefn->format.video.nFrameHeight ||
423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           drv_ctx.video_resolution.frame_width  !=
423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           portDefn->format.video.nFrameWidth) {
423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_LOW("SetParam IP: WxH(%u x %u)",
423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameWidth,
424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->format.video.nFrameHeight);
424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       port_format_changed = true;
424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 frameWidth = portDefn->format.video.nFrameWidth;
424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 frameHeight = portDefn->format.video.nFrameHeight;
424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (frameHeight != 0x0 && frameWidth != 0x0) {
424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (m_smoothstreaming_mode &&
424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   ((frameWidth * frameHeight) <
424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   (m_smoothstreaming_width * m_smoothstreaming_height))) {
424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frameWidth = m_smoothstreaming_width;
424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frameHeight = m_smoothstreaming_height;
425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_LOW("NOTE: Setting resolution %u x %u "
425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       "for adaptive-playback/smooth-streaming",
425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                       (unsigned int)frameWidth, (unsigned int)frameHeight);
425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
4254fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
4255fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nLeft = 0;
4256fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nTop = 0;
4257fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nWidth = frameWidth;
4258fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                           m_extradata_info.output_crop_rect.nHeight = frameHeight;
4259fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           update_resolution(frameWidth, frameHeight,
426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   frameWidth, frameHeight);
426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = is_video_session_supported();
426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (eRet)
426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               break;
42652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           if (is_down_scalar_enabled) {
42662601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
42672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
42682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
42692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
42702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = output_capability;
42712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               DEBUG_PRINT_LOW("DS Enabled : height = %d , width = %d",
42722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
42732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
42742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           } else {
42752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               memset(&fmt, 0x0, sizeof(struct v4l2_format));
42762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
42772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
42782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
42792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = output_capability;
42802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               DEBUG_PRINT_LOW("DS Disabled : height = %d , width = %d",
42812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                                   fmt.fmt.pix_mp.height,fmt.fmt.pix_mp.width);
42822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
42832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
42842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               fmt.fmt.pix_mp.pixelformat = capture_capability;
42852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                               ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
42862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                           }
428711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (ret) {
428811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Set Resolution failed");
428911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else {
429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if (!is_down_scalar_enabled)
429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   eRet = get_buffer_req(&drv_ctx.op_buf);
429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
429511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
429611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (m_custom_buffersize.input_buffersize
429711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) {
429811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d",
429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               m_custom_buffersize.input_buffersize, portDefn->nBufferSize);
430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual > MAX_NUM_INPUT_OUTPUT_BUFFERS) {
430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Requested i/p buf count (%u) exceeds limit (%u)",
430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               portDefn->nBufferCountActual, MAX_NUM_INPUT_OUTPUT_BUFFERS);
430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
4309fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                   // Buffer count can change only when port is unallocated
4310fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                   if (m_inp_mem_ptr &&
4311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            (portDefn->nBufferCountActual != drv_ctx.ip_buf.actualcount ||
4312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                            portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)) {
431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Cannot change i/p buffer count since all buffers are not freed yet !");
431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorInvalidState;
431511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       port_format_changed = true;
432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (~(buffer_prop->alignment - 1));
432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = set_buffer_req(buffer_prop);
432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (false == port_format_changed) {
432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("ERROR: IP Requirements(#%d: %u) Requested(#%u: %u)",
432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               drv_ctx.ip_buf.mincount, (unsigned int)drv_ctx.ip_buf.buffer_size,
433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               (unsigned int)portDefn->nBufferCountActual, (unsigned int)portDefn->nBufferSize);
433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadParameter;
433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else if (portDefn->eDir ==  OMX_DirMax) {
433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_ERROR(" Set_parameter: Bad Port idx %d",
433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           (int)portDefn->nPortIndex);
433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorBadPortIndex;
433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat: {
434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                int ret=0;
434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                struct v4l2_format fmt;
434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat 0x%x, port: %u",
434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->eColorFormat, (unsigned int)portFmt->nPortIndex);
434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                memset(&fmt, 0x0, sizeof(struct v4l2_format));
435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (1 == portFmt->nPortIndex) {
435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
43522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
43532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    if (ret < 0) {
43542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                        DEBUG_PRINT_ERROR("%s: Failed to get format on capture mplane", __func__);
43552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                        return OMX_ErrorBadParameter;
43562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                    }
435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    enum vdec_output_fromat op_format;
435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m ||
436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView ||
436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar ||
436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12;
436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43662601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC;
436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else
436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorBadParameter;
437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE)
43722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC;
437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12;
437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet == OMX_ErrorNone) {
437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        drv_ctx.output_format = op_format;
438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (ret) {
438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Set output format failed");
438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorUnsupportedSetting;
438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            /*TODO: How to handle this case */
438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        } else {
438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = get_buffer_req(&drv_ctx.op_buf);
438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (eRet == OMX_ErrorNone) {
439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        if (!client_buffers.set_color_format(portFmt->eColorFormat)) {
439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            DEBUG_PRINT_ERROR("Set color format failed");
439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            eRet = OMX_ErrorBadParameter;
439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        }
439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
439611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPortDefn: {
440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *portFmt =
440211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) paramData;
440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_LOW("set_parameter: OMX_IndexQcomParamPortDefinitionType %u",
440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (unsigned int)portFmt->nFramePackingFormat);
440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Input port */
440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (portFmt->nPortIndex == 0) {
4408fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // arbitrary_bytes mode cannot be changed arbitrarily since this controls how:
4409fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                //   - headers are allocated and
4410fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                //   - headers-indices are derived
4411fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // Avoid changing arbitrary_bytes when the port is already allocated
4412fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                if (m_inp_mem_ptr) {
4413fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    DEBUG_PRINT_ERROR("Cannot change arbitrary-bytes-mode since input port is not free!");
4414fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    return OMX_ErrorUnsupportedSetting;
4415fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                }
441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (portFmt->nFramePackingFormat == OMX_QCOM_FramePacking_Arbitrary) {
441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (secure_mode || m_input_pass_buffer_fd) {
441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = false;
441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("setparameter: cannot set to arbitary bytes mode");
442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorUnsupportedSetting;
442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = true;
442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else if (portFmt->nFramePackingFormat ==
442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_QCOM_FramePacking_OnlyOneCompleteFrame) {
442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    arbitrary_bytes = false;
442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    property_get("vidc.dec.debug.arbitrarybytes.mode", property_value, "0");
442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (atoi(property_value)) {
443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("arbitrary_bytes enabled via property command");
443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        arbitrary_bytes = true;
443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("Setparameter: unknown FramePacking format %u",
443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (unsigned int)portFmt->nFramePackingFormat);
443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorUnsupportedSetting;
443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            } else if (portFmt->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port");
444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if ( (portFmt->nMemRegion > OMX_QCOM_MemRegionInvalid &&
444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            portFmt->nMemRegion < OMX_QCOM_MemRegionMax) &&
444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        portFmt->nCacheAttr == OMX_QCOM_CacheAttrNone) {
444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    m_out_mem_region_smi = OMX_TRUE;
444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("set_parameter: OMX_IndexQcomParamPortDefinitionType OP Port: out pmem set");
444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        m_use_output_pmem = OMX_TRUE;
444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (is_thulium_v1 && !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",
445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_MAX_STRINGNAME_SIZE)) {
445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            arbitrary_bytes = true;
445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_HIGH("Force arbitrary_bytes to true for h264");
445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole: {
446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_PARAM_COMPONENTROLETYPE *comp_role;
446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          comp_role->cRole);
446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  if ((m_state == OMX_StateLoaded)&&
446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          !BITMASK_PRESENT(&m_flags, OMX_COMPONENT_IDLE_PENDING)) {
446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_LOW("Set Parameter called in valid state");
446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else {
447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      return OMX_ErrorIncorrectStateOperation;
447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE)) {
447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.avc", OMX_MAX_STRINGNAME_SIZE);
447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((char*)comp_role->cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE)) {
449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE);
449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE)) {
449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE);
449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) {
450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE);
450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx", OMX_MAX_STRINGNAME_SIZE)) ||
451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) ||
451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE))
451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ) {
451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE)) {
451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE);
451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) ||
452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv", OMX_MAX_STRINGNAME_SIZE))
452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        ) {
452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE)) {
452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vc1", OMX_MAX_STRINGNAME_SIZE);
452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet =OMX_ErrorUnsupportedSetting;
452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE)) {
452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE) ||
453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vp8", OMX_MAX_STRINGNAME_SIZE);
453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) {
453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE) ||
453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              !strncmp((const char*)comp_role->cRole, "video_decoder.vpx", OMX_MAX_STRINGNAME_SIZE)) {
453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.vp9", OMX_MAX_STRINGNAME_SIZE);
454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      if (!strncmp((const char*)comp_role->cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          strlcpy((char*)m_cRole, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      } else {
454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          DEBUG_PRINT_ERROR("Setparameter: unknown Index %s", comp_role->cRole);
454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          eRet = OMX_ErrorUnsupportedSetting;
455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  } else {
455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      DEBUG_PRINT_ERROR("Setparameter: unknown param %s", drv_ctx.kind);
455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = OMX_ErrorInvalidComponentName;
455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt: {
455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             if (m_state != OMX_StateLoaded) {
456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 return OMX_ErrorIncorrectStateOperation;
456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             }
456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (unsigned int)priorityMgmtype->nGroupID);
456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (unsigned int)priorityMgmtype->nGroupPriority);
457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier: {
457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           bufferSupplierType->eBufferSupplier);
458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_buffer_supplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   else
458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorBadPortIndex;
458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc: {
459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc %d",
459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         }
459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)QOMX_IndexParamVideoMvc: {
459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_LOW("set_parameter: QOMX_IndexParamVideoMvc %d",
459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     paramIndex);
460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             break;
460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263: {
460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263 %d",
460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      paramIndex);
460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              break;
460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4: {
460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4 %d",
460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg2: {
461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg2 %d",
461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       paramIndex);
461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamLowLatencyMode: {
461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               struct v4l2_control control;
461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               int rc = 0;
462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam =
462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData;
462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (pParam->bLowLatencyMode) {
462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_HIGH("Enabling DECODE order");
462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   time_stamp_dts.set_timestamp_reorder_mode(false);
462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if (rc) {
462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_ERROR("Set picture order failed");
463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = OMX_ErrorUnsupportedSetting;
463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDecoderPictureOrder: {
463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DECODER_PICTURE_ORDER);
463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     QOMX_VIDEO_DECODER_PICTURE_ORDER *pictureOrder =
463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (QOMX_VIDEO_DECODER_PICTURE_ORDER *)paramData;
463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     struct v4l2_control control;
464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     int pic_order,rc=0;
464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoDecoderPictureOrder %d",
464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             pictureOrder->eOutputPictureOrder);
464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DISPLAY_ORDER) {
464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DISPLAY;
464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     } else if (pictureOrder->eOutputPictureOrder == QOMX_VIDEO_DECODE_ORDER) {
464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         pic_order = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         time_stamp_dts.set_timestamp_reorder_mode(false);
464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     } else
464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         eRet = OMX_ErrorBadParameter;
465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (eRet == OMX_ErrorNone) {
465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         control.value = pic_order;
465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         if (rc) {
465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             DEBUG_PRINT_ERROR("Set picture order failed");
465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             eRet = OMX_ErrorUnsupportedSetting;
465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         }
465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     }
465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamConcealMBMapExtraData:
466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamFrameInfoExtraData:
466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataFrameDimension:
467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEDIMENSION_EXTRADATA, false,
467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamInterlaceExtraData:
467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamH264TimeInfo:
468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoFramePackingExtradata:
468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_FRAMEPACK_EXTRADATA, false,
468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoQPExtraData:
469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_QP_EXTRADATA, false,
469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoInputBitsInfoExtraData:
469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               eRet = enable_extradata(OMX_BITSINFO_EXTRADATA, false,
469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       ((QOMX_ENABLETYPE *)paramData)->bEnable);
470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexEnableExtnUserData:
470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                eRet = enable_extradata(OMX_EXTNUSER_EXTRADATA, false,
470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZipSEIExtraData:
470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDivx: {
471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              QOMX_VIDEO_PARAM_DIVXTYPE* divXType = (QOMX_VIDEO_PARAM_DIVXTYPE *) paramData;
471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          }
471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          break;
471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPlatformPvt: {
471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PLATFORMPRIVATE_EXTN);
471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port");
471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_QCOM_PLATFORMPRIVATE_EXTN* entryType = (OMX_QCOM_PLATFORMPRIVATE_EXTN *) paramData;
471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               if (entryType->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   DEBUG_PRINT_HIGH("set_parameter: Platform Private entry type (%d) not supported.", entryType->type);
472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   eRet = OMX_ErrorUnsupportedSetting;
472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               } else {
472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   m_out_pvt_entry_pmem = OMX_TRUE;
472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   if ((m_out_mem_region_smi && m_out_pvt_entry_pmem)) {
472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexPlatformPvt OP Port: out pmem set");
472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       m_use_output_pmem = OMX_TRUE;
472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               }
472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           }
473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoSyncFrameDecodingMode: {
473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamVideoSyncFrameDecodingMode");
473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       DEBUG_PRINT_HIGH("set idr only decoding for thumbnail mode");
473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       struct v4l2_control control;
473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       int rc;
473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       drv_ctx.idr_only_decoding = 1;
473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       control.id = V4L2_CID_MPEG_VIDC_VIDEO_OUTPUT_ORDER;
473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       control.value = V4L2_MPEG_VIDC_VIDEO_OUTPUT_ORDER_DECODE;
474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (rc) {
474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           DEBUG_PRINT_ERROR("Set picture order failed");
474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           eRet = OMX_ErrorUnsupportedSetting;
474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.id = V4L2_CID_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE;
474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           control.value = V4L2_MPEG_VIDC_VIDEO_SYNC_FRAME_DECODE_ENABLE;
474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control);
474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (rc) {
474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed");
475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           /*Setting sync frame decoding on driver might change buffer
475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            * requirements so update them here*/
475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (get_buffer_req(&drv_ctx.ip_buf)) {
475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer i/p requirements");
475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (get_buffer_req(&drv_ctx.op_buf)) {
475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               DEBUG_PRINT_ERROR("Sync frame setting failed: falied to get buffer o/p requirements");
476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamIndexExtraDataType: {
476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    QOMX_INDEXEXTRADATATYPE *extradataIndexType = (QOMX_INDEXEXTRADATATYPE *) paramData;
476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if ((extradataIndexType->nIndex == OMX_IndexParamPortDefinition) &&
477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (extradataIndexType->bEnabled == OMX_TRUE) &&
477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (extradataIndexType->nPortIndex == 1)) {
477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming");
477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamEnableSmoothStreaming: {
477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef SMOOTH_STREAMING_DISABLED
478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = enable_smoothstreaming();
478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      eRet = OMX_ErrorUnsupportedSetting;
478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  }
478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  /* Need to allow following two set_parameters even in Idle
478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   * state. This is ANDROID architecture which is not in sync
478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   * with openmax standard. */
479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: {
479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           VALIDATE_OMX_PARAM_DATA(paramData, EnableAndroidNativeBuffersParams);
479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           EnableAndroidNativeBuffersParams* enableNativeBuffers = (EnableAndroidNativeBuffersParams *) paramData;
4793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           if (enableNativeBuffers->nPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
4794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers allowed only on output port!");
4795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                eRet = OMX_ErrorUnsupportedSetting;
4796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                break;
4797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           } else if (m_out_mem_ptr) {
4798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                DEBUG_PRINT_ERROR("Enable/Disable android-native-buffers is not allowed since Output port is not free !");
4799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                eRet = OMX_ErrorInvalidState;
4800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                                break;
4801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                           }
480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (enableNativeBuffers) {
480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               m_enable_android_native_buffers = enableNativeBuffers->enable;
480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if !defined(FLEXYUV_SUPPORTED)
480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (m_enable_android_native_buffers) {
480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               // Use the most-preferred-native-color-format as surface-mode is hinted here
480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               if(!client_buffers.set_color_format(getPreferredColorFormatDefaultMode(0))) {
480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   DEBUG_PRINT_ERROR("Failed to set native color format!");
481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                   eRet = OMX_ErrorUnsupportedSetting;
481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               }
481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       break;
481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: {
481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       VALIDATE_OMX_PARAM_DATA(paramData, UseAndroidNativeBufferParams);
481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       eRet = use_android_native_buffer(hComp, paramData);
481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE
482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_GoogleAndroidIndexAllocateNativeHandle: {
4823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
482411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                AllocateNativeHandleParams* allocateNativeHandleParams = (AllocateNativeHandleParams *) paramData;
4825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                VALIDATE_OMX_PARAM_DATA(paramData, AllocateNativeHandleParams);
4826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (allocateNativeHandleParams->nPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
4828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle allowed only on input port!");
4829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
4830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
4831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                } else if (m_inp_mem_ptr) {
4832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Enable/Disable allocate-native-handle is not allowed since Input port is not free !");
4833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    eRet = OMX_ErrorInvalidState;
4834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
4835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
4836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (allocateNativeHandleParams != NULL) {
483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    allocate_native_handle = allocateNativeHandleParams->enable;
483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE
484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamEnableTimeStampReorder: {
484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXTIMESTAMPREORDER);
484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       QOMX_INDEXTIMESTAMPREORDER *reorder = (QOMX_INDEXTIMESTAMPREORDER *)paramData;
484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       if (drv_ctx.picture_order == (vdec_output_order)QOMX_VIDEO_DISPLAY_ORDER) {
484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (reorder->bEnable == OMX_TRUE) {
484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               frm_int =0;
485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               time_stamp_dts.set_timestamp_reorder_mode(true);
485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           } else
485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               time_stamp_dts.set_timestamp_reorder_mode(false);
485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       } else {
485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           time_stamp_dts.set_timestamp_reorder_mode(false);
485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           if (reorder->bEnable == OMX_TRUE) {
485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                               eRet = OMX_ErrorUnsupportedSetting;
485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           }
485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       }
485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   }
486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   break;
486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent: {
486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam =
486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     if (pParam) {
486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         m_profile_lvl.eProfile = pParam->eProfile;
486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         m_profile_lvl.eLevel = pParam->eLevel;
486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     }
486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoMetaBufferMode:
487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            StoreMetaDataInBuffersParams *metabuffer =
487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (StoreMetaDataInBuffersParams *)paramData;
487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!metabuffer) {
487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Invalid param: %p", metabuffer);
487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_dynamic_buf_mode) {
488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Dynamic buffer mode is disabled");
488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (metabuffer->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
4888fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4889fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    if (m_out_mem_ptr) {
4890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        DEBUG_PRINT_ERROR("Enable/Disable dynamic-buffer-mode is not allowed since Output port is not free !");
4891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        eRet = OMX_ErrorInvalidState;
4892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
4893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    }
489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //set property dynamic buffer mode to driver.
489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_control control;
489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_format fmt;
489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id = V4L2_CID_MPEG_VIDC_VIDEO_ALLOC_MODE_OUTPUT;
489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (metabuffer->bStoreMetaData == true) {
489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        control.value = V4L2_MPEG_VIDC_VIDEO_DYNAMIC;
490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        control.value = V4L2_MPEG_VIDC_VIDEO_STATIC;
490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!rc) {
490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("%s buffer mode",
490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (metabuffer->bStoreMetaData == true)? "Enabled dynamic" : "Disabled dynamic");
490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               dynamic_buf_mode = metabuffer->bStoreMetaData;
490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to %s buffer mode",
491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (metabuffer->bStoreMetaData == true)? "enable dynamic" : "disable dynamic");
491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        eRet = OMX_ErrorUnsupportedSetting;
491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR(
491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       "OMX_QcomIndexParamVideoMetaBufferMode not supported for port: %u",
491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned int)metabuffer->nPortIndex);
491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoDownScalar:
492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXDOWNSCALAR);
492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_INDEXDOWNSCALAR* pParam = (QOMX_INDEXDOWNSCALAR*)paramData;
492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_control control;
492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rc;
492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoDownScalar %d\n", pParam->bEnable);
492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam && pParam->bEnable) {
493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = enable_downscalar();
493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc < 0) {
493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s: enable_downscalar failed\n", __func__);
493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_force_down_scalar = pParam->bEnable;
493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = disable_downscalar();
493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc < 0) {
493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s: disable_downscalar failed\n", __func__);
494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_force_down_scalar = pParam->bEnable;
494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoAdaptivePlaybackMode:
494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, PrepareForAdaptivePlaybackParams);
495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_GoogleAndroidIndexPrepareForAdaptivePlayback");
495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            PrepareForAdaptivePlaybackParams* pParams =
495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (PrepareForAdaptivePlaybackParams *) paramData;
495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParams->nPortIndex == OMX_CORE_OUTPUT_PORT_INDEX) {
495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!pParams->bEnable) {
495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorNone;
495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParams->nMaxFrameWidth > maxSmoothStreamingWidth
495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        || pParams->nMaxFrameHeight > maxSmoothStreamingHeight) {
495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR(
496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "Adaptive playback request exceeds max supported resolution : [%u x %u] vs [%u x %u]",
496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             (unsigned int)pParams->nMaxFrameWidth, (unsigned int)pParams->nMaxFrameHeight,
496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             (unsigned int)maxSmoothStreamingWidth, (unsigned int)maxSmoothStreamingHeight);
496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorBadParameter;
496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = enable_adaptive_playback(pParams->nMaxFrameWidth, pParams->nMaxFrameHeight);
496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR(
496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "Prepare for adaptive playback supported only on output port");
497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVideoPreferAdaptivePlayback:
497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoPreferAdaptivePlayback");
497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_disable_dynamic_buf_mode = ((QOMX_ENABLETYPE *)paramData)->bEnable;
498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_dynamic_buf_mode) {
498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Prefer Adaptive Playback is set");
498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoCustomBufferSize:
498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CUSTOM_BUFFERSIZE);
498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize");
499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData;
499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT;
499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = pParam->nBufferSize;
499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set input buffer size");
499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = get_buffer_req(&drv_ctx.ip_buf);
500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (eRet == OMX_ErrorNone) {
500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size;
500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d",
500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_custom_buffersize.input_buffersize);
500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to get buffer requirement");
500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port");
501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZIPSEIType:
501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE);
501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVQZIPSEIType");
501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam =
501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData;
502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable);
502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = enable_extradata(OMX_VQZIPSEI_EXTRADATA, false,
502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((QOMX_ENABLETYPE *)paramData)->bEnable);
502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet != OMX_ErrorNone) {
502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to set SEI Extradata");
502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = enable_extradata(OMX_QP_EXTRADATA, false,
502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ((QOMX_ENABLETYPE *)paramData)->bEnable);
503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (eRet != OMX_ErrorNone) {
503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set QP Extradata");
503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorBadParameter;
503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_extradata = client_extradata & ~OMX_VQZIPSEI_EXTRADATA;
503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_extradata = client_extradata & ~OMX_QP_EXTRADATA;
503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamPassInputBufferFd:
504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes) {
504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("OMX_QTIIndexParamPassInputBufferFd not supported in arbitrary buffer mode");
504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pass_buffer_fd = ((QOMX_ENABLETYPE *)paramData)->bEnable;
505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pass_buffer_fd)
505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable passing input buffer FD");
505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamForceCompressedForDPB:
505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE);
505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceCompressedForDPB");
505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *pParam =
505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_FORCE_COMPRESSED_FOR_DPB_TYPE *)paramData;
506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_disable_ubwc_mode) {
506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("OMX_QTIIndexParamForceCompressedForDPB not supported when ubwc disabled");
506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedSetting;
506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!paramData) {
506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceCompressedForDPB paramData NULL");
506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               eRet = OMX_ErrorBadParameter;
506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_force_compressed_for_dpb = pParam->bEnable;
507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamForceUnCompressedForOPB:
507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB");
507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *pParam =
507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QTI_VIDEO_PARAM_FORCE_UNCOMPRESSED_FOR_OPB_TYPE *)paramData;
507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!paramData) {
508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: OMX_QTIIndexParamForceUnCompressedForOPB paramData is NULL");
508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadParameter;
508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_disable_ubwc_mode = pParam->bEnable;
508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: UBWC %s for OPB", pParam->bEnable ? "disabled" : "enabled");
508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
50882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QTIIndexParamVideoClientExtradata:
50892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
50902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_CLIENT_EXTRADATATYPE);
50912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamVideoClientExtradata");
50922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            QOMX_VIDEO_CLIENT_EXTRADATATYPE *pParam =
50932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                (QOMX_VIDEO_CLIENT_EXTRADATATYPE *)paramData;
50942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            OMX_U32 extradata_size = VENUS_EXTRADATA_SIZE(4096, 2160);
50952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (pParam->nExtradataSize < extradata_size ||
50962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize < (extradata_size * MAX_NUM_INPUT_OUTPUT_BUFFERS) ||
50972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize < (pParam->nExtradataSize * MAX_NUM_INPUT_OUTPUT_BUFFERS)) {
50982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: Incorrect buffer size for client extradata");
50992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                eRet = OMX_ErrorBadParameter;
51002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
51012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
51022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (!m_client_extradata_info.set_extradata_info(dup(pParam->nFd),
51032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                pParam->nExtradataAllocSize, pParam->nExtradataSize)) {
51042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: Setting client extradata failed.");
51052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                eRet = OMX_ErrorBadParameter;
51062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
51072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
51082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
51092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default: {
511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 eRet = OMX_ErrorUnsupportedIndex;
511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone)
511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("set_parameter: Error: 0x%x, setting param 0x%x", eRet, paramIndex);
511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetConfig
512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Get Config Method implementation.
512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_config(OMX_IN OMX_HANDLETYPE      hComp,
513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE configIndex,
513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_PTR     configData)
513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Config in Invalid State");
514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((unsigned long)configIndex) {
514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigInterlaced: {
514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_CONFIG_INTERLACETYPE);
515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_QCOM_CONFIG_INTERLACETYPE *configFmt =
515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (OMX_QCOM_CONFIG_INTERLACETYPE *) configData;
515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                if (configFmt->nPortIndex == 1) {
515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    if (configFmt->nIndex == 0) {
515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType = OMX_QCOM_InterlaceFrameProgressive;
515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (configFmt->nIndex == 1) {
515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType =
515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else if (configFmt->nIndex == 2) {
515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        configFmt->eInterlaceType =
516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    } else {
516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        DEBUG_PRINT_ERROR("get_config: OMX_QcomIndexConfigInterlaced:"
516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                " NoMore Interlaced formats");
516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        eRet = OMX_ErrorNoMore;
516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    }
516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                } else {
516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    DEBUG_PRINT_ERROR("get_config: Bad port index %d queried on only o/p port",
516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            (int)configFmt->nPortIndex);
517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    eRet = OMX_ErrorBadPortIndex;
517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                }
517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexQueryNumberOfVideoDecInstance: {
517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_QUERY_DECODER_INSTANCES);
517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     QOMX_VIDEO_QUERY_DECODER_INSTANCES *decoderinstances =
517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         (QOMX_VIDEO_QUERY_DECODER_INSTANCES*)configData;
517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     decoderinstances->nNumOfInstances = 16;
517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     /*TODO: How to handle this case */
518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     break;
518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 }
518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoFramePackingArrangement: {
518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264) {
518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                  (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              memcpy(configFmt, &m_frame_pack_arrangement,
518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                                  sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          } else {
519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                              DEBUG_PRINT_ERROR("get_config: Framepack data not supported for non H264 codecs");
519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          }
519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          break;
519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      }
519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigCommonOutputCrop: {
519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_RECTTYPE);
519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  OMX_CONFIG_RECTTYPE *rect = (OMX_CONFIG_RECTTYPE *) configData;
519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  memcpy(rect, &rectangle, sizeof(OMX_CONFIG_RECTTYPE));
519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  DEBUG_PRINT_HIGH("get_config: crop info: L: %u, T: %u, R: %u, B: %u",
519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        rectangle.nLeft, rectangle.nTop,
520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        rectangle.nWidth, rectangle.nHeight);
520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  break;
520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              }
520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigPerfLevel: {
520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL);
520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control) < 0) {
521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed getting performance level: %d", errno);
521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorHardware;
521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (eRet == OMX_ErrorNone) {
521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    switch (control.value) {
521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO:
521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            perf->ePerfLevel = OMX_QCOM_PerfLevelTurbo;
521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        default:
522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_HIGH("Unknown perf level %d, reporting Nominal instead", control.value);
522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Fall through */
522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL:
522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            perf->ePerfLevel = OMX_QCOM_PerfLevelNominal;
522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigH264EntropyCodingCabac: {
523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_H264ENTROPYCODINGTYPE);
523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData;
523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_control control;
523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) {
523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264");
523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorNotImplemented;
523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) {
524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                coding->bCabac = (OMX_BOOL)
524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (control.value == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC);
524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* We can't query driver at the moment for the cabac mode, so
524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * just use 0xff...f as a place holder for future improvement */
524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                coding->nCabacInitIdc = ~0;
524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedIndex;
525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
5255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_QTIIndexConfigDescribeColorAspects:
5256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        {
5257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            print_debug_color_aspects(&(m_client_color_space.sAspects), "GetConfig Client");
5261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            print_debug_color_aspects(&(m_internal_color_space.sAspects), "GetConfig Internal");
5262fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5263fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (params->bRequestingDataSpace) {
5264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Does not handle dataspace request");
5265fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorUnsupportedSetting;
5266fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
5267fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (m_internal_color_space.bDataSpaceChanged == OMX_TRUE) {
5268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_LOW("Updating Client's color aspects with internal");
5269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                memcpy(&(m_client_color_space.sAspects),
5270fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        &(m_internal_color_space.sAspects), sizeof(ColorAspects));
5271fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                m_internal_color_space.bDataSpaceChanged = OMX_FALSE;
5272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
5273fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            memcpy(&(params->sAspects), &(m_client_color_space.sAspects), sizeof(ColorAspects));
5274fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5275fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
5276fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5277fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        case OMX_QTIIndexConfigDescribeHDRColorInfo:
5278fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        {
5279fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams);
5280fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData;
5281fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            auto_lock lock(m_hdr_info_client_lock);
5282fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5283fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "GetConfig Client HDR");
5284fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "GetConfig Internal HDR");
5285fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5286fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (m_change_client_hdr_info) {
5287fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_LOW("Updating Client's HDR Info with internal");
5288fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                memcpy(&m_client_hdr_info.sInfo,
5289fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                       &m_internal_hdr_info.sInfo, sizeof(HDRStaticInfo));
5290fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                m_change_client_hdr_info = false;
5291fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
5292fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5293fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            memcpy(&(params->sInfo), &(m_client_hdr_info.sInfo), sizeof(HDRStaticInfo));
5294fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5295fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            break;
5296fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
5297fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        default:
5298fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        {
5299fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_ERROR("get_config: unknown param %d",configIndex);
5300fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            eRet = OMX_ErrorBadParameter;
5301fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SetConfig
531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Set Config method implementation
531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if successful.
532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_config(OMX_IN OMX_HANDLETYPE      hComp,
532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_INDEXTYPE configIndex,
532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR        configData)
532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Config in Invalid State");
532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_VIDEO_CONFIG_NALSIZE *pNal;
533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Set Config Called");
533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (configIndex == OMX_IndexConfigVideoNalSize) {
533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control temp;
533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        temp.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT;
533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_NALSIZE);
534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pNal = reinterpret_cast < OMX_VIDEO_CONFIG_NALSIZE * >(configData);
534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (pNal->nNaluBytes) {
534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 0:
534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES;
534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 2:
534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_TWO_BYTE_LENGTH;
534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case 4:
535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                temp.value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH;
535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorUnsupportedSetting;
535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!arbitrary_bytes) {
535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* In arbitrary bytes mode, the assembler strips out nal size and replaces
535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             * with start code, so only need to notify driver in frame by frame mode */
535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &temp)) {
536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT");
536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorHardware;
536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_length = pNal->nNaluBytes;
536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.init_nal_length(nal_length);
536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("OMX_IndexConfigVideoNalSize called with Size %d", nal_length);
536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexVendorVideoFrameRate) {
537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_VENDOR_VIDEOFRAMERATE *config = (OMX_VENDOR_VIDEOFRAMERATE *) configData;
537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Index OMX_IndexVendorVideoFrameRate %u", (unsigned int)config->nFps);
537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (config->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (config->bEnabled) {
5376fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if ((config->nFps >> 16) > 0 &&
5377fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        (config->nFps >> 16) <= MAX_SUPPORTED_FPS) {
5378fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    m_fps_received = config->nFps;
537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("set_config: frame rate set by omx client : %u",
538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)config->nFps >> 16);
538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    Q16ToFraction(config->nFps, drv_ctx.frame_rate.fps_numerator,
538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.frame_rate.fps_denominator);
538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!drv_ctx.frame_rate.fps_numerator) {
538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Numerator is zero setting to 30");
538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator = 30;
538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.frame_rate.fps_denominator) {
539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator = (int)
539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator;
539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.frame_rate.fps_denominator = 1;
539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 /
539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.frame_rate.fps_numerator;
539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_outputparm oparm;
539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*XXX: we're providing timing info as seconds per frame rather than frames
540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     * per second.*/
540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct v4l2_streamparm sparm;
540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sparm.parm.output = oparm;
540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                performance might be affected");
541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        ret = OMX_ErrorHardware;
541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    client_set_fps = true;
541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Frame rate not supported.");
541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ret = OMX_ErrorUnsupportedSetting;
541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("set_config: Disabled client's frame rate");
541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_set_fps = false;
542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR(" Set_config: Bad Port idx %d",
542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (int)config->nPortIndex);
542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = OMX_ErrorBadPortIndex;
542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPerfLevel) {
542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel);
543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (perf->ePerfLevel) {
543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PerfLevelNominal:
543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PerfLevelTurbo:
544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = OMX_ErrorUnsupportedSetting;
544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret == OMX_ErrorNone) {
545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_QcomIndexConfigPictureTypeDecode) {
545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *config =
545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (OMX_QCOM_VIDEO_CONFIG_PICTURE_TYPE_DECODE *)configData;
545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set picture type decode: %d", config->eDecodeType);
546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PICTYPE_DEC_MODE;
546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (config->eDecodeType) {
546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PictypeDecode_I:
546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_ON;
546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_QCOM_PictypeDecode_IPB:
546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_VIDEO_PICTYPE_DECODE_OFF;
546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control) < 0) ?
547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorUnsupportedSetting : OMX_ErrorNone;
547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret)
547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set picture type decode");
547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexConfigPriority) {
547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData;
548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32);
548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY;
548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (priority->nU32 == 0)
548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE;
548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE;
548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set Priority");
549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = OMX_ErrorUnsupportedSetting;
549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((int)configIndex == (int)OMX_IndexConfigOperatingRate) {
549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData;
549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set_config: operating-rate %u fps", rate->nU32 >> 16);
549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE;
550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = rate->nU32;
550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        operating_frame_rate = rate->nU32 >> 16;
550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = errno == -EBUSY ? OMX_ErrorInsufficientResources :
550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_ErrorUnsupportedSetting;
550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set operating rate %u fps (%s)",
551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rate->nU32 >> 16, errno == -EBUSY ? "HW Overload" : strerror(errno));
551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return ret;
5513fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5514fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeColorAspects) {
5515fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
5516fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
5517fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (!DEFAULT_EXTRADATA & OMX_DISPLAY_INFO_EXTRADATA) {
5518fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            enable_extradata(OMX_DISPLAY_INFO_EXTRADATA, true, true);
5519fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5520fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5521fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(params->sAspects), "Set Config");
5522fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memcpy(&m_client_color_space, params, sizeof(DescribeColorAspectsParams));
5523fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return ret;
5524fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    } else if ((int)configIndex == (int)OMX_QTIIndexConfigDescribeHDRColorInfo) {
5525fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        VALIDATE_OMX_PARAM_DATA(configData, DescribeHDRStaticInfoParams);
5526fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DescribeHDRStaticInfoParams *params = (DescribeHDRStaticInfoParams *)configData;
5527fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (!DEFAULT_EXTRADATA & OMX_HDR_COLOR_INFO_EXTRADATA) {
5528fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            ret = enable_extradata(OMX_HDR_COLOR_INFO_EXTRADATA, true, true);
5529fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (ret != OMX_ErrorNone) {
5530fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_ERROR("Failed to enable OMX_HDR_COLOR_INFO_EXTRADATA");
5531fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                return ret;
5532fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
5533fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
5534fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
5535fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        print_debug_hdr_color_info(&(params->sInfo), "Set Config HDR");
5536fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        memcpy(&m_client_hdr_info, params, sizeof(DescribeHDRStaticInfoParams));
5537fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return ret;
553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5543fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define extn_equals(param, extn) (!strcmp(param, extn))
554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetExtensionIndex
554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX GetExtensionIndex method implementaion.  <TBD>
555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_extension_index(OMX_IN OMX_HANDLETYPE      hComp,
556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_STRING      paramName,
556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_INDEXTYPE* indexType)
556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Get Extension Index in Invalid State");
556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QCOM.index.param.video.SyncFrameDecodingMode")) {
556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoSyncFrameDecodingMode;
556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QCOM.index.param.IndexExtraData")) {
557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamIndexExtraDataType;
557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_FRAMEPACKING_EXTRADATA)) {
557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoFramePackingExtradata;
557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO)) {
557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoFramePackingArrangement;
557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_QP_EXTRADATA)) {
557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPExtraData;
557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_INPUTBITSINFO_EXTRADATA)) {
557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoInputBitsInfoExtraData;
557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QCOM_INDEX_PARAM_VIDEO_EXTNUSER_EXTRADATA)) {
558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableExtnUserData;
558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.enableAndroidNativeBuffers")) {
558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer2")) {
558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.useAndroidNativeBuffer")) {
558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extension: %s is supported", paramName);
558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.getAndroidNativeBufferUsage")) {
559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if ALLOCATE_OUTPUT_NATIVEHANDLE
559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) {
559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle;
559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //ALLOCATE_OUTPUT_NATIVEHANDLE
559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) {
560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode;
560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.google.android.index.prepareForAdaptivePlayback")) {
560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoAdaptivePlaybackMode;
560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK)) {
560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoPreferAdaptivePlayback;
560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef FLEXYUV_SUPPORTED
561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName,"OMX.google.android.index.describeColorFormat")) {
561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QcomIndexFlexibleYUVDescription;
561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (extn_equals(paramName, "OMX.QCOM.index.param.video.PassInputBufferFd")) {
561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamPassInputBufferFd;
561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceCompressedForDPB")) {
561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceCompressedForDPB;
561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.ForceUnCompressedForOPB")) {
561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamForceUnCompressedForOPB;
562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) {
562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode;
56222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    } else if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_CLIENT_EXTRADATA)) {
56232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoClientExtradata;
5624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) {
5625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects;
5626fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    } else if (extn_equals(paramName, "OMX.google.android.index.describeHDRStaticInfo")) {
5627fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeHDRColorInfo;
562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extension: %s not implemented", paramName);
563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNotImplemented;
563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::GetState
563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns the state information back to the caller.<TBD>
564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Error None if everything is successful.
564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::get_state(OMX_IN OMX_HANDLETYPE  hComp,
564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_STATETYPE* state)
565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *state = m_state;
565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("get_state: Returning the state %d",*state);
565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentTunnelRequest
566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Component Tunnel Request method implementation. <TBD>
566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
566811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
566911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
567011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
567111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_tunnel_request(OMX_IN OMX_HANDLETYPE  hComp,
567211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE        peerComponent,
567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                    peerPort,
567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) peerComponent;
568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) peerPort;
568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) tunnelSetup;
568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Error: component_tunnel_request Not Implemented");
568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseOutputBuffer
568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper function for Use buffer in the input pin
569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_extradata()
570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.extradata_info.buffer_size) {
570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.ion.ion_alloc_data.handle) {
570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.extradata_info.ion);
570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.size = (drv_ctx.extradata_info.size + 4095) & (~4095);
571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size, 4096,
571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.extradata_info.ion.ion_alloc_data,
571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.extradata_info.ion.fd_ion_data, 0);
571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.ion.ion_device_fd < 0) {
571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc extradata memory");
571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.uaddr = (char *)mmap(NULL,
571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size,
572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                PROT_READ|PROT_WRITE, MAP_SHARED,
572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.ion.fd_ion_data.fd , 0);
572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.extradata_info.uaddr == MAP_FAILED) {
572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to map extradata memory");
572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.extradata_info.ion);
572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_other_extradata) {
573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_other_extradata = (OMX_OTHER_EXTRADATATYPE *)malloc(drv_ctx.extradata_info.buffer_size);
573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_other_extradata) {
573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc memory\n");
573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_extradata()
574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.extradata_info.uaddr) {
574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        munmap((void *)drv_ctx.extradata_info.uaddr, drv_ctx.extradata_info.size);
574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(drv_ctx.extradata_info.ion.fd_ion_data.fd);
574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_ion_memory(&drv_ctx.extradata_info.ion);
574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_other_extradata) {
575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_other_extradata);
575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_other_extradata = NULL;
575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_output_buffer(
575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned                         i= 0; // Temporary counter
576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PTR privateAppData = NULL;
576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private_handle_t *handle = NULL;
576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buff = buffer;
577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Use_op_buf:Allocating output headers");
577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_output_headers();
577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet == OMX_ErrorNone)
578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_extradata();
578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_out_bm_count,i)) {
578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i >= drv_ctx.op_buf.actualcount) {
579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Already using %d o/p buffers", drv_ctx.op_buf.actualcount);
579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone)
579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return eRet;
579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_out_mem_ptr + i );
580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pBuffer = NULL;
580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i == (drv_ctx.op_buf.actualcount - 1) && !streaming[CAPTURE_PORT]) {
580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enum v4l2_buf_type buf_type;
580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rr = 0;
580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rr = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON, &buf_type)) {
580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("STREAMON FAILED : %d", rr);
580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = true;
581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("STREAMON Successful");
581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enabling Turbo mode");
581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_out_bm_count,i);
581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pAppPrivate = appData;
581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pBuffer = buffer;
582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_HONEYCOMB_) || defined(_ANDROID_ICS_)
582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_enable_android_native_buffers) {
582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_use_android_native_buffers) {
582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                UseAndroidNativeBufferParams *params = (UseAndroidNativeBufferParams *)appData;
582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sp<android_native_buffer_t> nBuf = params->nativeBuffer;
583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                handle = (private_handle_t *)nBuf->handle;
583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = params->pAppPrivate;
583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                handle = (private_handle_t *)buff;
583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!handle) {
583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("handle is invalid");
583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((OMX_U32)handle->size < drv_ctx.op_buf.buffer_size) {
584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (secure_mode && secure_scaling_to_non_secure_opb) {
584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Buffer size expected %u, got %u, but it's ok since we will never map it",
584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Insufficient sized buffer given for playback,"
584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            " expected %u, got %u",
584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)drv_ctx.op_buf.buffer_size, (unsigned int)handle->size);
584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.buffer_size = handle->size;
585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_use_android_native_buffers) {
585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buff =  (OMX_U8*)mmap(0, handle->size,
585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (buff == MAP_FAILED) {
586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Failed to mmap pmem with fd = %d, size = %d", handle->fd, handle->size);
586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined(_ANDROID_ICS_)
586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[i].nativehandle = handle;
586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[i].privatehandle = handle;
586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!handle) {
587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Native Buffer handle is NULL");
587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].pmem_fd = handle->fd;
587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].offset = 0;
587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].mmaped_size = handle->size;
587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!ouput_egl_buffers && !m_use_output_pmem) {
588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.alignment,
588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &drv_ctx.op_buf_ion_info[i].ion_alloc_data,
588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &drv_ctx.op_buf_ion_info[i].fd_ion_data,
588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        secure_mode ? SECURE_FLAGS_OUTPUT_BUFFER : 0);
588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.op_buf_ion_info[i].ion_device_fd < 0) {
588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ION device fd is bad %d", drv_ctx.op_buf_ion_info[i].ion_device_fd);
589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = \
589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      open (MEM_DEVICE,O_RDWR);
589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* FIXME: why is this code even here? We already open MEM_DEVICE a few lines above */
590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[i].pmem_fd == 0) {
590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].pmem_fd = \
590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          open (MEM_DEVICE,O_RDWR);
590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[i].pmem_fd < 0) {
590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ION/pmem buffer fd is bad %d", drv_ctx.ptr_outputbuffer[i].pmem_fd);
590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!align_pmem_buffers(drv_ctx.ptr_outputbuffer[i].pmem_fd,
591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.op_buf.buffer_size,
591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.op_buf.alignment)) {
591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].bufferaddr =
592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned char *)mmap(NULL, drv_ctx.op_buf.buffer_size,
592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                PROT_READ|PROT_WRITE, MAP_SHARED,
592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[i].pmem_fd,0);
592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[i].bufferaddr == MAP_FAILED) {
592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        close(drv_ctx.ptr_outputbuffer[i].pmem_fd);
592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Unable to mmap output buffer");
593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorInsufficientResources;
593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = 0;
593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Use_op_buf: out_pmem=%d",m_use_output_pmem);
594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!appData || !bytes ) {
594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!secure_mode && !buffer) {
594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Bad parameters for use buffer in EGL image case");
594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_LIST *pmem_list;
594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pmem_info;
594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST*) appData;
595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!pmem_list || !pmem_list->entryList || !pmem_list->entryList->entry ||
595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        !pmem_list->nEntries ||
595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_list->entryList->type != OMX_QCOM_PLATFORM_PRIVATE_PMEM) {
595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Pmem info not valid in use buffer");
595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_info = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_list->entryList->entry;
595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("vdec: use buf: pmem_fd=0x%lx",
595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_info->pmem_fd);
596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_info->pmem_fd;
596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = pmem_info->offset;
596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr = buff;
596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].mmaped_size =
596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[i].buffer_len = drv_ctx.op_buf.buffer_size;
596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                privateAppData = appData;
596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].pmem_fd = drv_ctx.ptr_outputbuffer[i].pmem_fd;
596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_out_mem_ptr + i );
597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode)
597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[i],
597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sizeof (vdec_bufferpayload));
597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set the Output Buffer Idx: %d Addr: %p, pmem_fd=0x%x", i,
598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr,
598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd );
598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = i;
598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].length = drv_ctx.op_buf.buffer_size;
598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[i].pmem_fd;
599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].data_offset = 0;
599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].data_offset = 0;
600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = plane;
600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = drv_ctx.num_planes;
600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf)) {
601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to prepare bufs");
601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i == (drv_ctx.op_buf.actualcount -1) && !streaming[CAPTURE_PORT]) {
601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enum v4l2_buf_type buf_type;
601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type)) {
601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = true;
602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("STREAMON Successful");
602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Enabling Turbo mode");
602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->nAllocLen = drv_ctx.op_buf.buffer_size;
603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_enable_android_native_buffers) {
603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("setting pBuffer to private_handle_t %p", handle);
603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = (OMX_U8 *)handle;
603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = buff;
603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*bufferHdr)->pAppPrivate = privateAppData;
603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_out_bm_count,i);
603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::use_input_heap_buffers
604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use Buffer Heap allocation method implementation.
604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None , if everything successful.
605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_input_heap_buffers(
605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside %s, %p", __FUNCTION__, buffer);
606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
60667b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
60677b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (secure_mode) {
60687b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        DEBUG_PRINT_ERROR("use_input_heap_buffers is not allowed in secure mode");
60697b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan        return OMX_ErrorUndefined;
60707b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    }
60717b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan
607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_heap_ptr)
607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*)
607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.actualcount);
607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_phdr_pmem_ptr)
607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**)
607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.actualcount);
608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_heap_ptr || !m_phdr_pmem_ptr) {
608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficent memory");
608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_in_alloc_cnt < drv_ctx.ip_buf.actualcount) {
608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_use_buffer = true;
608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&m_inp_heap_ptr[m_in_alloc_cnt], 0, sizeof(OMX_BUFFERHEADERTYPE));
608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].pBuffer = buffer;
608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nAllocLen = bytes;
608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].pAppPrivate = appData;
608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nInputPortIndex = (OMX_U32) OMX_DirInput;
609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[m_in_alloc_cnt].nOutputPortIndex = (OMX_U32) OMX_DirMax;
609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = &m_inp_heap_ptr[m_in_alloc_cnt];
609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_input_buffer(hComp, &m_phdr_pmem_ptr[m_in_alloc_cnt], port, appData, bytes);
609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Heap buffer(%p) Pmem buffer(%p)", *bufferHdr, m_phdr_pmem_ptr[m_in_alloc_cnt]);
609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[m_in_alloc_cnt],
609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL, (unsigned)NULL)) {
609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_in_alloc_cnt++;
610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("All i/p buffers have been set!");
610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseBuffer
611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use Buffer method implementation.
611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None , if everything successful.
611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_buffer(
612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes,
612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U8*                   buffer)
612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE error = OMX_ErrorNone;
613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || bytes == 0 || (!secure_mode && buffer == NULL)) {
613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("bad param 0x%p %u 0x%p",bufferHdr, (unsigned int)bytes, buffer);
613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Use Buffer in Invalid State");
613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6140fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
6141fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
6142fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ensure that use-buffer was called for previous allocation.
6143fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // Mix-and-match of useBuffer and allocateBuffer is not allowed
6144fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (m_inp_mem_ptr && !input_use_buffer) {
6145fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("'Use' Input buffer called after 'Allocate' Input buffer !");
6146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUndefined;
6147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = use_input_heap_buffers(hComp, bufferHdr, port, appData, bytes, buffer);
6149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX)
615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); //not tested
615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = OMX_ErrorBadPortIndex;
615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Use Buffer: port %u, buffer %p, eRet %d", (unsigned int)port, *bufferHdr, error);
615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (error == OMX_ErrorNone) {
615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_done() && BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Send the callback now
615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandStateSet,OMX_StateIdle,
616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated &&
616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortEnable,
616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_INPUT_PORT_INDEX,
616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated &&
617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortEnable,
617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_OUTPUT_PORT_INDEX,
617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return error;
617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(unsigned int bufferindex,
618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *pmem_bufferHdr)
618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_heap_ptr && !input_use_buffer && arbitrary_bytes) {
618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr[bufferindex].pBuffer)
618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free(m_inp_heap_ptr[bufferindex].pBuffer);
618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr[bufferindex].pBuffer = NULL;
618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_bufferHdr)
618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_input_buffer(pmem_bufferHdr);
619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || m_inp_mem_ptr == NULL) {
619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufferHdr - m_inp_mem_ptr;
620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    auto_lock l(buf_lock);
620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufferHdr->pInputPortPrivate = NULL;
620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < drv_ctx.ip_buf.actualcount && drv_ctx.ptr_inputbuffer) {
620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Input Buffer index = %d",index);
620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ptr_inputbuffer[index].pmem_fd >= 0) {
620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct vdec_setbuffer_cmd setbuffers;
621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setbuffers.buffer_type = VDEC_BUFFER_TYPE_INPUT;
621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy (&setbuffers.buffer,&drv_ctx.ptr_inputbuffer[index],
621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sizeof (vdec_bufferpayload));
621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!secure_mode) {
621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("unmap the input buffer fd=%d",
621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].pmem_fd);
621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("unmap the input buffer size=%u  address = %p",
621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.ptr_inputbuffer[index].mmaped_size,
621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].bufferaddr);
621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                munmap (drv_ctx.ptr_inputbuffer[index].bufferaddr,
622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_inputbuffer[index].mmaped_size);
6221d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            }
6222d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
6223d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            if (allocate_native_handle){
622411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_t *nh = (native_handle_t *)bufferHdr->pBuffer;
622511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_close(nh);
622611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                native_handle_delete(nh);
6227d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            } else {
6228d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                // Close fd for non-secure and secure non-native-handle case
6229d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel                close(drv_ctx.ptr_inputbuffer[index].pmem_fd);
623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer[index].pmem_fd = -1;
6232d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_desc_buffer_ptr && m_desc_buffer_ptr[index].buf_addr) {
623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_desc_buffer_ptr[index].buf_addr);
623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_desc_buffer_ptr[index].buf_addr = NULL;
623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_desc_buffer_ptr[index].desc_data_size = 0;
623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_ion_memory(&drv_ctx.ip_buf_ion_info[index]);
624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr)
624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL || m_out_mem_ptr == NULL) {
625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufferHdr - m_out_mem_ptr;
625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Free ouput Buffer index = %d",index);
625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < drv_ctx.op_buf.actualcount
625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && drv_ctx.ptr_outputbuffer) {
626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free ouput Buffer index = %d addr = %p", index,
626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[index].bufferaddr);
626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_setbuffer_cmd setbuffers;
626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        setbuffers.buffer_type = VDEC_BUFFER_TYPE_OUTPUT;
626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy (&setbuffers.buffer,&drv_ctx.ptr_outputbuffer[index],
626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sizeof (vdec_bufferpayload));
626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!dynamic_buf_mode) {
626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (streaming[CAPTURE_PORT] &&
627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !(in_reconfig || BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING))) {
627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (stream_off(OMX_CORE_OUTPUT_PORT_INDEX)) {
627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("STREAMOFF Failed");
627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("STREAMOFF Successful");
627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_enable_android_native_buffers) {
627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[index].pmem_fd > 0) {
628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        munmap(drv_ctx.ptr_outputbuffer[index].bufferaddr,
628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[index].mmaped_size);
628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[index].pmem_fd = -1;
628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (drv_ctx.ptr_outputbuffer[0].pmem_fd > 0 && !ouput_egl_buffers && !m_use_output_pmem) {
628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!secure_mode) {
629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("unmap the output buffer fd = %d",
629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[0].pmem_fd);
629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("unmap the ouput buffer size=%u  address = %p",
629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned int)drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount,
629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[0].bufferaddr);
629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        munmap (drv_ctx.ptr_outputbuffer[0].bufferaddr,
629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.ptr_outputbuffer[0].mmaped_size * drv_ctx.op_buf.actualcount);
629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    close (drv_ctx.ptr_outputbuffer[0].pmem_fd);
629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[0].pmem_fd = -1;
630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_ion_memory(&drv_ctx.op_buf_ion_info[0]);
630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } //!dynamic_buf_mode
630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_output_done()) {
630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_extradata();
631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE **bufferHdr,
631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32              port,
632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PTR              appData,
632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32              bytes)
632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *input = NULL;
632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char *buf_addr = NULL;
632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned   i = 0;
632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Sanity Check*/
632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufferHdr == NULL) {
633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_heap_ptr == NULL) {
633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_heap_ptr = (OMX_BUFFERHEADERTYPE*) \
633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 calloc( (sizeof(OMX_BUFFERHEADERTYPE)),
633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         drv_ctx.ip_buf.actualcount);
633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_phdr_pmem_ptr = (OMX_BUFFERHEADERTYPE**) \
633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  calloc( (sizeof(OMX_BUFFERHEADERTYPE*)),
633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          drv_ctx.ip_buf.actualcount);
634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr == NULL || m_phdr_pmem_ptr == NULL) {
634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("m_inp_heap_ptr or m_phdr_pmem_ptr Allocation failed ");
634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Find a Free index*/
634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_heap_inp_bm_count,i)) {
635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < drv_ctx.ip_buf.actualcount) {
635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_addr = (unsigned char *)malloc (drv_ctx.ip_buf.buffer_size);
635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buf_addr == NULL) {
635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_inp_heap_ptr + i);
636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input = *bufferHdr;
636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_heap_inp_bm_count,i);
636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pBuffer           = (OMX_U8 *)buf_addr;
636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nVersion.nVersion = OMX_SPEC_VERSION;
636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pAppPrivate       = appData;
637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Address of Heap Buffer %p",*bufferHdr );
637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = allocate_input_buffer(hComp,&m_phdr_pmem_ptr [i],port,appData,bytes);
637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Address of Pmem Buffer %p",m_phdr_pmem_ptr[i]);
637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Add the Buffers to freeq*/
637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_free_q.insert_entry((unsigned long)m_phdr_pmem_ptr[i],
637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL, (unsigned)NULL)) {
637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Free_q is full");
637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateInputBuffer
639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper function for allocate buffer in the input pin
639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_input_buffer(
640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes)
641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *input = NULL;
641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned   i = 0;
641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned char *buf_addr = NULL;
641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int pmem_fd = -1;
641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) port;
642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bytes != drv_ctx.ip_buf.buffer_size) {
642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Requested Size is wrong %u epected is %u",
642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)bytes, (unsigned int)drv_ctx.ip_buf.buffer_size);
642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_mem_ptr) {
642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate i/p buffer Header: Cnt(%d) Sz(%u)",
643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ip_buf.actualcount,
643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)drv_ctx.ip_buf.buffer_size);
643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \
643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                calloc( (sizeof(OMX_BUFFERHEADERTYPE)), drv_ctx.ip_buf.actualcount);
643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_mem_ptr == NULL) {
643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer = (struct vdec_bufferpayload *) \
644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc ((sizeof (struct vdec_bufferpayload)),drv_ctx.ip_buf.actualcount);
644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ptr_inputbuffer == NULL) {
644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info = (struct vdec_ion *) \
644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc ((sizeof (struct vdec_ion)),drv_ctx.ip_buf.actualcount);
644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ip_buf_ion_info == NULL) {
645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i < drv_ctx.ip_buf.actualcount; i++) {
645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].pmem_fd = -1;
645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ip_buf_ion_info[i].ion_device_fd = -1;
645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.ip_buf.actualcount; i++) {
646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free Input Buffer Index %d",i);
646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < drv_ctx.ip_buf.actualcount) {
647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_buffer buf;
647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_plane plane;
647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc;
647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Allocate input Buffer");
647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info[i].ion_device_fd = alloc_map_ion_memory(
647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ip_buf.buffer_size,drv_ctx.op_buf.alignment,
647811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.ip_buf_ion_info[i].ion_alloc_data,
647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &drv_ctx.ip_buf_ion_info[i].fd_ion_data, secure_mode ?
648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SECURE_FLAGS_INPUT_BUFFER : ION_FLAG_CACHED);
648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.ip_buf_ion_info[i].ion_device_fd < 0) {
648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = drv_ctx.ip_buf_ion_info[i].fd_ion_data.fd;
648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = open (MEM_DEVICE,O_RDWR);
648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd < 0) {
648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd == 0) {
649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_fd = open (MEM_DEVICE,O_RDWR);
649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pmem_fd < 0) {
649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("open failed for pmem/adsp for input buffer");
649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
650211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!align_pmem_buffers(pmem_fd, drv_ctx.ip_buf.buffer_size,
650311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.alignment)) {
650411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
650511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(pmem_fd);
650611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
650711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
650811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
650911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
651011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_addr = (unsigned char *)mmap(NULL,
651111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ip_buf.buffer_size,
651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, pmem_fd, 0);
651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buf_addr == MAP_FAILED) {
651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                close(pmem_fd);
651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_ion_memory(&drv_ctx.ip_buf_ion_info[i]);
651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Map Failed to allocate input buffer");
652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *bufferHdr = (m_inp_mem_ptr + i);
652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (secure_mode)
652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].bufferaddr = *bufferHdr;
652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_inputbuffer [i].bufferaddr = buf_addr;
652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].pmem_fd = pmem_fd;
652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].buffer_len = drv_ctx.ip_buf.buffer_size;
653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].mmaped_size = drv_ctx.ip_buf.buffer_size;
653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer [i].offset = 0;
653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = i;
653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.bytesused = 0;
653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.length = drv_ctx.ptr_inputbuffer [i].mmaped_size;
653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.m.userptr = (unsigned long)drv_ctx.ptr_inputbuffer[i].bufferaddr;
654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.reserved[0] =drv_ctx.ptr_inputbuffer [i].pmem_fd;
654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.reserved[1] = 0;
654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane.data_offset = drv_ctx.ptr_inputbuffer[i].offset;
654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = &plane;
654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = 1;
654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set the input Buffer Idx: %d Addr: %p", i,
654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_inputbuffer[i].bufferaddr);
654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to prepare bufs");
655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input = *bufferHdr;
655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BITMASK_SET(&m_inp_bm_count,i);
655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer address %p of pmem",*bufferHdr);
656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_native_handle) {
656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_handle_t *nh = native_handle_create(1 /*numFds*/, 0 /*numInts*/);
656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!nh) {
656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Native handle create failed");
656411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nh->data[0] = drv_ctx.ptr_inputbuffer[i].pmem_fd;
656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer = (OMX_U8 *)nh;
656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (secure_mode || m_input_pass_buffer_fd) {
656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*Legacy method, pass ion fd stashed directly in pBuffer*/
657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer = (OMX_U8 *)(intptr_t)drv_ctx.ptr_inputbuffer[i].pmem_fd;
657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            input->pBuffer           = (OMX_U8 *)buf_addr;
657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nVersion.nVersion = OMX_SPEC_VERSION;
657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nAllocLen         = drv_ctx.ip_buf.buffer_size;
657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pAppPrivate       = appData;
657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->nInputPortIndex   = OMX_CORE_INPUT_PORT_INDEX;
657911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input->pInputPortPrivate = (void *)&drv_ctx.ptr_inputbuffer [i];
658011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (drv_ctx.disable_dmx) {
658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_desc_buffer(i);
658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Input Buffer Index not found");
658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateOutputBuffer
659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Helper fn for AllocateBuffer in the output pin
659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went well.
660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_output_buffer(
660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE            hComp,
660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   port,
661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                   appData,
661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                   bytes)
661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)hComp;
661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)port;
661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE       *bufHdr= NULL; // buffer header
661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned                         i= 0; // Temporary counter
661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_setbuffer_cmd setbuffers;
661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_device_fd =-1;
662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_allocation_data ion_alloc_data;
662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_fd_data fd_ion_data;
662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate o/p buffer Header: Cnt(%d) Sz(%u)",
662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount,
662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)drv_ctx.op_buf.buffer_size);
662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nBufHdrSize        = 0;
663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformEntrySize = 0;
663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformListSize  = 0;
663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPMEMInfoSize = 0;
663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pmem_fd = -1;
663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned char *pmem_baseaddress = NULL;
663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Allocating First Output Buffer(%d)",
664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufHdrSize        = drv_ctx.op_buf.actualcount *
664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_BUFFERHEADERTYPE);
664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformListSize  = drv_ctx.op_buf.actualcount *
664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,
665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPlatformListSize);
665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("PE %d OutputBuffer Count %d",nPlatformEntrySize,
665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Allocate output buffers as cached to improve performance of software-reading
666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // of the YUVs. Output buffers are cache-invalidated in driver.
666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // If color-conversion is involved, Only the C2D output buffers are cached, no
666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // need to cache the decoder's output buffers
666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int cache_flag = client_buffers.is_color_conversion_enabled() ? 0 : ION_FLAG_CACHED;
666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_device_fd = alloc_map_ion_memory(
666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.buffer_size * drv_ctx.op_buf.actualcount,
666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                secure_scaling_to_non_secure_opb ? SZ_4K : drv_ctx.op_buf.alignment,
666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &ion_alloc_data, &fd_ion_data,
666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (secure_mode && !secure_scaling_to_non_secure_opb) ?
666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SECURE_FLAGS_OUTPUT_BUFFER : cache_flag);
667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ion_device_fd < 0) {
667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = fd_ion_data.fd;
667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd = open (MEM_DEVICE,O_RDWR);
667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pmem_fd < 0) {
667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:pmem fd for output buffer %d",
667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.op_buf.buffer_size);
668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!align_pmem_buffers(pmem_fd, drv_ctx.op_buf.buffer_size *
668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.op_buf.actualcount,
668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.op_buf.alignment)) {
668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("align_pmem_buffers() failed");
668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(pmem_fd);
668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode) {
669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_baseaddress = (unsigned char *)mmap(NULL,
669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (drv_ctx.op_buf.buffer_size *
669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     drv_ctx.op_buf.actualcount),
669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd,0);
669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pmem_baseaddress == MAP_FAILED) {
669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("MMAP failed for Size %u",
669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)drv_ctx.op_buf.buffer_size);
669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                close(pmem_fd);
670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_ion_memory(&drv_ctx.op_buf_ion_info[i]);
670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Alloc mem for platform specific info
670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        char *pPtr=NULL;
670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,1);
671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *)\
671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       calloc (sizeof(struct vdec_bufferpayload),
671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               drv_ctx.op_buf.actualcount);
671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     calloc (sizeof (struct vdec_output_frameinfo),
671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             drv_ctx.op_buf.actualcount);
671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer ");
671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
672011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
672111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
672211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
672311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = (struct vdec_ion *)\
672411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc (sizeof(struct vdec_ion),
672511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              drv_ctx.op_buf.actualcount);
672611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.op_buf_ion_info) {
672711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
672811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
672911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
673011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
673111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
673211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
673311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && drv_ctx.ptr_respbuffer) {
673411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[0].mmaped_size =
673511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (drv_ctx.op_buf.buffer_size *
673611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 drv_ctx.op_buf.actualcount);
673711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufHdr          =  m_out_mem_ptr;
673811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
673911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
674011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_list)  + nPlatformListSize);
674111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
674211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_entry) + nPlatformEntrySize);
674311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformList   = m_platform_list;
674411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformEntry  = m_platform_entry;
674511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPMEMInfo       = m_pmem_info;
674611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
674711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
674811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
674911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Settting the entire storage nicely
675011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr, m_out_mem_ptr,pPlatformEntry);
675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Set the values when we determine the right HxW param
675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nAllocLen          = bytes;
675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nFilledLen         = 0;
675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pAppPrivate        = appData;
675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Platform specific PMEM Information
676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform Entry
676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //DEBUG_PRINT_LOW("Initializing the Platform Entry for %d",i);
676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->entry      = pPMEMInfo;
676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform List
676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->nEntries    = 1;
676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->entryList   = pPlatformEntry;
676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Keep pBuffer NULL till vdec is opened
676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pBuffer            = NULL;
677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOffset            = 0;
677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->offset          =  drv_ctx.op_buf.buffer_size*i;
677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->pmem_fd = -1;
677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pPlatformPrivate = pPlatformList;
677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = pmem_fd;
677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].pmem_fd = pmem_fd;
677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd = ion_device_fd;
678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_alloc_data = ion_alloc_data;
678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].fd_ion_data = fd_ion_data;
678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Create a mapping between buffers*/
678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer[i].client_data = (void *)\
678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    &drv_ctx.ptr_outputbuffer[i];
678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].offset = drv_ctx.op_buf.buffer_size*i;
678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr =
679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_baseaddress + (drv_ctx.op_buf.buffer_size*i);
679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].size = drv_ctx.ptr_outputbuffer[i].buffer_len;
679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].mapped_size = drv_ctx.ptr_outputbuffer[i].mmaped_size;
679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pmem_info[i].buffer = drv_ctx.ptr_outputbuffer[i].bufferaddr;
679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("pmem_fd = %d offset = %u address = %p",
679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pmem_fd, (unsigned int)drv_ctx.ptr_outputbuffer[i].offset,
679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_outputbuffer[i].bufferaddr);
679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Move the buffer and buffer header pointers
679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr++;
680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo++;
680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry++;
680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList++;
680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr, pPtr);
680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_out_mem_ptr) {
680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_out_mem_ptr);
680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr = NULL;
681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pPtr) {
681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(pPtr);
681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPtr = NULL;
681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_outputbuffer) {
681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_outputbuffer);
681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer = NULL;
681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_respbuffer) {
682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_respbuffer);
682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer = NULL;
682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.op_buf_ion_info) {
682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free o/p ion context");
682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.op_buf_ion_info);
682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info = NULL;
682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet =  OMX_ErrorInsufficientResources;
683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet == OMX_ErrorNone)
683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_extradata();
683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i=0; i< drv_ctx.op_buf.actualcount; i++) {
683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_ABSENT(&m_out_bm_count,i)) {
683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i);
683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i < drv_ctx.op_buf.actualcount) {
684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_buffer buf;
684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct v4l2_plane plane[VIDEO_MAX_PLANES];
684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int rc;
684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info[i].offset = drv_ctx.ptr_outputbuffer[i].offset;
684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].buffer_len =
685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.buffer_size;
685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *bufferHdr = (m_out_mem_ptr + i );
685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (secure_mode) {
685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr =
685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_U8 *)(intptr_t)drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].bufferaddr = *bufferHdr;
686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[i].mmaped_size = drv_ctx.op_buf.buffer_size;
686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.index = i;
686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.memory = V4L2_MEMORY_USERPTR;
686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].length = drv_ctx.op_buf.buffer_size;
686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].m.userptr = (unsigned long)drv_ctx.ptr_outputbuffer[i].bufferaddr -
686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned long)drv_ctx.ptr_outputbuffer[i].offset;
687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].reserved[0] = drv_ctx.op_buf_ion_info[i].fd_ion_data.fd;
687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[i].offset;
687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].data_offset = 0;
687511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
687611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
687711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
687811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + i * drv_ctx.extradata_info.buffer_size);
687911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
688011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
688111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
688211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].reserved[1] = i * drv_ctx.extradata_info.buffer_size;
688311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[extra_idx].data_offset = 0;
688411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (extra_idx >= VIDEO_MAX_PLANES) {
688511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Extradata index higher than allowed: %d", extra_idx);
688611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
688711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
688811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.m.planes = plane;
688911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.length = drv_ctx.num_planes;
689011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set the Output Buffer Idx: %d Addr: %p", i, drv_ctx.ptr_outputbuffer[i].bufferaddr);
689111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_PREPARE_BUF, &buf);
689211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc) {
689311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*TODO: How to handle this case */
689411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorInsufficientResources;
689511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
689611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
689711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (i == (drv_ctx.op_buf.actualcount -1 ) && !streaming[CAPTURE_PORT]) {
689811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                enum v4l2_buf_type buf_type;
689911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
690011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
690111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc) {
690211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorInsufficientResources;
690311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
690411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    streaming[CAPTURE_PORT] = true;
690511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("STREAMON Successful");
690611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
690711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
690811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Enabling Turbo mode");
690911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                request_perf_level(VIDC_TURBO);
691011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
691111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
691211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pBuffer = (OMX_U8*)drv_ctx.ptr_outputbuffer[i].bufferaddr;
691311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*bufferHdr)->pAppPrivate = appData;
691411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_SET(&m_out_bm_count,i);
691511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
691611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("All the Output Buffers have been Allocated ; Returning Insufficient");
691711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
691811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
691911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
692011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
692111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
692211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
692311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
692411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
692511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer  -- API Call
692611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
692711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
692811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateBuffer
692911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
693011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
693111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Returns zero if all the buffers released..
693211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
693311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
693411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
693511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
693611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
693711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
693811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
693911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
694011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_buffer(OMX_IN OMX_HANDLETYPE                hComp,
694111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
694211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
694311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                     appData,
694411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                       bytes)
694511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
694611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i = 0;
694711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
694811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
694911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Allocate buffer on port %d", (int)port);
695011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid) {
695111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Allocate Buf in Invalid State");
695211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
695311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
695411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
695511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
6956fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // If this is not the first allocation (i.e m_inp_mem_ptr is allocated),
6957fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ensure that use-buffer was never called.
6958fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // Mix-and-match of useBuffer and allocateBuffer is not allowed
6959fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (m_inp_mem_ptr && input_use_buffer) {
6960fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("'Allocate' Input buffer called after 'Use' Input buffer !");
6961fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUndefined;
6962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (arbitrary_bytes) {
696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_input_heap_buffer (hComp,bufferHdr,port,appData,bytes);
696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = client_buffers.allocate_buffers_color_convert(hComp,bufferHdr,port,
697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                appData,bytes);
697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Invalid Port Index received %d",(int)port);
697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done");
697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone) {
697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocate_done()) {
697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Send the callback now
698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING);
698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandStateSet,OMX_StateIdle,
698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated) {
698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) {
698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,
698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_CORE_INPUT_PORT_INDEX,
699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated) {
699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) {
699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                post_event(OMX_CommandPortEnable,
699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_CORE_OUTPUT_PORT_INDEX,
699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EVENT);
699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
700111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
700211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet);
700311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
700411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
700511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
700611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call
700711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::FreeBuffer
701011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
701111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
701211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
701311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
701411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
701511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
701611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
701711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
701811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
701911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
702011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::free_buffer(OMX_IN OMX_HANDLETYPE         hComp,
702111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                 port,
702211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
702311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
702411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
702511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int nPortIndex;
702611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
702711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("In for decoder free_buffer");
702811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
702911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateIdle &&
703011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
703111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW(" free buffer while Component in Loading pending");
703211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((m_inp_bEnabled == OMX_FALSE && port == OMX_CORE_INPUT_PORT_INDEX)||
703311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_out_bEnabled == OMX_FALSE && port == OMX_CORE_OUTPUT_PORT_INDEX)) {
703411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port);
703511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((port == OMX_CORE_INPUT_PORT_INDEX &&
703611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING)) ||
703711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (port == OMX_CORE_OUTPUT_PORT_INDEX &&
703811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             BITMASK_PRESENT(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING))) {
703911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Buffer while port %u enable pending", (unsigned int)port);
704011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) {
704111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid state to free buffer,ports need to be disabled");
704211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(OMX_EventError,
704311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorPortUnpopulated,
704411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EVENT);
704511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
704611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
704711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_state != OMX_StateInvalid) {
704811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid state to free buffer,port lost Buffers");
704911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event(OMX_EventError,
705011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ErrorPortUnpopulated,
705111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EVENT);
705211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
705311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
705411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
705511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if arbitrary bytes*/
705611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!arbitrary_bytes && !input_use_buffer)
705711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex = buffer - m_inp_mem_ptr;
705811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
705911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex = buffer - m_inp_heap_ptr;
706011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
706111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %d", nPortIndex);
706211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.ip_buf.actualcount &&
706311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) {
706411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Clear the bit associated with it.
706511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_inp_bm_count,nPortIndex);
706611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_heap_inp_bm_count,nPortIndex);
706711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (input_use_buffer == true) {
706811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
706911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free pmem Buffer index %d",nPortIndex);
707011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_phdr_pmem_ptr)
707111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer(m_phdr_pmem_ptr[nPortIndex]);
707211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
707311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (arbitrary_bytes) {
707411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_phdr_pmem_ptr)
707511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_input_buffer(nPortIndex,m_phdr_pmem_ptr[nPortIndex]);
707611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    else
707711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        free_input_buffer(nPortIndex,NULL);
707811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else
707911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer(buffer);
708011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
708111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_bPopulated = OMX_FALSE;
708211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(release_input_done())
708311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                release_buffers(this, VDEC_BUFFER_TYPE_INPUT);
708411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*Free the Buffer Header*/
708511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_input_done()) {
708611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("ALL input buffers are freed/released");
708711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_input_buffer_header();
708811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
708911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
709011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error: free_buffer ,Port Index Invalid");
709111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadPortIndex;
709211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
709311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
709411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
709511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && release_input_done()) {
709611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
709711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
709811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortDisable,
709911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_INPUT_PORT_INDEX,
710011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
710111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
710211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
710311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // check if the buffer is valid
710411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPortIndex = buffer - client_buffers.get_il_buf_hdr();
710511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.op_buf.actualcount &&
710611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) {
710711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %d", nPortIndex);
710811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Clear the bit associated with it.
710911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR(&m_out_bm_count,nPortIndex);
711011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bPopulated = OMX_FALSE;
711111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_buffers.free_output_buffer (buffer);
711211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
711311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(release_output_done()) {
711411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                release_buffers(this, VDEC_BUFFER_TYPE_OUTPUT);
711511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
711611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_output_done()) {
711711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free_output_buffer_header();
711811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
711911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
712011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error: free_buffer , Port Index Invalid");
712111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadPortIndex;
712211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
712311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
712411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && release_output_done()) {
712511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it");
712611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
712711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("MOVING TO DISABLED STATE");
712811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
712911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
713011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_enable_android_native_buffers) {
713111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("FreeBuffer - outport disabled: reset native buffers");
713211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memset(&native_buffer, 0 ,(sizeof(struct nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
713311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
713411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
713511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
713611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandPortDisable,
713711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_CORE_OUTPUT_PORT_INDEX,
713811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
713911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
714011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
714111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
714211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
714311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((eRet == OMX_ErrorNone) &&
714411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) {
714511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_done()) {
714611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Send the callback now
714711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
714811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_CommandStateSet, OMX_StateLoaded,
714911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT);
715011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
715111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
715211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
715311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
715411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
715511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
715611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
715711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
715811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::EmptyThisBuffer
715911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
716011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
716111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   This routine is used to push the encoded video frames to
716211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   the video decoder.
716311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
716411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
716511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
716611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
716711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
716811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went successful.
716911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
717011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
717111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::empty_this_buffer(OMX_IN OMX_HANDLETYPE         hComp,
717211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
717311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
717411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret1 = OMX_ErrorNone;
717511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int nBufferIndex = drv_ctx.ip_buf.actualcount;
717611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
717711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateExecuting &&
717811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StatePause &&
717911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StateIdle) {
718011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Empty this buffer in Invalid State");
718111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
718211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
718311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
718411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
718511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB Buffer is NULL");
718611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
718711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
718811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
718911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_inp_bEnabled) {
719011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB incorrect state operation, input port is disabled.");
719111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
719211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
719311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
719411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX) {
719511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB invalid port in header %u", (unsigned int)buffer->nInputPortIndex);
719611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
719711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
719811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
719911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (perf_flag) {
720011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!latency) {
720111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dec_time.stop();
720211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            latency = dec_time.processing_time_us();
720311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dec_time.start();
720411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
720511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
720611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
720711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
720811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufferIndex = buffer - m_inp_heap_ptr;
720911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
721011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (input_use_buffer == true) {
721111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBufferIndex = buffer - m_inp_heap_ptr;
7212fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
7213fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("ERROR: ETB nBufferIndex is invalid in use-buffer mode");
7214fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorBadParameter;
7215fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
721611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nFilledLen = m_inp_heap_ptr[nBufferIndex].nFilledLen;
721711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nTimeStamp = m_inp_heap_ptr[nBufferIndex].nTimeStamp;
721811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_mem_ptr[nBufferIndex].nFlags = m_inp_heap_ptr[nBufferIndex].nFlags;
721911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = &m_inp_mem_ptr[nBufferIndex];
722011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Non-Arbitrary mode - buffer address is: malloc %p, pmem%p in Index %d, buffer %p of size %u",
722111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &m_inp_heap_ptr[nBufferIndex], &m_inp_mem_ptr[nBufferIndex],nBufferIndex, buffer, (unsigned int)buffer->nFilledLen);
722211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
722311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBufferIndex = buffer - m_inp_mem_ptr;
722411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
722511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
722611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7227fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (nBufferIndex >= drv_ctx.ip_buf.actualcount ) {
722811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:ETB nBufferIndex is invalid");
722911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
723011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
723111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
723211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
723311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = true;
723411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: codec_config buffer", __FUNCTION__);
723511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
723611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
723711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* The client should not set this when codec is in arbitrary bytes mode */
723811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_input_pass_buffer_fd) {
723911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->pBuffer = (OMX_U8*)drv_ctx.ptr_inputbuffer[nBufferIndex].bufferaddr;
724011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
724111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
724211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%u)",
724311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nTimeStamp, (unsigned int)buffer->nFilledLen);
724411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
724511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)hComp,(unsigned long)buffer,
724611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_ETB_ARBITRARY);
724711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
724811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)hComp,(unsigned long)buffer,OMX_COMPONENT_GENERATE_ETB);
724911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
725011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    time_stamp_dts.insert_timestamp(buffer);
725111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
725211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
725311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
725411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
725511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
725611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::empty_this_buffer_proxy
725711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
725811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
725911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   This routine is used to push the encoded video frames to
726011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   the video decoder.
726111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything went successful.
726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE  hComp,
727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7272b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("ETB");
727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int push_cnt = 0,i=0;
727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_input_frameinfo frameinfo;
727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload *temp_buffer;
727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_seqheader seq_header;
728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool port_setting_changed = true;
728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Should we generate a Aync error event*/
728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL || buffer->pInputPortPrivate == NULL) {
728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy is invalid");
728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7290fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (nPortIndex >= drv_ctx.ip_buf.actualcount) {
729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:empty_this_buffer_proxy invalid nPortIndex[%u]",
729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPortIndex);
729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers++;
7297b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return zero length and not an EOS buffer */
730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes && (buffer->nFilledLen == 0) &&
730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0)) {
730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("return zero legth buffer");
730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EBD);
730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (input_flush_progress == true) {
730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Flush in progress return buffer ");
731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)buffer,VDEC_S_SUCCESS,
731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMPONENT_GENERATE_EBD);
731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    auto_lock l(buf_lock);
731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer = (struct vdec_bufferpayload *)buffer->pInputPortPrivate;
731711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!temp_buffer || (temp_buffer -  drv_ctx.ptr_inputbuffer) > (int)drv_ctx.ip_buf.actualcount) {
731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* If its first frame, H264 codec and reject is true, then parse the nal
732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       and get the profile. Based on this, reject the clip playback */
732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (first_frame == 0 && codec_type_parse == CODEC_TYPE_H264 &&
732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_reject_avc_1080p_mp) {
732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        first_frame = 1;
732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Parse nal to get the profile");
732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_parser->parse_nal((OMX_U8*)buffer->pBuffer, buffer->nFilledLen,
732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                NALU_TYPE_SPS);
732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_profile = h264_parser->get_profile();
733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = is_video_session_supported();
733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer,VDEC_S_SUCCESS,OMX_COMPONENT_GENERATE_EBD);
733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event(OMX_EventError, OMX_ErrorInvalidState,OMX_COMPONENT_GENERATE_EVENT);
733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Move the state to Invalid to avoid queueing of pending ETB to the driver */
733511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state = OMX_StateInvalid;
733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorNone;
733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7340b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-TS", buffer->nTimeStamp / 1000);
7341b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-size", buffer->nFilledLen);
734211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxy: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*for use buffer we need to memcpy the data*/
734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer->buffer_len = buffer->nFilledLen;
734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73467b99376ecf7a6746e3bcb146975c00fc9ea560abPraveen Chavan    if (input_use_buffer && temp_buffer->bufferaddr && !secure_mode) {
734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen <= temp_buffer->buffer_len) {
734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes) {
734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy (temp_buffer->bufferaddr, (buffer->pBuffer + buffer->nOffset),buffer->nFilledLen);
735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy (temp_buffer->bufferaddr, (m_inp_heap_ptr[nPortIndex].pBuffer + m_inp_heap_ptr[nPortIndex].nOffset),
735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        buffer->nFilledLen);
735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.bufferaddr = temp_buffer->bufferaddr;
736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.client_data = (void *) buffer;
736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.datalen = temp_buffer->buffer_len;
736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.flags = 0;
736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.offset = buffer->nOffset;
736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.pmem_fd = temp_buffer->pmem_fd;
736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.pmem_offset = temp_buffer->offset;
736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frameinfo.timestamp = buffer->nTimeStamp;
736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.disable_dmx && m_desc_buffer_ptr && m_desc_buffer_ptr[nPortIndex].buf_addr) {
736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ETB: dmx enabled");
737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_demux_entries == 0) {
737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extract_demux_addr_offsets(buffer);
737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ETB: handle_demux_data - entries=%u",(unsigned int)m_demux_entries);
737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        handle_demux_data(buffer);
737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_addr = (OMX_U8 *)m_desc_buffer_ptr[nPortIndex].buf_addr;
737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_size = m_desc_buffer_ptr[nPortIndex].desc_data_size;
737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_addr = NULL;
738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.desc_size = 0;
738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!arbitrary_bytes) {
738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= buffer->nFlags;
738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
738511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
738611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (arbitrary_bytes) {
738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_timestamp_list.insert_ts(buffer->nTimeStamp);
739111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (!arbitrary_bytes && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Inserting TIMESTAMP (%lld) into queue", buffer->nTimeStamp);
739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_timestamp_list.insert_ts(buffer->nTimeStamp);
739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len);
739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Rxd i/p EOS, Notify Driver that EOS has been reached");
740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frameinfo.flags |= VDEC_BUFFERFLAG_EOS;
740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.nFilledLen = 0;
740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nal_count = 0;
741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_count = 0;
741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.mutils)
741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_frame_parser.mutils->initialize_frame_checking_environment();
741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.flush();
741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_ts = LLONG_MAX;
741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_last_au_flags = 0;
741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_entries = 0;
741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane;
742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&buf, 0, sizeof(buf));
742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&plane, 0, sizeof(plane));
742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long  print_count;
742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_buffer->buffer_len == 0 || (buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags = V4L2_QCOM_BUF_FLAG_EOS;
742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("INPUT EOS reached") ;
742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = nPortIndex;
743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.bytesused = temp_buffer->buffer_len;
743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.length = drv_ctx.ip_buf.buffer_size;
743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.m.userptr = (unsigned long)temp_buffer->bufferaddr -
743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)temp_buffer->offset;
743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.reserved[0] = temp_buffer->pmem_fd;
743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.reserved[1] = temp_buffer->offset;
744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane.data_offset = 0;
744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = &plane;
744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = 1;
744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frameinfo.timestamp >= LLONG_MAX) {
744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags |= V4L2_QCOM_BUF_TIMESTAMP_INVALID;
744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //assumption is that timestamp is in milliseconds
744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.timestamp.tv_sec = frameinfo.timestamp / 1000000;
744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.timestamp.tv_usec = (frameinfo.timestamp % 1000000);
744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ? V4L2_QCOM_BUF_FLAG_CODECCONFIG: 0;
745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags |= (buffer->nFlags & OMX_BUFFERFLAG_DECODEONLY) ? V4L2_QCOM_BUF_FLAG_DECODEONLY: 0;
745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Increment codec_config buffer counter");
745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        android_atomic_inc(&m_queued_codec_config_count);
745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver, send ETB back to client");
746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone(hComp, m_app_data, buffer);
746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorHardware;
746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = false;
746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[OUTPUT_PORT]) {
746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_buf_type buf_type;
746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret,r;
747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMON,&buf_type);
747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!ret) {
747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Streamon on OUTPUT Plane was successful");
747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            streaming[OUTPUT_PORT] = true;
747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (errno == EBUSY) {
747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call stream on OUTPUT due to HW_OVERLOAD");
747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call streamon on OUTPUT");
748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("If Stream on failed no buffer should be queued");
748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event ((unsigned long)buffer, VDEC_S_SUCCESS,
748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[ETBP] pBuf(%p) nTS(%lld) Sz(%u)",
749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frameinfo.bufferaddr, (long long)frameinfo.timestamp,
749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)frameinfo.datalen);
749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::FillThisBuffer
750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL client uses this method to release the frame buffer
750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   after displaying them.
750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE  hComp,
751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* buffer)
751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateExecuting &&
751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StatePause &&
751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_state != OMX_StateIdle) {
751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTB in Invalid State");
751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInvalidState;
752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_bEnabled) {
752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:FTB incorrect state operation, output port is disabled.");
752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        private_handle_t *handle = NULL;
753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct VideoDecoderOutputMetaData *meta;
753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int nPortIndex = 0;
753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!buffer || !buffer->pBuffer) {
753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("%s: invalid params: %p", __FUNCTION__, buffer);
753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //get the buffer type and fd info
753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        meta = (struct VideoDecoderOutputMetaData *)buffer->pBuffer;
754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        handle = (private_handle_t *)meta->pHandle;
754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FTB: metabuf: %p buftype: %d bufhndl: %p ", meta, meta->eType, meta->pHandle);
754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!handle) {
754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("FTB: Error: IL client passed an invalid buf handle - %p", handle);
754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Fill outputbuffer with buffer details, this will be sent to f/w during VIDIOC_QBUF
754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nPortIndex < drv_ctx.op_buf.actualcount &&
755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd = handle->fd;
755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = (OMX_U8*) buffer;
755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           //Store private handle from GraphicBuffer
755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[nPortIndex].privatehandle = handle;
755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[nPortIndex].nativehandle = handle;
755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("[FTB]Invalid native_buffer index: %d", nPortIndex);
755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //buffer->nAllocLen will be sizeof(struct VideoDecoderOutputMetaData). Overwrite
756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //this with a more sane size so that we don't compensate in rest of code
756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //We'll restore this size later on, so that it's transparent to client
756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nAllocLen = handle->size;
756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (handle->flags & private_handle_t::PRIV_FLAGS_DISP_CONSUMER) {
756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_is_display_session = true;
757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_is_display_session = false;
757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s: m_is_display_session = %d", __func__, m_is_display_session);
757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf.buffer_size = handle->size;
757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer - client_buffers.get_il_buf_hdr();
757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL ||
758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (nPortIndex >= drv_ctx.op_buf.actualcount)) {
758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
758211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex, drv_ctx.op_buf.actualcount);
758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX) {
758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:FTB invalid port in header %u", (unsigned int)buffer->nOutputPortIndex);
758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadPortIndex;
758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("[FTB] bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    post_event((unsigned long) hComp, (unsigned long)buffer, m_fill_output_msg);
759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::fill_this_buffer_proxy
759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   IL client uses this method to release the frame buffer
760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   after displaying them.
760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::fill_this_buffer_proxy(
761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_HANDLETYPE        hComp,
761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd)
761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7614b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("FTB");
761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE nRet = OMX_ErrorNone;
761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *buffer = bufferAdd;
761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned nPortIndex = 0;
761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_fillbuffer_cmd fillbuffer;
761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload     *ptr_outputbuffer = NULL;
762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo  *ptr_respbuffer = NULL;
762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount) {
762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u",
762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPortIndex, drv_ctx.op_buf.actualcount);
762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufferAdd, bufferAdd->pBuffer);
763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Return back the output buffer to client*/
763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_bEnabled != OMX_TRUE || output_flush_progress == true || in_reconfig) {
763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Output Buffers return flush/disable condition");
763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone (hComp,m_app_data,buffer);
763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (dynamic_buf_mode) {
764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].offset = 0;
764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len = buffer->nAllocLen;
764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_ref_add(nPortIndex);
764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer[nPortIndex].mmaped_size = buffer->nAllocLen;
764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers++;
7648b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer = client_buffers.get_dr_buf_hdr(bufferAdd);
765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buffer) {
765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("err: client_buffer ptr invalid");
765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return OMX_ErrorBadParameter;
765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ptr_respbuffer = (struct vdec_output_frameinfo*)buffer->pOutputPortPrivate;
765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ptr_respbuffer) {
765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_outputbuffer =  (struct vdec_bufferpayload*)ptr_respbuffer->client_data;
765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
765911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ptr_respbuffer == NULL || ptr_outputbuffer == NULL) {
766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("resp buffer or outputbuffer is NULL");
766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone (hComp,m_app_data,buffer);
766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pending_output_buffers--;
7664b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
766911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
767111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)&buf, 0, sizeof(buf));
767211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset( (void *)plane, 0, (sizeof(struct v4l2_plane)*VIDEO_MAX_PLANES));
767311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int extra_idx = 0;
767411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
767511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = nPortIndex;
767611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].bytesused = buffer->nFilledLen;
767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].length = buffer->nAllocLen;
768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].m.userptr =
768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr -
768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned long)drv_ctx.ptr_outputbuffer[nPortIndex].offset;
768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[0] = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[1] = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].data_offset = 0;
768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].bytesused = 0;
768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].length = drv_ctx.extradata_info.buffer_size;
769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].m.userptr = (long unsigned int) (drv_ctx.extradata_info.uaddr + nPortIndex * drv_ctx.extradata_info.buffer_size);
769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[0] = drv_ctx.extradata_info.ion.fd_ion_data.fd;
769311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[1] = nPortIndex * drv_ctx.extradata_info.buffer_size;
769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].data_offset = 0;
769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra_idx >= VIDEO_MAX_PLANES) {
769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = plane;
770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = drv_ctx.num_planes;
770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SENDING FTB TO F/W - fd[0] = %d fd[1] = %d offset[1] = %d in_flush = %d",
770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], output_flush_progress);
770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_QBUF, &buf);
770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
770911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf to driver, send FTB back to client");
771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.FillBufferDone(hComp, m_app_data, buffer);
771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelreturn OMX_ErrorNone;
771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::SetCallbacks
771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Set the callbacks.
772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::set_callbacks(OMX_IN OMX_HANDLETYPE        hComp,
773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_CALLBACKTYPE* callbacks,
773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR             appData)
773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cb       = *callbacks;
773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_cb.EmptyBufferDone,\
773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EventHandler,m_cb.FillBufferDone);
773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_app_data =    appData;
773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNotImplemented;
773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentDeInit
774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Destroys the component and release memory allocated to the heap.
774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything successful.
775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
775611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
775711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void) hComp;
775811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i = 0;
776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_StateLoaded != m_state) {
776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state);
776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Playback Ended - FAILED");
776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Playback Ended - PASSED");
776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if the output buffers have to be cleaned up*/
776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Output Memory");
777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.op_buf.actualcount; i++ ) {
777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_out_bm_count, i)) {
777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR(&m_out_bm_count, i);
777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                client_buffers.free_output_buffer (&m_out_mem_ptr[i]);
777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_output_done()) {
777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&native_buffer, 0, (sizeof(nativebuffer) * MAX_NUM_INPUT_OUTPUT_BUFFERS));
778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Check if the input buffers have to be cleaned up*/
778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr || m_inp_heap_ptr) {
778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Input Memory");
778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i<drv_ctx.ip_buf.actualcount; i++ ) {
779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                BITMASK_CLEAR(&m_inp_bm_count, i);
779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_inp_mem_ptr)
779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer (i,&m_inp_mem_ptr[i]);
779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    free_input_buffer (i,NULL);
779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (release_input_done()) {
780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    free_input_buffer_header();
780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    free_output_buffer_header();
780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer) {
780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(h264_scratch.pBuffer);
780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_scratch.pBuffer = NULL;
780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_parser) {
781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete h264_parser;
781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_parser = NULL;
781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
781611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_frame_parser.mutils) {
781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free utils parser");
781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete (m_frame_parser.mutils);
781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_frame_parser.mutils = NULL;
782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
782211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_platform_list) {
782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_platform_list);
782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_platform_list = NULL;
782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_vendor_config.pData) {
782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_vendor_config.pData);
782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_vendor_config.pData = NULL;
782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Reset counters in mesg queues
783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_size=0;
783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_size=0;
783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_size=0;
783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_read = m_ftb_q.m_write =0;
783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_read = m_cmd_q.m_write =0;
783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_read = m_etb_q.m_write =0;
783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_timestamp) {
784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_timestamp_list.reset_ts_list();
784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // NULL);
784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Close the driver instance");
784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile) {
785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.infile);
785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = NULL;
785211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.outfile) {
785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.outfile);
785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = NULL;
785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_ymeta_file) {
785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.out_ymeta_file);
785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_ymeta_file = NULL;
786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_uvmeta_file) {
786211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.out_uvmeta_file);
786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.out_uvmeta_file = NULL;
786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (outputExtradataFile)
786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose (outputExtradataFile);
786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_INFO("omx_vdec::component_deinit() complete");
787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::UseEGLImage
787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Use EGL Image method implementation <TBD>.
787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Not Implemented error.
788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
788611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::use_EGL_image(OMX_IN OMX_HANDLETYPE     hComp,
788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32                        port,
789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_PTR                     appData,
789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN void*                      eglImage)
789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) appData;
789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_LIST pmem_list;
789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_ENTRY pmem_entry;
789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO pmem_info;
789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    PFNEGLQUERYIMAGEQUALCOMMPROC egl_queryfunc;
790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EGLint fd = -1, offset = 0,pmemPtr = 0;
790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
790211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fd = -1, offset = 0;
790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("use EGL image support for decoder");
790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bufferHdr || !eglImage|| port != OMX_CORE_OUTPUT_PORT_INDEX) {
790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid EGL image");
790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_EGL_IMAGE_GPU
790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_display_id == NULL) {
791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Display ID is not set by IL client");
791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc = (PFNEGLQUERYIMAGEQUALCOMMPROC)
791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eglGetProcAddress("eglQueryImageKHR");
791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_HANDLE, &fd);
791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BUFFER_OFFSET, &offset);
791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    egl_queryfunc(m_display_id, eglImage, EGL_BITMAP_POINTER_KHR, &pmemPtr);
791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //with OMX test app
791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct temp_egl {
792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pmem_fd;
792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int offset;
792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct temp_egl *temp_egl_id = NULL;
792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void * pmemPtr = (void *) eglImage;
792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_egl_id = (struct temp_egl *)eglImage;
792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (temp_egl_id != NULL) {
792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = temp_egl_id->pmem_fd;
792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        offset = temp_egl_id->offset;
792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Improper pmem fd by EGL client %d",fd);
793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_info.pmem_fd = (OMX_U32) fd;
793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_info.offset = (OMX_U32) offset;
793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_entry.entry = (void *) &pmem_info;
793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_entry.type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_list.entryList = &pmem_entry;
794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_list.nEntries = 1;
794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers = true;
794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_ErrorNone != use_buffer(hComp,bufferHdr, port,
794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (void *)&pmem_list, drv_ctx.op_buf.buffer_size,
794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_U8 *)pmemPtr)) {
794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("use buffer call failed for egl image");
794611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
794811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
795011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
795111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ComponentRoleEnum
795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Component Role Enum method implementation.
795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   <TBD>.
796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX Error None if everything is successful.
796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OUT OMX_U8*        role,
796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_IN OMX_U32        index)
796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) hComp;
796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE)) {
798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mpeg2",OMX_MAX_STRINGNAME_SIZE);
798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE);
798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) ||
799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE))) {
799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.divx",OMX_MAX_STRINGNAME_SIZE);
800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE);
800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.mvc", OMX_MAX_STRINGNAME_SIZE)) {
801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.mvc", OMX_MAX_STRINGNAME_SIZE);
801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.hevc", OMX_MAX_STRINGNAME_SIZE)) {
802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
802311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.hevc", OMX_MAX_STRINGNAME_SIZE);
802411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s", role);
802511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
802611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
802711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
802811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
802911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ( (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) ||
803011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.wmv",OMX_MAX_STRINGNAME_SIZE))
803111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ) {
803211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
803311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vc1",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    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
804011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
804111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vp8",OMX_MAX_STRINGNAME_SIZE);
804211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
804311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
804411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
804511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
804611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
804711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",OMX_MAX_STRINGNAME_SIZE)) {
804811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((0 == index) && role) {
804911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            strlcpy((char *)role, "video_decoder.vp9",OMX_MAX_STRINGNAME_SIZE);
805011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("component_role_enum: role %s",role);
805111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
805211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("No more roles");
805311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorNoMore;
805411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
805511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
805611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Querying Role on Unknown Component");
805711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
805811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
805911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
806011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
806111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
806211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
806311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
806411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
806511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
806611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
806711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateDone
806811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
806911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
807011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if entire buffer pool is allocated by IL Client or not.
807111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Need this to move to IDLE state.
807211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
807311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
807411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
807511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
807611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
807711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
807811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
807911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
808011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_done(void)
808111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
808211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
808311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet_In = false;
808411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet_Out = false;
808511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
808611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet_In = allocate_input_done();
808711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bRet_Out = allocate_output_done();
808811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
808911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bRet_In && bRet_Out) {
809011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
809111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
809211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
809311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
809411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
809511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
809611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
809711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateInputDone
809811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
809911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
810011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if I/P buffer pool is allocated by IL Client or not.
810111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
810211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
810311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
810411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
810511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
810611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
810711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
810811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
810911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_input_done(void)
811011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
811111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
811211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0;
811311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr == NULL) {
811511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bRet;
811611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
811711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr ) {
811811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; i<drv_ctx.ip_buf.actualcount; i++) {
811911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_inp_bm_count,i)) {
812011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
812111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
812211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
812311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
812411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i == drv_ctx.ip_buf.actualcount) {
812511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
812611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate done for all i/p buffers");
812711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
812811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i==drv_ctx.ip_buf.actualcount && m_inp_bEnabled) {
812911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_bPopulated = OMX_TRUE;
813011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
813111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
813211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
813311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
813411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
813511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::AllocateOutputDone
813611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
813711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
813811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if entire O/P buffer pool is allocated by IL Client or not.
813911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
814011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
814111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
814211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
814311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
814411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false.
814511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
814611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
814711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_output_done(void)
814811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
814911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
815011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned j=0;
815111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
815211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr == NULL) {
815311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bRet;
815411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
815511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
815611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
815711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j < drv_ctx.op_buf.actualcount; j++) {
815811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_ABSENT(&m_out_bm_count,j)) {
815911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
816011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
816111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
816211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
816311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
816411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (j == drv_ctx.op_buf.actualcount) {
816511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
816611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Allocate done for all o/p buffers");
816711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_bEnabled)
816811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bPopulated = OMX_TRUE;
816911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
817011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
817111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
817211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
817311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
817411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
817511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
817611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseDone
817711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
817811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
817911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
818011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
818111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
818211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
818311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
818411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
818511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
818611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
818711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
818811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_done(void)
818911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
819011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
819111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
819211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (release_input_done()) {
819311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (release_output_done()) {
819411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
819511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
819611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
819711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
819811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
819911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
820211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
820311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseOutputDone
820411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
820611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
820711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
820811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
820911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
821011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
821111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
821211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
821311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
821411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
821511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_output_done(void)
821611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
821711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
821811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0,j=0;
821911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
822011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of m_out_mem_ptr %p", m_out_mem_ptr);
822111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
822211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j < drv_ctx.op_buf.actualcount ; j++) {
822311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (BITMASK_PRESENT(&m_out_bm_count,j)) {
822411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
822511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
822611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
822711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (j == drv_ctx.op_buf.actualcount) {
822811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_bm_count = 0;
822911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
823011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
823111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
823211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_bm_count = 0;
823311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
823411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
823511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
823611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
823711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ======================================================================
823811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   FUNCTION
823911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   omx_vdec::ReleaseInputDone
824011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
824111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   DESCRIPTION
824211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Checks if IL client has released all the buffers.
824311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
824411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PARAMETERS
824511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   None.
824611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
824711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN VALUE
824811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   true/false
824911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
825011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ========================================================================== */
825111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::release_input_done(void)
825211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
825311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bRet = false;
825411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i=0,j=0;
825511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
825611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Value of m_inp_mem_ptr %p",m_inp_mem_ptr);
825711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr) {
825811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; j<drv_ctx.ip_buf.actualcount; j++) {
825911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( BITMASK_PRESENT(&m_inp_bm_count,j)) {
826011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
826111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
826211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
826311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (j==drv_ctx.ip_buf.actualcount) {
826411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bRet = true;
826511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
826611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
826711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bRet = true;
826811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
826911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bRet;
827011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
827111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
827211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
827311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE * buffer)
827411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8275b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("FBD");
827611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
827711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buffer || (buffer - m_out_mem_ptr) >= (int)drv_ctx.op_buf.actualcount) {
827811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("[FBD] ERROR in ptr(%p)", buffer);
827911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
828011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (output_flush_progress) {
828111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FBD: Buffer (%p) flushed", buffer);
828211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
828311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nTimeStamp = 0;
828411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~OMX_BUFFERFLAG_EXTRADATA;
828511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ;
828611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
828711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
828811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
828911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug_extradata) {
829011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) {
829111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
829211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FillBufferDone: End Of Sequence Received");
829311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
829411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
829511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
829611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & OMX_BUFFERFLAG_DATACORRUPT) {
829711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
829811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
829911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("***************************************************");
830011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
830111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
830211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, flags: 0x%x, timestamp: %lld",
830511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp);
830611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_output_buffers --;
8307b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers);
830811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
830911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
831011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Output EOS has been reached");
831111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!output_flush_progress)
831211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            post_event((unsigned)NULL, (unsigned)NULL,
831311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EOS_DONE);
831411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
831511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame) {
831611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone(&m_cmp, m_app_data, psource_frame);
831711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
831811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
831911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame) {
832011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen = 0;
832111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_free_q.insert_entry((unsigned long) pdest_frame,(unsigned)NULL,
832211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL);
832311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = NULL;
832411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
832511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
832611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
832711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_EXTRADATA_LOG
832811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (outputExtradataFile) {
832911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int buf_index = buffer - m_out_mem_ptr;
833011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *pBuffer = (OMX_U8 *)(drv_ctx.ptr_outputbuffer[buf_index].bufferaddr);
833111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
833211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
833311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)
833411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((unsigned long)(pBuffer + buffer->nOffset + buffer->nFilledLen + 3)&(~3));
833511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
833611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (p_extra && (OMX_U8*)p_extra < (pBuffer + buffer->nAllocLen) ) {
833711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("WRITING extradata, size=%d,type=%x",
833811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    p_extra->nSize, p_extra->eType);
833911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite (p_extra,1,p_extra->nSize,outputExtradataFile);
834011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (p_extra->eType == OMX_ExtraDataNone) {
834211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
834311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
834411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
834511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
834611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
834711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
834811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
834911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* For use buffer we need to copy the data */
835011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!output_flush_progress) {
835111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* This is the error check for non-recoverable errros */
835211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_duplicate_ts_valid = true;
835311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_interlaced = (drv_ctx.interlace != VDEC_InterlaceFrameProgressive);
835411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
835511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (output_capability == V4L2_PIX_FMT_MPEG4 ||
835611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_MPEG2 ||
835711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_DIVX ||
835811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_DIVX_311)
835911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            is_duplicate_ts_valid = false;
836011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
836111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((output_capability == V4L2_PIX_FMT_H264 ||
836211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                output_capability == V4L2_PIX_FMT_H264_MVC) &&
836311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                is_interlaced) {
836411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF) {
836511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                is_interlaced = false;
836611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
836711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
836811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
836911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen > 0) {
837011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            time_stamp_dts.get_next_timestamp(buffer,
837111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_interlaced && is_duplicate_ts_valid);
837211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_debug_timestamp) {
837311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
837411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_TICKS expected_ts = 0;
837511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_timestamp_list.pop_min_ts(expected_ts);
837611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (is_interlaced && is_duplicate_ts_valid) {
837711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_timestamp_list.pop_min_ts(expected_ts);
837811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
837911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Current timestamp (%lld),Popped TIMESTAMP (%lld) from list",
838011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            buffer->nTimeStamp, expected_ts);
838111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
838211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (buffer->nTimeStamp != expected_ts) {
838311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR in omx_vdec::async_message_process timestamp Check");
838411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
838511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
838611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
838711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
838811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
8389b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("FBD-TS", buffer->nTimeStamp / 1000);
839011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
839111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_cb.FillBufferDone) {
839211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen > 0) {
839311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (arbitrary_bytes)
839411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                adjust_timestamp(buffer->nTimeStamp);
839511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
839611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                set_frame_rate(buffer->nTimeStamp);
839711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8398fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            proc_frms++;
839911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (perf_flag) {
8400fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (1 == proc_frms) {
840111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dec_time.stop();
840211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    latency = dec_time.processing_time_us() - latency;
840311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH(">>> FBD Metrics: Latency(%.2f)mS", latency / 1e3);
840411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dec_time.start();
840511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fps_metrics.start();
840611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
840711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
840811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U64 proc_time = 0;
840911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fps_metrics.stop();
841011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    proc_time = fps_metrics.processing_time_us();
841111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH(">>> FBD Metrics: proc_frms(%u) proc_time(%.2f)S fps(%.2f)",
841211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)proc_frms, (float)proc_time / 1e6,
841311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (float)(1e6 * proc_frms) / proc_time);
841411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
841511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
841611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
841711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFlags & OMX_BUFFERFLAG_EOS) {
841811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            prev_ts = LLONG_MAX;
841911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rst_prev_ts = true;
8420fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            proc_frms = 0;
842111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
842211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
842311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPMEMInfo = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
842411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((OMX_QCOM_PLATFORM_PRIVATE_LIST *)
842511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             buffer->pPlatformPrivate)->entryList->entry;
842611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Before FBD callback Accessed Pmeminfo %lu",pPMEMInfo->pmem_fd);
842711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *il_buffer;
842811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        il_buffer = client_buffers.get_il_buf_hdr(buffer);
842911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 current_framerate = (int)(drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator);
843011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
843111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (il_buffer && m_last_rendered_TS >= 0) {
843211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_TICKS ts_delta = (OMX_TICKS)llabs(il_buffer->nTimeStamp - m_last_rendered_TS);
843311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
843411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Current frame can be send for rendering if
843511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (a) current FPS is <=  60
843611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (b) is the next frame after the frame with TS 0
843711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (c) is the first frame after seek
843811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (d) the delta TS b\w two consecutive frames is > 16 ms
843911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (e) its TS is equal to previous frame TS
844011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // (f) if marked EOS
844111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
844211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(current_framerate <= 60 || m_last_rendered_TS == 0 ||
844311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               il_buffer->nTimeStamp == 0 || ts_delta >= 16000 ||
844411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               ts_delta == 0 || (il_buffer->nFlags & OMX_BUFFERFLAG_EOS)) {
844511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               m_last_rendered_TS = il_buffer->nTimeStamp;
844611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
844711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               //mark for droping
844811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               buffer->nFilledLen = 0;
844911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
845011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
845111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" -- %s Frame -- info:: fps(%d) lastRenderTime(%lld) bufferTs(%lld) ts_delta(%lld)",
845211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              buffer->nFilledLen? "Rendering":"Dropping",current_framerate,m_last_rendered_TS,
845311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              il_buffer->nTimeStamp,ts_delta);
845411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
845511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //above code makes sure that delta b\w two consecutive frames is not
845611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //greater than 16ms, slow-mo feature, so cap fps to max 60
845711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (current_framerate > 60 ) {
845811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                current_framerate = 60;
845911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
846011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
846111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
846211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // add current framerate to gralloc meta data
8463fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (buffer->nFilledLen > 0 && m_drc_enable && m_enable_android_native_buffers && m_out_mem_ptr) {
8464fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            //If valid fps was received, directly send it to display for the 1st fbd.
8465fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            //Otherwise, calculate fps using fbd timestamps,
8466fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            //  when received 2 fbds, send a coarse fps,
8467fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            //  when received 30 fbds, update fps again as it should be
8468fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            //  more accurate than the one when only 2 fbds received.
8469fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            //For other frames, set value 0 to inform that refresh rate has no update
8470fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            float refresh_rate = m_fps_prev;
8471fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (m_fps_received) {
8472fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (1 == proc_frms) {
8473fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    refresh_rate = m_fps_received / (float)(1<<16);
8474fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
8475fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            } else {
8476fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (2 == proc_frms || 30 == proc_frms) {
8477fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    refresh_rate = drv_ctx.frame_rate.fps_numerator / (float) drv_ctx.frame_rate.fps_denominator;
8478fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
8479fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
8480fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (refresh_rate > 60) {
8481fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                refresh_rate = 60;
8482fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
8483fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_LOW("frc set refresh_rate %f, frame %d", refresh_rate, proc_frms);
848411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 buf_index = buffer - m_out_mem_ptr;
848511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
8486fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         UPDATE_REFRESH_RATE, (void*)&refresh_rate);
8487fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_fps_prev = refresh_rate;
848811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
848911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
849011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer->nFilledLen && m_enable_android_native_buffers && m_out_mem_ptr) {
849111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 buf_index = buffer - m_out_mem_ptr;
849211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("stereo_output_mode = %d",stereo_output_mode);
849311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
849411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               S3D_FORMAT, (void*)&stereo_output_mode);
849511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
849611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
849711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (il_buffer) {
849811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            log_output_buffers(il_buffer);
849911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dynamic_buf_mode) {
850011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int nPortIndex = 0;
850111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
850211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
850311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Since we're passing around handles, adjust nFilledLen and nAllocLen
850411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // to size of the handle. Do it _after_ log_output_buffers which
850511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // requires the respective sizes to be accurate.
850611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
850711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer->nAllocLen = sizeof(struct VideoDecoderOutputMetaData);
850811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer->nFilledLen = buffer->nFilledLen ?
850911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        sizeof(struct VideoDecoderOutputMetaData) : 0;
851011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
851111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //Clear graphic buffer handles in dynamic mode
851211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (nPortIndex < drv_ctx.op_buf.actualcount &&
851311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    nPortIndex < MAX_NUM_INPUT_OUTPUT_BUFFERS) {
851411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_buffer[nPortIndex].privatehandle = NULL;
851511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_buffer[nPortIndex].nativehandle = NULL;
851611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
851711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("[FBD]Invalid native_buffer index: %d", nPortIndex);
851811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
851911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
852011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
852111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.FillBufferDone (hComp,m_app_data,il_buffer);
852211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
852311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Invalid buffer address from get_il_buf_hdr");
852411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
852511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
852611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("After Fill Buffer Done callback %lu",pPMEMInfo->pmem_fd);
852711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
852811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
852911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
853011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
853111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ADAPTIVE_PLAYBACK_SUPPORTED
853211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_smoothstreaming_mode && m_out_mem_ptr) {
853311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 buf_index = buffer - m_out_mem_ptr;
853411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        BufferDim_t dim;
853511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        private_handle_t *private_handle = NULL;
853611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dim.sliceWidth = framesize.nWidth;
853711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dim.sliceHeight = framesize.nHeight;
853811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buf_index < drv_ctx.op_buf.actualcount &&
853911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
854011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_buffer[buf_index].privatehandle)
854111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private_handle = native_buffer[buf_index].privatehandle;
854211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (private_handle) {
854311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set metadata: update buf-geometry with stride %d slice %d",
854411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dim.sliceWidth, dim.sliceHeight);
854511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            setMetaData(private_handle, UPDATE_BUFFER_GEOMETRY, (void*)&dim);
854611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
854711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
854811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
854911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
855011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
855111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
855211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
855311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE         hComp,
855411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE* buffer)
855511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8556b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_NAME_HIGH("EBD");
855711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int nBufferIndex = buffer - m_inp_mem_ptr;
855811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8559fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (buffer == NULL || (nBufferIndex >= (int)drv_ctx.ip_buf.actualcount)) {
856011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("empty_buffer_done: ERROR bufhdr = %p", buffer);
856111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
856211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
856311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
856411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p, bufhdr->nFlags = 0x%x",
856511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer, buffer->pBuffer, buffer->nFlags);
856611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pending_input_buffers--;
8567b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
856811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
856911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
857011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame == NULL && input_flush_progress == false) {
857111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Push input from buffer done address of Buffer %p",buffer);
857211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame = buffer;
857311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nFilledLen = 0;
857411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nTimeStamp = LLONG_MAX;
857511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            push_input_buffer (hComp);
857611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
857711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Push buffer into freeq address of Buffer %p",buffer);
857811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->nFilledLen = 0;
857911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_input_free_q.insert_entry((unsigned long)buffer,
858011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned)NULL, (unsigned)NULL)) {
858111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR:i/p free Queue is FULL Error");
858211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
858311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
858411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_cb.EmptyBufferDone) {
858511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer->nFilledLen = 0;
858611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (input_use_buffer == true) {
858711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer = &m_inp_heap_ptr[buffer-m_inp_mem_ptr];
858811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
858911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
859011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Restore the FD that we over-wrote in ETB */
859111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pass_buffer_fd) {
859211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer->pBuffer = (OMX_U8*)(uintptr_t)drv_ctx.ptr_inputbuffer[nBufferIndex].pmem_fd;
859311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
859411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
859511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone(hComp ,m_app_data, buffer);
859611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
859711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
859811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
859911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
860011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::async_message_process (void *context, void* message)
860111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
860211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdec* omx = NULL;
860311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_msginfo *vdec_msg = NULL;
860411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
860511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer *v4l2_buf_ptr = NULL;
860611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane *plane = NULL;
860711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo *output_respbuf = NULL;
860811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc=1;
860911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (context == NULL || message == NULL) {
861011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("FATAL ERROR in omx_vdec::async_message_process NULL Check");
861111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
861211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
861311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vdec_msg = (struct vdec_msginfo *)message;
861411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
861511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = reinterpret_cast<omx_vdec*>(context);
861611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
861711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (vdec_msg->msgcode) {
861811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
861911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_ERROR:
862011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
862111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
862211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
862311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
862411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_OVERLOAD:
862511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
862611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
862711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
862811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
862911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_HW_UNSUPPORTED:
863011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
863111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING);
863211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
863311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
863411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_START_DONE:
863511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
863611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_START_DONE);
863711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
863811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
863911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_STOP_DONE:
864011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
864111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_STOP_DONE);
864211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
864311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
864411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_RESUME_DONE:
864511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
864611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_RESUME_DONE);
864711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
864811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
864911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_PAUSE_DONE:
865011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
865111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_PAUSE_DONE);
865211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
865311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
865411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_FLUSH_INPUT_DONE:
865511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
865611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
865711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
865811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
865911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
866011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
866111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
866211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_INPUT_FLUSHED:
866311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_INPUT_BUFFER_DONE:
866411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
866511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* omxhdr = (OMX_BUFFERHEADERTYPE* )
866611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               vdec_msg->msgdata.input_frame_clientdata; */
866711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
866811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.input_frame_clientdata;
866911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->m_inp_mem_ptr == NULL || v4l2_buf_ptr == NULL ||
867011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf_ptr->index >= omx->drv_ctx.ip_buf.actualcount) {
867111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr = NULL;
867211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg->status_code = VDEC_S_EFATAL;
867311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
867411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
867611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr = omx->m_inp_mem_ptr + v4l2_buf_ptr->index;
867711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
867811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_INPUT_UNSUPPORTED) {
867911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Unsupported input");
868011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned)NULL, vdec_msg->status_code,\
868111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
868211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
868311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
868411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
868511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                vdec_msg->status_code = VDEC_S_INPUT_BITSTREAM_ERR;
868611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
868711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omxhdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
868811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
868911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Decrement codec_config buffer counter");
869011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                android_atomic_dec(&omx->m_queued_codec_config_count);
869111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ((android_atomic_add(0, &omx->m_queued_codec_config_count) == 0) &&
869211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    BITMASK_PRESENT(&omx->m_flags, OMX_COMPONENT_FLUSH_DEFERRED)) {
869311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("sem post for CODEC CONFIG buffer");
869411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sem_post(&omx->m_safe_flush);
869511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
869611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
869711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME ||
869811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
869911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
870011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
870111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event ((unsigned long)omxhdr,vdec_msg->status_code,
870211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_EBD);
870311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
870411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_INFO_FIELD_DROPPED:
870511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int64_t *timestamp;
870611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            timestamp = (int64_t *) malloc(sizeof(int64_t));
870711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (timestamp) {
870811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *timestamp = vdec_msg->msgdata.output_frame.time_stamp;
870911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned long)timestamp, vdec_msg->status_code,
871011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED);
871111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Field dropped time stamp is %lld",
871211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (long long)vdec_msg->msgdata.output_frame.time_stamp);
871311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
871411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
871511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_OUTPUT_FLUSHED:
871611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_RESP_OUTPUT_BUFFER_DONE:
871711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
871811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           v4l2_buf_ptr = (v4l2_buffer*)vdec_msg->msgdata.output_frame.client_data;
871911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (v4l2_buf_ptr == NULL || omx->m_out_mem_ptr == NULL ||
872011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               v4l2_buf_ptr->index >= omx->drv_ctx.op_buf.actualcount) {
872111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omxhdr = NULL;
872211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               vdec_msg->status_code = VDEC_S_EFATAL;
872311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
872411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
872511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           plane = v4l2_buf_ptr->m.planes;
872611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           omxhdr = omx->m_out_mem_ptr + v4l2_buf_ptr->index;
872711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
872811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (omxhdr && omxhdr->pOutputPortPrivate &&
872911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   ((omxhdr - omx->m_out_mem_ptr) < (int)omx->drv_ctx.op_buf.actualcount) &&
873011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   (((struct vdec_output_frameinfo *)omxhdr->pOutputPortPrivate
873111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     - omx->drv_ctx.ptr_respbuffer) < (int)omx->drv_ctx.op_buf.actualcount)) {
873211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
873311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (vdec_msg->msgdata.output_frame.len <=  omxhdr->nAllocLen) {
873411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFilledLen = vdec_msg->msgdata.output_frame.len;
873511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nOffset = vdec_msg->msgdata.output_frame.offset;
873611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nTimeStamp = vdec_msg->msgdata.output_frame.time_stamp;
873711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFlags = 0;
873811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
873911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS) {
874011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
874111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //rc = -1;
874211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
874311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen) {
874411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
874511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
874611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME || v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) {
874711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
874811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   } else {
874911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags &= ~OMX_BUFFERFLAG_SYNCFRAME;
875011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
875111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOSEQ) {
875211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
875311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
875411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) {
875511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_DECODEONLY;
875611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
875711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_MSM_BUF_FLAG_MBAFF) {
875811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= QOMX_VIDEO_BUFFERFLAG_MBAFF;
875911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
876011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_READONLY) {
876111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omxhdr->nFlags |= OMX_BUFFERFLAG_READONLY;
876211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("F_B_D: READONLY BUFFER - REFERENCE WITH F/W fd = %d",
876311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd);
876411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
876511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
876611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr && (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DROP_FRAME) &&
876711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !omx->output_flush_progress &&
876811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_DECODEONLY) &&
876911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           !(v4l2_buf_ptr->flags & V4L2_QCOM_BUF_FLAG_EOS)) {
877011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       unsigned int index = v4l2_buf_ptr->index;
877111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       unsigned int extra_idx = EXTRADATA_IDX(omx->drv_ctx.num_planes);
877211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->time_stamp_dts.remove_time_stamp(
877311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omxhdr->nTimeStamp,
877411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               (omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive)
877511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               ?true:false);
877611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].bytesused = 0;
877711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].m.userptr =
877811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].bufferaddr -
877911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned long)omx->drv_ctx.ptr_outputbuffer[index].offset;
878011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].reserved[0] = omx->drv_ctx.ptr_outputbuffer[index].pmem_fd;
878111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].reserved[1] = omx->drv_ctx.ptr_outputbuffer[index].offset;
878211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       plane[0].data_offset = 0;
878311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       v4l2_buf_ptr->flags = 0x0;
878411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
878511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].bytesused = 0;
878611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].length = omx->drv_ctx.extradata_info.buffer_size;
878711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].m.userptr = (long unsigned int) (omx->drv_ctx.extradata_info.uaddr + index * omx->drv_ctx.extradata_info.buffer_size);
878811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
878911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].reserved[0] = omx->drv_ctx.extradata_info.ion.fd_ion_data.fd;
879011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
879111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].reserved[1] = v4l2_buf_ptr->index * omx->drv_ctx.extradata_info.buffer_size;
879211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           plane[extra_idx].data_offset = 0;
879311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else if (extra_idx >= VIDEO_MAX_PLANES) {
879411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_ERROR("Extradata index higher than expected: %u", extra_idx);
879511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           return -1;
879611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
879711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
879811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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",
879911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               plane[0].reserved[0],plane[extra_idx].reserved[0], plane[extra_idx].reserved[1], omx->output_flush_progress);
880011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if(ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_QBUF, v4l2_buf_ptr)) {
880111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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]);
880211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return -1;
880311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
880411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       break;
880511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
880611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_QCOM_BUF_DATA_CORRUPT) {
880711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omxhdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
880811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
880911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
881011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf = (struct vdec_output_frameinfo *)\
881111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            omxhdr->pOutputPortPrivate;
881211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (!output_respbuf) {
881311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("async_message_process: invalid output buf received");
881411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     return -1;
881511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
881611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf->len = vdec_msg->msgdata.output_frame.len;
881711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   output_respbuf->offset = vdec_msg->msgdata.output_frame.offset;
881811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
881911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_KEYFRAME) {
882011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_I;
882111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
882211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_PFRAME) {
882311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_P;
882411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
882511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (v4l2_buf_ptr->flags & V4L2_BUF_FLAG_BFRAME) {
882611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       output_respbuf->pic_type = PICTURE_TYPE_B;
882711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
882811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
882911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (vdec_msg->msgdata.output_frame.len) {
883042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                       if (!omx->output_flush_progress && (omxhdr->nFilledLen > 0)) {
883142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // set the default colorspace advised by client, since the bitstream may be
883242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // devoid of colorspace-info.
883342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           if (omx->m_enable_android_native_buffers) {
883442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               ColorSpace_t color_space = ITU_R_601;
883542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
883642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Disabled ?
883742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // WA for VP8. Vp8 encoder does not embed color-info (yet!).
883842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Encoding RGBA results in 601-LR for all resolutions.
883942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // This conflicts with the client't defaults which are based on resolution.
884042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           //   Eg: 720p will be encoded as 601-LR. Client will say 709.
884142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // Re-enable this code once vp8 encoder generates color-info and hence the
884242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           // decoder will be able to override with the correct source color.
884342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#if 0
884442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               switch (omx->m_client_color_space.sAspects.mPrimaries) {
884542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT601_6_625:
884642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT601_6_525:
884742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
884842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space = omx->m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ?
884942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                               ITU_R_601_FR : ITU_R_601;
885042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
885142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
885242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   case ColorAspects::PrimariesBT709_5:
885342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
885442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space = ITU_R_709;
885542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
885642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
885742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   default:
885842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   {
885942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       break;
886042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                   }
886142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               }
886242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif
886342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)",
886442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                                       color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
886542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                               omx->set_colorspace_in_handle(color_space, omxhdr - omx->m_out_mem_ptr);
886642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                           }
886742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                       }
886842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
886911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_LOW("Processing extradata");
887011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->handle_extradata(omxhdr);
887111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
887211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (omx->m_extradata_info.output_crop_updated) {
887311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_LOW("Read FBD crop from output extra data");
887411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left = omx->m_extradata_info.output_crop_rect.nLeft;
887511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top = omx->m_extradata_info.output_crop_rect.nTop;
887611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right = omx->m_extradata_info.output_crop_rect.nWidth;
887711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom = omx->m_extradata_info.output_crop_rect.nHeight;
887811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_width = omx->m_extradata_info.output_width;
887911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_height = omx->m_extradata_info.output_height;
888011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else {
888111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields");
888211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left = plane[0].reserved[2];
888311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top = plane[0].reserved[3];
888411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right = plane[0].reserved[2] + plane[0].reserved[4];
888511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom = plane[0].reserved[3] + plane[0].reserved[5];
888611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
888711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
8888fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
8889fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           /* Copy these values back to OMX internal variables to make both handlign same*/
8890fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
8891fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nLeft = vdec_msg->msgdata.output_frame.framesize.left;
8892fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nTop = vdec_msg->msgdata.output_frame.framesize.top;
8893fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nWidth = vdec_msg->msgdata.output_frame.framesize.right;
8894fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_crop_rect.nHeight = vdec_msg->msgdata.output_frame.framesize.bottom;
8895fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
8896fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           omx->m_extradata_info.output_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
889711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
889811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
889911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
890011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   vdec_msg->msgdata.output_frame.bufferaddr =
890111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].bufferaddr;
890211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8903fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                   if (vdec_msg->msgdata.output_frame.len)
8904fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                       memcpy(&omx->drv_ctx.frame_size,
8905fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               &vdec_msg->msgdata.output_frame.framesize,
8906fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               sizeof(struct vdec_framesize));
890711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8908fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                   DEBUG_PRINT_LOW("[RespBufDone] Fd(%d) Buf(%p) Ts(%lld) PicType(%u) Flags (0x%x)"
8909fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                           " FillLen(%u) Crop: L(%u) T(%u) R(%u) B(%u)",
8910fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                           omx->drv_ctx.ptr_outputbuffer[v4l2_buf_ptr->index].pmem_fd,
891111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omxhdr, (long long)vdec_msg->msgdata.output_frame.time_stamp,
891211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.pic_type, v4l2_buf_ptr->flags,
891311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned int)vdec_msg->msgdata.output_frame.len,
891411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.left,
891511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.top,
891611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.right,
891711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           vdec_msg->msgdata.output_frame.framesize.bottom);
891811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
891911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* Post event if resolution OR crop changed */
892011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* filled length will be changed if resolution changed */
892111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   /* Crop parameters can be changed even without resolution change */
892211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen
892311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       && ((omx->prev_n_filled_len != omxhdr->nFilledLen)
892411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.left != vdec_msg->msgdata.output_frame.framesize.left)
892511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.top != vdec_msg->msgdata.output_frame.framesize.top)
892611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.right != vdec_msg->msgdata.output_frame.framesize.right)
892711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.frame_size.bottom != vdec_msg->msgdata.output_frame.framesize.bottom)
892811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.video_resolution.frame_width != vdec_msg->msgdata.output_frame.picsize.frame_width)
892911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       || (omx->drv_ctx.video_resolution.frame_height != vdec_msg->msgdata.output_frame.picsize.frame_height) )) {
893011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
893111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry 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",
893211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->prev_n_filled_len,
893311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.video_resolution.frame_width,
893411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.video_resolution.frame_height,
893511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.frame_size.left, omx->drv_ctx.frame_size.top,
893611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omx->drv_ctx.frame_size.right, omx->drv_ctx.frame_size.bottom,
893711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               omxhdr->nFilledLen, vdec_msg->msgdata.output_frame.picsize.frame_width,
893811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_height,
893911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.left,
894011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.top,
894111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.right,
894211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.framesize.bottom);
894311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
894411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.video_resolution.frame_width =
894511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_width;
894611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->drv_ctx.video_resolution.frame_height =
894711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.picsize.frame_height;
894811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
894911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.stride =
895011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_width);
895111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
895211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12, omx->drv_ctx.video_resolution.frame_height);
895311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
895411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.stride =
895511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_width);
895611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
895711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, omx->drv_ctx.video_resolution.frame_height);
8958b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                       } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
8959b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                           omx->drv_ctx.video_resolution.stride =
8960b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                               VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_width);
8961b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                           omx->drv_ctx.video_resolution.scan_lines =
8962b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                               VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, omx->drv_ctx.video_resolution.frame_height);
8963b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        }
896411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
896511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->post_event(OMX_CORE_OUTPUT_PORT_INDEX,
896611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_IndexConfigCommonOutputCrop,
896711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
896811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
896911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
897011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr->nFilledLen)
897111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       omx->prev_n_filled_len = omxhdr->nFilledLen;
897211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
897311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omxhdr && omxhdr->nFilledLen && !omx->high_fps) {
897411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx->request_perf_level(VIDC_NOMINAL);
897511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
897611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (omx->output_use_buffer && omxhdr->pBuffer &&
897711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       vdec_msg->msgdata.output_frame.bufferaddr)
897811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       memcpy ( omxhdr->pBuffer, (void *)
897911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               ((unsigned long)vdec_msg->msgdata.output_frame.bufferaddr +
898011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (unsigned long)vdec_msg->msgdata.output_frame.offset),
898111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               vdec_msg->msgdata.output_frame.len);
898211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               } else {
898311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("Invalid filled length = %u, buffer size = %u, prev_length = %u",
898411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           (unsigned int)vdec_msg->msgdata.output_frame.len,
898511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           omxhdr->nAllocLen, omx->prev_n_filled_len);
898611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   omxhdr->nFilledLen = 0;
898711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
898811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
898911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omx->post_event ((unsigned long)omxhdr, vdec_msg->status_code,
899011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_FBD);
899111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
899211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (vdec_msg->msgdata.output_frame.flags & OMX_BUFFERFLAG_EOS) {
899311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned long)NULL, vdec_msg->status_code,
899411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_EOS_DONE);
899511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
899611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->post_event ((unsigned int)NULL, vdec_msg->status_code,
899711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
899811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
899911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
900011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VDEC_MSG_EVT_CONFIG_CHANGED:
900111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Port settings changed");
900211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->m_reconfig_width = vdec_msg->msgdata.output_frame.picsize.frame_width;
900311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->m_reconfig_height = vdec_msg->msgdata.output_frame.picsize.frame_height;
900411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->post_event (OMX_CORE_OUTPUT_PORT_INDEX, OMX_IndexParamPortDefinition,
900511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_COMPONENT_GENERATE_PORT_RECONFIG);
900611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!omx->high_fps) {
900711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->request_perf_level(VIDC_NOMINAL);
900811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
900911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
901011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
901111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
901211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
901311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
901411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
901511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
901611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy_arbitrary (
901711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_HANDLETYPE hComp,
901811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *buffer
901911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        )
902011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
902111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned address,p2,id;
902211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Empty this arbitrary");
902311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
902411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
902511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
902611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
902711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxyArb: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer);
902811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETBProxyArb: nFilledLen %u, flags %u, timestamp %lld",
902911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)buffer->nFilledLen, (unsigned int)buffer->nFlags, buffer->nTimeStamp);
903011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
903111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return zero length and not an EOS buffer */
903211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* return buffer if input flush in progress */
903311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((input_flush_progress == true) || ((buffer->nFilledLen == 0) &&
903411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))) {
903511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("return zero legth buffer or flush in progress");
903611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp,m_app_data,buffer);
903711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
903811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
903911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
904011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (psource_frame == NULL) {
904111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set Buffer as source Buffer %p time stamp %lld",buffer,buffer->nTimeStamp);
904211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = buffer;
904311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Try to Push One Input Buffer ");
904411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        push_input_buffer (hComp);
904511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
904611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Push the source buffer into pendingq %p",buffer);
904711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_input_pending_q.insert_entry((unsigned long)buffer, (unsigned)NULL,
904811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned)NULL)) {
904911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
905011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
905111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
905211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
905311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
905411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_config_flag = false;
905511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
905611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
905711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
905811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
905911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_buffer (OMX_HANDLETYPE hComp)
906011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
906111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address,p2,id;
906211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
906311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
906411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pdest_frame == NULL || psource_frame == NULL) {
906511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if we have a destination buffer*/
906611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame == NULL) {
906711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Get a Destination buffer from the queue");
906811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_free_q.m_size) {
906911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_free_q.pop_entry(&address,&p2,&id);
907011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = (OMX_BUFFERHEADERTYPE *)address;
907111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen = 0;
907211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nTimeStamp = LLONG_MAX;
907311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Address of Pmem Buffer %p",pdest_frame);
907411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
907511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
907611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
907711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if we have a destination buffer*/
907811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame == NULL) {
907911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Get a source buffer from the queue");
908011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pending_q.m_size) {
908111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_pending_q.pop_entry(&address,&p2,&id);
908211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psource_frame = (OMX_BUFFERHEADERTYPE *)address;
908311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
908411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        psource_frame->nTimeStamp);
908511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
908611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
908711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
908811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
908911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
909011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
909111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
909211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
909311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while ((pdest_frame != NULL) && (psource_frame != NULL)) {
909411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_type_parse) {
909511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_MPEG4:
909611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_H263:
909711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_MPEG2:
909811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret =  push_input_sc_codec(hComp);
909911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
910011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_H264:
910111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_h264(hComp);
910211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
910311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_HEVC:
910411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_hevc(hComp);
910511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
910611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case CODEC_TYPE_VC1:
910711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ret = push_input_vc1(hComp);
910811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
910911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
911011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
911111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
911211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret != OMX_ErrorNone) {
911311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Pushing input Buffer Failed");
911411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx_report_error ();
911511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
911611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
911711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
911811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
911911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
912011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
912111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
912211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_sc_codec(OMX_HANDLETYPE hComp)
912311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
912411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
912511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
912611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address = 0, p2 = 0, id = 0;
912711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
912811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Start Parsing the bit stream address %p TimeStamp %lld",
912911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame,psource_frame->nTimeStamp);
913011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_frame_parser.parse_sc_frame(psource_frame,
913111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame,&partial_frame) == -1) {
913211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error In Parsing Return Error");
913311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
913411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
913511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
913611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
913711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Frame size %u source %p frame count %d",
913811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)pdest_frame->nFilledLen,psource_frame,frame_count);
913911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
914011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
914111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TimeStamp updated %lld", pdest_frame->nTimeStamp);
914211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*First Parsed buffer will have only header Hence skip*/
914311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frame_count == 0) {
914411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("H263/MPEG4 Codec First Frame ");
914511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
914611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (codec_type_parse == CODEC_TYPE_MPEG4 ||
914711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    codec_type_parse == CODEC_TYPE_DIVX) {
914811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                mp4StreamType psBits;
914911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psBits.data = pdest_frame->pBuffer + pdest_frame->nOffset;
915011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psBits.numBytes = pdest_frame->nFilledLen;
915111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                mp4_headerparser.parseHeader(&psBits);
915211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
915311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
915411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_count++;
915511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
915611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
915711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame->nFilledLen) {
915811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
915911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
916011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
916111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
916211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
916311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
916411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
916511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_input_free_q.m_size) {
916611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_input_free_q.pop_entry(&address,&p2,&id);
916711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
916811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFilledLen = 0;
916911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
917011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (!(psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) {
917111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Zero len buffer return back to POOL");
917211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_free_q.insert_entry((unsigned long) pdest_frame, (unsigned)NULL,
917311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned)NULL);
917411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
917511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
917611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
917711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
917811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Not a Complete Frame %u", (unsigned int)pdest_frame->nFilledLen);
917911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if Destination Buffer is full*/
918011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pdest_frame->nAllocLen ==
918111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen + pdest_frame->nOffset) {
918211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR:Frame Not found though Destination Filled");
918311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
918411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
918511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
918611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
918711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (psource_frame->nFilledLen == 0) {
918811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
918911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
919011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFlags |= psource_frame->nFlags;
9191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                pdest_frame->nTimeStamp = psource_frame->nTimeStamp;
919211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %lld",
919311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
919411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
919511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
919611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
919711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
919811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
919911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
920011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
920111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
920211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
920311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr") ;
920411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
920511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
920611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
920711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (generate_ebd) {
920811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Buffer Consumed return back to client %p",psource_frame);
920911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
921011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = NULL;
921111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
921211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_input_pending_q.m_size) {
921311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
921411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_input_pending_q.pop_entry(&address,&p2,&id);
921511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                psource_frame = (OMX_BUFFERHEADERTYPE *) address;
921611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer %p time stamp %lld",psource_frame,
921711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        psource_frame->nTimeStamp);
921811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Next source Buffer flag %u length %u",
921911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
922011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
922111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
922211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
922311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
922411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
922511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
922611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp)
922711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
922811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
922911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address = 0, p2 = 0, id = 0;
923011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL isNewFrame = OMX_FALSE;
923111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
923211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
923311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer == NULL) {
923411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:H.264 Scratch Buffer not allocated");
923511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
923611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
923711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Pending h264_scratch.nFilledLen %u "
923811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "look_ahead_nal %d", (unsigned int)h264_scratch.nFilledLen, look_ahead_nal);
923911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Pending pdest_frame->nFilledLen %u",(unsigned int)pdest_frame->nFilledLen);
924011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.nFilledLen && look_ahead_nal) {
924111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
924211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
924311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen) {
924411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
924511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.pBuffer,h264_scratch.nFilledLen);
924611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen += h264_scratch.nFilledLen;
924711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Copy the previous NAL (h264 scratch) into Dest frame");
924811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFilledLen = 0;
924911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
925011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error:1: Destination buffer overflow for H264");
925111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
925211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
925311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
925411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
925511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* If an empty input is queued with EOS, do not coalesce with the destination-frame yet, as this may result
925611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       in EOS flag getting associated with the destination
925711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    */
925811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) &&
925911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame->nFilledLen) {
926011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("delay ETB for 'empty buffer with EOS'");
926111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        generate_ebd = OMX_FALSE;
926211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
926311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
926411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nal_length == 0) {
926511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Zero NAL, hence parse using start code");
926611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_sc_frame(psource_frame,
926711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
926811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
926911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
927011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
927111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
927211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d ",nal_length);
927311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_h264_nallength(psource_frame,
927411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
927511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
927611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
927711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
927811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
927911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
928011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
928111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
928211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
928311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nal_count++;
928411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
928511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFlags = psource_frame->nFlags;
928611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
928711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Parsed New NAL Length = %u",(unsigned int)h264_scratch.nFilledLen);
928811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (h264_scratch.nFilledLen) {
928911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer, h264_scratch.nFilledLen,
929011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        NALU_TYPE_SPS);
929111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
929211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (client_extradata & OMX_TIMEINFO_EXTRADATA)
929311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
929411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
929511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
929611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // If timeinfo is present frame info from SEI is already processed
929711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_parser->parse_nal((OMX_U8*)h264_scratch.pBuffer,
929811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen, NALU_TYPE_SEI);
929911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
930011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
930111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_count++;
930211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (VALID_TS(h264_last_au_ts) && !VALID_TS(pdest_frame->nTimeStamp)) {
930311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nTimeStamp = h264_last_au_ts;
930411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFlags = h264_last_au_flags;
930511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef PANSCAN_HDLR
930611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
930711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_parser->update_panscan_data(h264_last_au_ts);
930811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
930911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
931011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_frame_parser.mutils->nalu_type == NALU_TYPE_NON_IDR ||
931111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_frame_parser.mutils->nalu_type == NALU_TYPE_IDR) {
931211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_ts = h264_scratch.nTimeStamp;
931311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_flags = h264_scratch.nFlags;
931411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
931511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
931611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(h264_last_au_ts);
931711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (!VALID_TS(h264_last_au_ts))
931811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_last_au_ts = ts_in_sei;
931911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
932011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
932111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else
932211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_last_au_ts = LLONG_MAX;
932311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
932411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
932511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!isNewFrame) {
932611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
932711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen) {
932811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Not a NewFrame Copy into Dest len %u",
932911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)h264_scratch.nFilledLen);
933011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
933111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.pBuffer,h264_scratch.nFilledLen);
933211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nFilledLen += h264_scratch.nFilledLen;
933311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_frame_parser.mutils->nalu_type == NALU_TYPE_EOSEQ)
933411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags |= QOMX_VIDEO_BUFFERFLAG_EOSEQ;
933511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    h264_scratch.nFilledLen = 0;
933611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
933711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Error:2: Destination buffer overflow for H264");
933811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
933911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
934011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if(h264_scratch.nFilledLen) {
934111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                look_ahead_nal = true;
934211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Frame Found start Decoding Size =%u TimeStamp = %llu",
934311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
934411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Found a frame size = %u number = %d",
934511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,frame_count++);
934611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
934711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pdest_frame->nFilledLen == 0) {
934811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Copy the Current Frame since and push it");
934911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    look_ahead_nal = false;
935011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
935111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nFilledLen) {
935211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
935311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                h264_scratch.pBuffer,h264_scratch.nFilledLen);
935411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
935511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen = 0;
935611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
935711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Error:3: Destination buffer overflow for H264");
935811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
935911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
936011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
936111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
936211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Reset the EOS Flag");
936311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
936411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
936511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /*Push the frame to the Decoder*/
936611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
936711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
936811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
936911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //frame_count++;
937011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = NULL;
937111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_input_free_q.m_size) {
937211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_input_free_q.pop_entry(&address,&p2,&id);
937311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
937411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Pop the next pdest_buffer %p",pdest_frame);
937511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen = 0;
937611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags = 0;
937711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = LLONG_MAX;
937811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
937911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
938011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
938111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
938211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
938311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Not a Complete Frame, pdest_frame->nFilledLen %u", (unsigned int)pdest_frame->nFilledLen);
938411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Check if Destination Buffer is full*/
938511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (h264_scratch.nAllocLen ==
938611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen + h264_scratch.nOffset) {
938711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
938811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
938911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
939011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
939111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
939211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen) {
939311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client",psource_frame);
939411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
939511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
939611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
939711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
939811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (pdest_frame->nAllocLen - pdest_frame->nFilledLen) >=
939911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen) {
940011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(pdest_frame->nFilledLen == 0) {
940111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        /* No residual frame from before, send whatever
940211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         * we have left */
940311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memcpy((pdest_frame->pBuffer + pdest_frame->nFilledLen),
940411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                h264_scratch.pBuffer, h264_scratch.nFilledLen);
940511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen += h264_scratch.nFilledLen;
940611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        h264_scratch.nFilledLen = 0;
940711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
940811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
940911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_frame_parser.mutils->isNewFrame(&h264_scratch, 0, isNewFrame);
941011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if(!isNewFrame) {
941111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Have a residual frame, but we know that the
941211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * AU in this frame is belonging to whatever
941311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * frame we had left over.  So append it */
941411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             memcpy ((pdest_frame->pBuffer + pdest_frame->nFilledLen),
941511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     h264_scratch.pBuffer,h264_scratch.nFilledLen);
941611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             pdest_frame->nFilledLen += h264_scratch.nFilledLen;
941711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             h264_scratch.nFilledLen = 0;
941811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             if (h264_last_au_ts != LLONG_MAX)
941911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 pdest_frame->nTimeStamp = h264_last_au_ts;
942011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else {
942111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            /* Completely new frame, let's just push what
942211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * we have now.  The resulting EBD would trigger
942311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             * another push */
942411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            generate_ebd = OMX_FALSE;
942511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pdest_frame->nTimeStamp = h264_last_au_ts;
942611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_last_au_ts = h264_scratch.nTimeStamp;
942711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
942811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
942911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
943011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR:4: Destination buffer overflow for H264");
943111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
943211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
943311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
943411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* Iff we coalesced two buffers, inherit the flags of both bufs */
943511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(generate_ebd == OMX_TRUE) {
943611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
943711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
943811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
943911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("pdest_frame->nFilledLen =%u TimeStamp = %llu",
944011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen,pdest_frame->nTimeStamp);
944111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Push AU frame number %d to driver", frame_count++);
944211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PROCESS_EXTRADATA_IN_OUTPUT_PORT
944311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (client_extradata & OMX_TIMEINFO_EXTRADATA) {
944411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_S64 ts_in_sei = h264_parser->process_ts_with_sei_vui(pdest_frame->nTimeStamp);
944511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!VALID_TS(pdest_frame->nTimeStamp))
944611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = ts_in_sei;
944711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
944811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
944911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Push the frame to the Decoder*/
945011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp,pdest_frame) != OMX_ErrorNone) {
945111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
945211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
945311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
945411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
945511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
945611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
945711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
945811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
945911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
946011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
946111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
946211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (generate_ebd && !psource_frame->nFilledLen) {
946311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp,m_app_data,psource_frame);
946411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = NULL;
946511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pending_q.m_size) {
946611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Pull Next source Buffer %p",psource_frame);
946711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&address,&p2,&id);
946811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = (OMX_BUFFERHEADERTYPE *) address;
946911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Next source Buffer flag %u src length %u",
947011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen);
947111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
947211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
947311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
947411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
947511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
947611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE copy_buffer(OMX_BUFFERHEADERTYPE* pDst, OMX_BUFFERHEADERTYPE* pSrc)
947711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
947811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE rc = OMX_ErrorNone;
947911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((pDst->nAllocLen - pDst->nFilledLen) >= pSrc->nFilledLen) {
948011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy((pDst->pBuffer + pDst->nFilledLen), pSrc->pBuffer, pSrc->nFilledLen);
948111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pDst->nTimeStamp == LLONG_MAX) {
948211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pDst->nTimeStamp = pSrc->nTimeStamp;
948311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Assign Dst nTimeStamp = %lld", pDst->nTimeStamp);
948411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
948511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pDst->nFilledLen += pSrc->nFilledLen;
948611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pSrc->nFilledLen = 0;
948711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
948811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Destination buffer overflow");
948911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = OMX_ErrorBadParameter;
949011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
949111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
949211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
949311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
949411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_hevc(OMX_HANDLETYPE hComp)
949511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
949611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
949711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long address,p2,id;
949811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL isNewFrame = OMX_FALSE;
949911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL generate_ebd = OMX_TRUE;
950011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE rc = OMX_ErrorNone;
950111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.pBuffer == NULL) {
950211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Hevc Scratch Buffer not allocated");
950311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
950411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
950511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
950611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("h264_scratch.nFilledLen %u has look_ahead_nal %d \
950711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest_frame nFilledLen %u nTimeStamp %lld",
950811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)h264_scratch.nFilledLen, look_ahead_nal, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
950911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
951011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (h264_scratch.nFilledLen && look_ahead_nal) {
951111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        look_ahead_nal = false;
951211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = copy_buffer(pdest_frame, &h264_scratch);
951311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc != OMX_ErrorNone) {
951411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc;
951511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
951611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
951711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
951811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nal_length == 0) {
951911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_sc_frame(psource_frame,
952011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
952111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing Return Error");
952211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
952311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
952411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
952511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Non-zero NAL length clip, hence parse with NAL size %d",nal_length);
952611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_frame_parser.parse_h264_nallength(psource_frame,
952711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &h264_scratch,&partial_frame) == -1) {
952811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error In Parsing NAL size, Return Error");
952911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
953011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
953111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
953211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
953311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (partial_frame == 0) {
953411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nal_count == 0 && h264_scratch.nFilledLen == 0) {
953511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("First NAL with Zero Length, hence Skip");
953611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nal_count++;
953711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nTimeStamp = psource_frame->nTimeStamp;
953811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            h264_scratch.nFlags = psource_frame->nFlags;
953911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
954011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Parsed New NAL Length = %u", (unsigned int)h264_scratch.nFilledLen);
954111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (h264_scratch.nFilledLen) {
954211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_hevc_utils.isNewFrame(&h264_scratch, 0, isNewFrame);
954311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_count++;
954411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
954511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
954611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!isNewFrame) {
954711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Not a new frame, copy h264_scratch nFilledLen %u \
954811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        nTimestamp %lld, pdest_frame nFilledLen %u nTimestamp %lld",
954911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp,
955011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
955111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = copy_buffer(pdest_frame, &h264_scratch);
955211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (rc != OMX_ErrorNone) {
955311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return rc;
955411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
955511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
955611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                look_ahead_nal = true;
955711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pdest_frame->nFilledLen == 0) {
955811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    look_ahead_nal = false;
955911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("dest nation buffer empty, copy scratch buffer");
956011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc = copy_buffer(pdest_frame, &h264_scratch);
956111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (rc != OMX_ErrorNone) {
956211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
956311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
956411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
956511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (psource_frame->nFilledLen || h264_scratch.nFilledLen) {
956611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags &= ~OMX_BUFFERFLAG_EOS;
956711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
956811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("FrameDetected # %d pdest_frame nFilledLen %u \
956911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            nTimeStamp %lld, look_ahead_nal in h264_scratch \
957011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            nFilledLen %u nTimeStamp %lld",
957111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            frame_count++, (unsigned int)pdest_frame->nFilledLen,
957211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pdest_frame->nTimeStamp, (unsigned int)h264_scratch.nFilledLen,
957311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            h264_scratch.nTimeStamp);
957411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
957511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorBadParameter;
957611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
957711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame = NULL;
957811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_input_free_q.m_size) {
957911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_input_free_q.pop_entry(&address, &p2, &id);
958011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame = (OMX_BUFFERHEADERTYPE *) address;
958111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("pop the next pdest_buffer %p", pdest_frame);
958211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFilledLen = 0;
958311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nFlags = 0;
958411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame->nTimeStamp = LLONG_MAX;
958511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
958611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
958711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
958811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
958911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
959011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("psource_frame is partial nFilledLen %u nTimeStamp %lld, \
959111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame nFilledLen %u nTimeStamp %lld, h264_scratch \
959211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nFilledLen %u nTimeStamp %lld",
959311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp,
959411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp,
959511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)h264_scratch.nFilledLen, h264_scratch.nTimeStamp);
959611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
959711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (h264_scratch.nAllocLen ==
959811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                h264_scratch.nFilledLen + h264_scratch.nOffset) {
959911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Frame Not found though Destination Filled");
960011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorStreamCorrupt;
960111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
960211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
960311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
960411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!psource_frame->nFilledLen) {
960511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Buffer Consumed return source %p back to client", psource_frame);
960611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (psource_frame->nFlags & OMX_BUFFERFLAG_EOS) {
960711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pdest_frame) {
960811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("EOS Reached Pass Last Buffer");
960911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc = copy_buffer(pdest_frame, &h264_scratch);
961011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( rc != OMX_ErrorNone ) {
961111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return rc;
961211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
961311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nTimeStamp = h264_scratch.nTimeStamp;
961411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFlags = h264_scratch.nFlags | psource_frame->nFlags;
961511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Push EOS frame number:%d nFilledLen =%u TimeStamp = %lld",
961611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        frame_count, (unsigned int)pdest_frame->nFilledLen, pdest_frame->nTimeStamp);
961711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_this_buffer_proxy(hComp, pdest_frame) != OMX_ErrorNone) {
961811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadParameter;
961911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
962011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                frame_count++;
962111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame = NULL;
962211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
962311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Last frame in else dest addr %p size %u",
962411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pdest_frame, (unsigned int)h264_scratch.nFilledLen);
962511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                generate_ebd = OMX_FALSE;
962611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
962711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
962811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
962911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
963011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (generate_ebd && !psource_frame->nFilledLen) {
963111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_cb.EmptyBufferDone (hComp, m_app_data, psource_frame);
963211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        psource_frame = NULL;
963311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_input_pending_q.m_size) {
963411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_input_pending_q.pop_entry(&address, &p2, &id);
963511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            psource_frame = (OMX_BUFFERHEADERTYPE *)address;
963611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Next source Buffer flag %u nFilledLen %u, nTimeStamp %lld",
963711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)psource_frame->nFlags, (unsigned int)psource_frame->nFilledLen, psource_frame->nTimeStamp);
963811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
963911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
964011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
964111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
964211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
964311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::push_input_vc1(OMX_HANDLETYPE hComp)
964411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
964511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buf, *pdest;
964611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 partial_frame = 1;
964711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 buf_len, dest_len;
964811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
964911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (first_frame == 0) {
965011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        first_frame = 1;
965111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("First i/p buffer for VC1 arbitrary bytes");
965211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_vendor_config.pData) {
965311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Check profile type in 1st source buffer");
965411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf = psource_frame->pBuffer;
965511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf_len = psource_frame->nFilledLen;
965611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
965711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((*((OMX_U32 *) buf) & VC1_SP_MP_START_CODE_MASK) ==
965811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VC1_SP_MP_START_CODE) {
965911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_vc1_profile = VC1_SP_MP_RCV;
966011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (*((OMX_U32 *) buf) & VC1_AP_SEQ_START_CODE) {
966111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_vc1_profile = VC1_AP;
966211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
966311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Invalid sequence layer in first buffer");
966411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorStreamCorrupt;
966511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
966611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
966711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pdest = pdest_frame->pBuffer + pdest_frame->nFilledLen +
966811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nOffset;
966911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_len = pdest_frame->nAllocLen - (pdest_frame->nFilledLen +
967011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pdest_frame->nOffset);
967111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
967211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dest_len < m_vendor_config.nDataSize) {
967311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Destination buffer full");
967411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
967511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
967611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy(pdest, m_vendor_config.pData, m_vendor_config.nDataSize);
967711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pdest_frame->nFilledLen += m_vendor_config.nDataSize;
967811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
967911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
968011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
968111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
968211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (m_vc1_profile) {
968311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VC1_AP:
968411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VC1 AP, hence parse using frame start code");
968511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (push_input_sc_codec(hComp) != OMX_ErrorNone) {
968611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Error In Parsing VC1 AP start code");
968711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
968811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
968911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
969011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
969111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case VC1_SP_MP_RCV:
969211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
969311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported VC1 profile in ArbitraryBytes Mode");
969411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
969511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
969611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
969711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
969811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
969911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef USE_ION
970011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
970111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 alignment)
970211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
970311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem_allocation allocation;
970411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocation.size = buffer_size;
970511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocation.align = clip2(alignment);
970611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocation.align < 4096) {
970711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocation.align = 4096;
970811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
970911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
971011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
971111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                allocation.align, allocation.size);
971211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
971311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
971411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
971511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
971611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
971711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
971811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::alloc_map_ion_memory(OMX_U32 buffer_size,
971911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 alignment, struct ion_allocation_data *alloc_data,
972011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_fd_data *fd_data, int flag)
972111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
972211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fd = -EINVAL;
972311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = -EINVAL;
972411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_dev_flag;
972511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion ion_buf_info;
972611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!alloc_data || buffer_size <= 0 || !fd_data) {
972711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid arguments to alloc_map_ion_memory");
972811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -EINVAL;
972911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
973011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ion_dev_flag = O_RDONLY;
973111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd = open (MEM_DEVICE, ion_dev_flag);
973211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
973311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("opening ion device failed with fd = %d", fd);
973411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return fd;
973511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
973611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
973711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->flags = flag;
973811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->len = buffer_size;
973911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->align = clip2(alignment);
974011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (alloc_data->align < 4096) {
974111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->align = 4096;
974211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
974311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
974411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
974511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (secure_mode && (alloc_data->flags & ION_SECURE)) {
974611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID);
974711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
974811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
974911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Use secure display cma heap for obvious reasons. */
975011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) {
975111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID);
975211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
975311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
975411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(fd,ION_IOC_ALLOC,alloc_data);
975511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc || !alloc_data->handle) {
975611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION ALLOC memory failed");
975711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        alloc_data->handle = 0;
975811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(fd);
975911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = -ENOMEM;
976011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return fd;
976111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
976211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fd_data->handle = alloc_data->handle;
976311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(fd,ION_IOC_MAP,fd_data);
976411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
976511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION MAP failed ");
976611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.ion_alloc_data = *alloc_data;
976711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.ion_device_fd = fd;
976811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_buf_info.fd_ion_data = *fd_data;
976911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free_ion_memory(&ion_buf_info);
977011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd_data->fd =-1;
977111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fd = -ENOMEM;
977211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
977311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
977411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return fd;
977511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
977611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
977711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_ion_memory(struct vdec_ion *buf_ion_info)
977811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
977911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
978011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buf_ion_info) {
978111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION: free called with invalid fd/allocdata");
978211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
978311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
978411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE,
978511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &buf_ion_info->ion_alloc_data.handle)) {
978611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ION: free failed" );
978711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
978811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    close(buf_ion_info->ion_device_fd);
978911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->ion_device_fd = -1;
979011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->ion_alloc_data.handle = 0;
979111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ion_info->fd_ion_data.fd = -1;
979211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
979311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
979411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_output_buffer_header()
979511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
979611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ALL output buffers are freed/released");
979711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_use_buffer = false;
979811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ouput_egl_buffers = false;
979911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
980011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr) {
980111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (m_out_mem_ptr);
980211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = NULL;
980311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
980411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
980511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_platform_list) {
980611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_platform_list);
980711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_platform_list = NULL;
980811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
980911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
981011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_respbuffer) {
981111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_respbuffer);
981211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = NULL;
981311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
981411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_outputbuffer) {
981511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_outputbuffer);
981611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = NULL;
981711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
981811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
981911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.op_buf_ion_info) {
982011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free o/p ion context");
982111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(drv_ctx.op_buf_ion_info);
982211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = NULL;
982311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
982411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
982511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_ref_remove();
982611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
982711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
982811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::free_input_buffer_header()
982911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
983011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_use_buffer = false;
983111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (arbitrary_bytes) {
983211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_inp_heap_ptr) {
983311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free input Heap Pointer");
983411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free (m_inp_heap_ptr);
983511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_inp_heap_ptr = NULL;
983611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
983711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
983811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_phdr_pmem_ptr) {
983911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Free input pmem header Pointer");
984011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free (m_phdr_pmem_ptr);
984111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_phdr_pmem_ptr = NULL;
984211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
984311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
984411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_inp_mem_ptr) {
984511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free input pmem Pointer area");
984611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (m_inp_mem_ptr);
984711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = NULL;
984811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
984911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* We just freed all the buffer headers, every thing in m_input_free_q,
985011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * m_input_pending_q, pdest_frame, and psource_frame is now invalid */
985111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_input_free_q.m_size) {
985211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long address, p2, id;
985311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_input_free_q.pop_entry(&address, &p2, &id);
985411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
985511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_input_pending_q.m_size) {
985611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long address, p2, id;
985711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_input_pending_q.pop_entry(&address, &p2, &id);
985811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
985911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pdest_frame = NULL;
986011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    psource_frame = NULL;
986111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_inputbuffer) {
986211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free Driver Context pointer");
986311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free (drv_ctx.ptr_inputbuffer);
986411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_inputbuffer = NULL;
986511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
986611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
986711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ip_buf_ion_info) {
986811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Free ion context");
986911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(drv_ctx.ip_buf_ion_info);
987011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ip_buf_ion_info = NULL;
987111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
987211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
987311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
987411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
987511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_vdec::stream_off(OMX_U32 port)
987611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
987711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_buf_type btype;
987811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
987911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_ports v4l2_port = OUTPUT_PORT;
988011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
988111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == OMX_CORE_INPUT_PORT_INDEX) {
988211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
988311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        v4l2_port = OUTPUT_PORT;
988411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_CORE_OUTPUT_PORT_INDEX) {
988511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
988611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        v4l2_port = CAPTURE_PORT;
988711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == OMX_ALL) {
988811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc_input = stream_off(OMX_CORE_INPUT_PORT_INDEX);
988911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc_output = stream_off(OMX_CORE_OUTPUT_PORT_INDEX);
989011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
989111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc_input)
989211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc_input;
989311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
989411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return rc_output;
989511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
989611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
989711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[v4l2_port]) {
989811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // already streamed off, warn and move on
989911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Warning: Attempting to stream off on %d port,"
990011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " which is already streamed off", v4l2_port);
990111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
990211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
990311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
990411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Streaming off %d port", v4l2_port);
990511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
990611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
990711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
990811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
990911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to call streamoff on %d Port", v4l2_port);
991011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
991111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[v4l2_port] = false;
991211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
991311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
991411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
991511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
991611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
991711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::get_buffer_req(vdec_allocatorproperty *buffer_prop)
991811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
991911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
992011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
992111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int buf_size = 0, extra_data_size = 0, default_extra_data_size = 0;
992211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int final_extra_data_size = 0;
992311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
992411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = 0;
992511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
992611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
992711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
992811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = 1;
992911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
993011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
993111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
993211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
993311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
993411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
993511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
993611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
993711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
993811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
993911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
994011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet==OMX_ErrorNone) {
994111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
994211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
994311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
994411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
994511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
994611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
994711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
994811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
994911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_res_1080p_or_below = (drv_ctx.video_resolution.frame_width <= 1920 &&
995011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     drv_ctx.video_resolution.frame_height <= 1088) ||
995111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     (drv_ctx.video_resolution.frame_height <= 1088 &&
995211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      drv_ctx.video_resolution.frame_width <= 1920);
995311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
995411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int fps = drv_ctx.frame_rate.fps_numerator / (float)drv_ctx.frame_rate.fps_denominator;
995511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool fps_above_180 =  (fps >= 180 || operating_frame_rate >= 180) ? true : false;
995611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool increase_output = (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) && (bufreq.count >= 16);
995711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
995811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (increase_output && fps_above_180 &&
995911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            output_capability == V4L2_PIX_FMT_H264 &&
996011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            is_res_1080p_or_below) {
996111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            high_fps = true;
996211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("High fps - fps = %d operating_rate = %d", fps, operating_frame_rate);
996311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("getbufreq[output]: Increase buffer count (%d) to (%d) to support high fps",
996411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            bufreq.count, bufreq.count + 10);
996511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count += 10;
996611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
996711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
996811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("(Failed to set updated buffer count to driver");
996911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
997011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return eRet;
997111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
997211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("new buf count = %d set to driver", bufreq.count);
997311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            request_perf_level(VIDC_TURBO);
997411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
997511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
997611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->actualcount = bufreq.count;
997711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->mincount = bufreq.count;
997811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Count = %d",bufreq.count);
997911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
998011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq IN: ActCnt(%d) Size(%u)",
998111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
998211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
998311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
998411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
998511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
998611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.num_planes = fmt.fmt.pix_mp.num_planes;
998711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Buffer Size = %d",fmt.fmt.pix_mp.plane_fmt[0].sizeimage);
998811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
998911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
999011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*TODO: How to handle this case */
999111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requesting buffer requirements failed");
999211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInsufficientResources;
999311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
999411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int extra_idx = 0;
999511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
999611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = is_video_session_supported();
999711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet)
999811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return eRet;
999911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1000011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_prop->buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
1000111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = buffer_prop->buffer_size;
1000211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
1000311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
1000411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
1000511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (extra_idx >= VIDEO_MAX_PLANES) {
1000611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
1000711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
1000811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1000911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1001011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default_extra_data_size = VENUS_EXTRADATA_SIZE(
1001111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_height,
1001211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.video_resolution.frame_width);
1001311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        final_extra_data_size = extra_data_size > default_extra_data_size ?
1001411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size : default_extra_data_size;
1001511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1001611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        final_extra_data_size = (final_extra_data_size + buffer_prop->alignment - 1) &
1001711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (~(buffer_prop->alignment - 1));
1001811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1001911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.size = buffer_prop->actualcount * final_extra_data_size;
1002011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.count = buffer_prop->actualcount;
1002111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.extradata_info.buffer_size = final_extra_data_size;
1002211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
1002311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("GetBufReq UPDATE: ActCnt(%d) Size(%u) BufSize(%d)",
1002411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size, buf_size);
1002511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_data_size)
1002611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("GetBufReq UPDATE: extradata: TotalSize(%d) BufferSize(%lu)",
1002711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.extradata_info.size, drv_ctx.extradata_info.buffer_size);
1002811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1002911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (in_reconfig) // BufReq will be set to driver when port is disabled
1003011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->buffer_size = buf_size;
1003111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if (buf_size != buffer_prop->buffer_size) {
1003211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->buffer_size = buf_size;
1003311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = set_buffer_req(buffer_prop);
1003411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1003511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1003611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("GetBufReq OUT: ActCnt(%d) Size(%u)",
1003711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1003811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1003911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1004011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1004111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::set_buffer_req(vdec_allocatorproperty *buffer_prop)
1004211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1004311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1004411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned buf_size = 0;
100452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_format fmt, c_fmt;
1004611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
100472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    int ret = 0;
1004811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SetBufReq IN: ActCnt(%d) Size(%u)",
1004911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_prop->actualcount, (unsigned int)buffer_prop->buffer_size);
1005011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_size = (buffer_prop->buffer_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
1005111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buf_size != buffer_prop->buffer_size) {
1005211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer size alignment error: Requested(%u) Required(%d)",
1005311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)buffer_prop->buffer_size, buf_size);
1005411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadParameter;
1005511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1005611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0x0, sizeof(struct v4l2_format));
100572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        memset(&c_fmt, 0x0, sizeof(struct v4l2_format));
1005811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1005911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1006011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
1006111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1006211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1006311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fmt.type =V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1006411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fmt.fmt.pix_mp.pixelformat = output_capability;
100652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1006611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
100672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.type =V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
100682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.fmt.pix_mp.pixelformat = capture_capability;
100692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &c_fmt);
100702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            c_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = buf_size;
100712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &c_fmt);
1007211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1007311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
1007411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1007511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1007611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
1007711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
1007811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting buffer requirements (format) failed %d", ret);
1007911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1008011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1008111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1008211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
1008311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.count = buffer_prop->actualcount;
1008411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_INPUT) {
1008511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1008611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (buffer_prop->buffer_type == VDEC_BUFFER_TYPE_OUTPUT) {
1008711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1008811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1008911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorBadParameter;
1009011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1009111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1009211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eRet==OMX_ErrorNone) {
1009311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(drv_ctx.video_driver_fd,VIDIOC_REQBUFS, &bufreq);
1009411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1009511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1009611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
1009711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Setting buffer requirements (reqbufs) failed %d", ret);
1009811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*TODO: How to handle this case */
1009911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1010011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (bufreq.count < buffer_prop->actualcount) {
1010111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Driver refused to change the number of buffers"
1010211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    " on v4l2 port %d to %d (prefers %d)", bufreq.type,
1010311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buffer_prop->actualcount, bufreq.count);
1010411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
1010511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1010611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!client_buffers.update_buffer_req()) {
1010711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Setting c2D buffer requirements failed");
1010811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInsufficientResources;
1010911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1011011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1011111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1011211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1011311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1011411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1011511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_picture_resolution()
1011611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1011711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1011811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1011911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1012011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1012111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn)
1012211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1012311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1012411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
1012511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!portDefn) {
1012611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1012711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1012811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("omx_vdec::update_portdef");
1012911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
1013011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1013111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn->eDomain    = OMX_PortDomainVideo;
1013211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
1013311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (0 == portDefn->nPortIndex) {
1013411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir =  OMX_DirInput;
1013511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountActual = drv_ctx.ip_buf.actualcount;
1013611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountMin    = drv_ctx.ip_buf.mincount;
1013711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferSize        = drv_ctx.ip_buf.buffer_size;
1013811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eColorFormat = OMX_COLOR_FormatUnused;
1013911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eCompressionFormat = eCompressionFormat;
10140fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        //for input port, always report the fps value set by client,
10141fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        //to distinguish whether client got valid fps from parser.
10142fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        portDefn->format.video.xFramerate = m_fps_received;
1014311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bEnabled   = m_inp_bEnabled;
1014411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bPopulated = m_inp_bPopulated;
1014511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1014611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1014711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = output_capability;
101482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1014911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (1 == portDefn->nPortIndex) {
1015011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int buf_size = 0;
1015111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret = 0;
101522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel       if (!is_down_scalar_enabled) {
101532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
101542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
101552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.fmt.pix_mp.pixelformat = capture_capability;
101562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
101572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel           ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
101582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel       }
101592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1016011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1016111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       fmt.fmt.pix_mp.pixelformat = capture_capability;
1016211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
1016311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (ret) {
1016411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Get Resolution failed");
1016511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           return OMX_ErrorHardware;
1016611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1016711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       drv_ctx.op_buf.buffer_size = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
1016811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (!client_buffers.update_buffer_req()) {
1016911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("client_buffers.update_buffer_req Failed");
1017011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           return OMX_ErrorHardware;
1017111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1017211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1017311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.get_buffer_req(buf_size)) {
1017411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("update buffer requirements");
1017511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
1017611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1017711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferSize = buf_size;
1017811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir =  OMX_DirOutput;
1017911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountActual = drv_ctx.op_buf.actualcount;
1018011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->nBufferCountMin    = drv_ctx.op_buf.mincount;
1018111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
10182fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (drv_ctx.frame_rate.fps_denominator > 0)
10183fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator /
10184fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format
10185fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        else {
10186fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            DEBUG_PRINT_ERROR("Error: Divide by zero");
10187fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            return OMX_ErrorBadParameter;
10188fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
1018911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bEnabled   = m_out_bEnabled;
1019011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->bPopulated = m_out_bPopulated;
1019111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!client_buffers.get_color_format(portDefn->format.video.eColorFormat)) {
1019211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error in getting color format");
1019311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorHardware;
1019411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1019511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1019611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = capture_capability;
1019711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1019811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->eDir = OMX_DirMax;
1019911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW(" get_parameter: Bad Port idx %d",
1020011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (int)portDefn->nPortIndex);
1020111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorBadPortIndex;
1020211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
102032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    update_resolution(fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
102042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        fmt.fmt.pix_mp.plane_fmt[0].bytesperline, fmt.fmt.pix_mp.plane_fmt[0].reserved[0]);
102052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1020611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nFrameHeight =  drv_ctx.video_resolution.frame_height;
1020711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nFrameWidth  =  drv_ctx.video_resolution.frame_width;
1020811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nStride = drv_ctx.video_resolution.stride;
1020911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.scan_lines;
1021011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1021111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420Planar) ||
1021211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       (portDefn->format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)) {
1021311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           portDefn->format.video.nStride = ALIGN(drv_ctx.video_resolution.frame_width, 16);
1021411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           portDefn->format.video.nSliceHeight = drv_ctx.video_resolution.frame_height;
1021511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1021611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("update_portdef(%u): Width = %u Height = %u Stride = %d "
1021711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "SliceHeight = %u eColorFormat = %d nBufSize %u nBufCnt %u",
1021811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nPortIndex,
1021911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameWidth,
1022011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameHeight,
1022111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (int)portDefn->format.video.nStride,
1022211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nSliceHeight,
1022311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.eColorFormat,
1022411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nBufferSize,
1022511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->nBufferCountActual);
1022611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1022711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1022811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1022911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1023011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_output_headers()
1023111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1023211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1023311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *bufHdr = NULL;
1023411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned i= 0;
1023511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1023611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_out_mem_ptr) {
1023711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Use o/p buffer case - Header List allocation");
1023811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nBufHdrSize        = 0;
1023911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformEntrySize = 0;
1024011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPlatformListSize  = 0;
1024111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int nPMEMInfoSize = 0;
1024211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_LIST      *pPlatformList;
1024311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *pPlatformEntry;
1024411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo;
1024511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1024611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Setting First Output Buffer(%d)",
1024711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf.actualcount);
1024811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBufHdrSize        = drv_ctx.op_buf.actualcount *
1024911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_BUFFERHEADERTYPE);
1025011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1025111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPMEMInfoSize      = drv_ctx.op_buf.actualcount *
1025211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO);
1025311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformListSize  = drv_ctx.op_buf.actualcount *
1025411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_LIST);
1025511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nPlatformEntrySize = drv_ctx.op_buf.actualcount *
1025611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_PLATFORM_PRIVATE_ENTRY);
1025711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1025811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("TotalBufHdr %d BufHdrSize %u PMEM %d PL %d",nBufHdrSize,
1025911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)sizeof(OMX_BUFFERHEADERTYPE),
1026011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,
1026111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPlatformListSize);
1026211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("PE %d bmSize % " PRId64 , nPlatformEntrySize,
1026311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_bm_count);
1026411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = (OMX_BUFFERHEADERTYPE  *)calloc(nBufHdrSize,1);
1026511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Alloc mem for platform specific info
1026611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        char *pPtr=NULL;
1026711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pPtr = (char*) calloc(nPlatformListSize + nPlatformEntrySize +
1026811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nPMEMInfoSize,1);
1026911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_outputbuffer = (struct vdec_bufferpayload *) \
1027011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       calloc (sizeof(struct vdec_bufferpayload),
1027111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               drv_ctx.op_buf.actualcount);
1027211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.ptr_respbuffer = (struct vdec_output_frameinfo  *)\
1027311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     calloc (sizeof (struct vdec_output_frameinfo),
1027411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             drv_ctx.op_buf.actualcount);
1027511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.ptr_outputbuffer || !drv_ctx.ptr_respbuffer) {
1027611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.ptr_outputbuffer or drv_ctx.ptr_respbuffer");
1027711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1027811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1027911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1028011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1028111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.op_buf_ion_info = (struct vdec_ion * ) \
1028211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      calloc (sizeof(struct vdec_ion),drv_ctx.op_buf.actualcount);
1028311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!drv_ctx.op_buf_ion_info) {
1028411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc drv_ctx.op_buf_ion_info");
1028511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1028611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1028711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1028811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (dynamic_buf_mode) {
1028911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            out_dynamic_list = (struct dynamic_buf_list *) \
1029011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                calloc (sizeof(struct dynamic_buf_list), drv_ctx.op_buf.actualcount);
1029111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (out_dynamic_list) {
1029211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               for (unsigned int i = 0; i < drv_ctx.op_buf.actualcount; i++)
1029311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  out_dynamic_list[i].dup_fd = -1;
1029411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1029511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1029611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1029711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_out_mem_ptr && pPtr && drv_ctx.ptr_outputbuffer
1029811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && drv_ctx.ptr_respbuffer) {
1029911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufHdr          =  m_out_mem_ptr;
1030011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_list = (OMX_QCOM_PLATFORM_PRIVATE_LIST *)(pPtr);
1030111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_platform_entry= (OMX_QCOM_PLATFORM_PRIVATE_ENTRY *)
1030211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_list)  + nPlatformListSize);
1030311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_pmem_info     = (OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *)
1030411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (((char *) m_platform_entry) + nPlatformEntrySize);
1030511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformList   = m_platform_list;
1030611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPlatformEntry  = m_platform_entry;
1030711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pPMEMInfo       = m_pmem_info;
1030811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1030911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr);
1031011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1031111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Settting the entire storage nicely
1031211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bHdr %p OutMem %p PE %p",bufHdr,
1031311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr,pPlatformEntry);
1031411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Pmem Info = %p",pPMEMInfo);
1031511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i=0; i < drv_ctx.op_buf.actualcount ; i++) {
1031611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
1031711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nVersion.nVersion  = OMX_SPEC_VERSION;
1031811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Set the values when we determine the right HxW param
1031911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nAllocLen          = 0;
1032011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nFilledLen         = 0;
1032111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pAppPrivate        = NULL;
1032211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->nOutputPortIndex   = OMX_CORE_OUTPUT_PORT_INDEX;
1032311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->type       = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1032411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry->entry      = pPMEMInfo;
1032511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Initialize the Platform List
1032611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->nEntries    = 1;
1032711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList->entryList   = pPlatformEntry;
1032811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Keep pBuffer NULL till vdec is opened
1032911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pBuffer            = NULL;
1033011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->offset          =  0;
1033111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo->pmem_fd = -1;
1033211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pPlatformPrivate = pPlatformList;
1033311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer[i].pmem_fd = -1;
1033411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1033511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info[i].ion_device_fd =-1;
1033611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1033711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*Create a mapping between buffers*/
1033811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr->pOutputPortPrivate = &drv_ctx.ptr_respbuffer[i];
1033911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer[i].client_data = (void *) \
1034011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    &drv_ctx.ptr_outputbuffer[i];
1034111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Move the buffer and buffer header pointers
1034211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufHdr++;
1034311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPMEMInfo++;
1034411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformEntry++;
1034511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPlatformList++;
1034611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1034711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1034811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Output buf mem alloc failed[0x%p][0x%p]",\
1034911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_out_mem_ptr, pPtr);
1035011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_out_mem_ptr) {
1035111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(m_out_mem_ptr);
1035211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr = NULL;
1035311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1035411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pPtr) {
1035511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(pPtr);
1035611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pPtr = NULL;
1035711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1035811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_outputbuffer) {
1035911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_outputbuffer);
1036011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_outputbuffer = NULL;
1036111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1036211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.ptr_respbuffer) {
1036311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.ptr_respbuffer);
1036411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.ptr_respbuffer = NULL;
1036511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1036611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1036711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.op_buf_ion_info) {
1036811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Free o/p ion context");
1036911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                free(drv_ctx.op_buf_ion_info);
1037011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.op_buf_ion_info = NULL;
1037111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1037211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1037311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet =  OMX_ErrorInsufficientResources;
1037411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1037511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1037611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet =  OMX_ErrorInsufficientResources;
1037711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1037811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1037911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1038011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1038111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::complete_pending_buffer_done_cbs()
1038211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1038311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long p1, p2, ident;
1038411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue tmp_q, pending_bd_q;
1038511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1038611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pop all pending GENERATE FDB from ftb queue
1038711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_ftb_q.m_size) {
1038811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.pop_entry(&p1,&p2,&ident);
1038911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_FBD) {
1039011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_bd_q.insert_entry(p1,p2,ident);
1039111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1039211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            tmp_q.insert_entry(p1,p2,ident);
1039311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1039411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1039511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return all non GENERATE FDB to ftb queue
1039611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (tmp_q.m_size) {
1039711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tmp_q.pop_entry(&p1,&p2,&ident);
1039811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_ftb_q.insert_entry(p1,p2,ident);
1039911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1040011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pop all pending GENERATE EDB from etb queue
1040111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (m_etb_q.m_size) {
1040211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.pop_entry(&p1,&p2,&ident);
1040311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ident == OMX_COMPONENT_GENERATE_EBD) {
1040411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pending_bd_q.insert_entry(p1,p2,ident);
1040511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1040611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            tmp_q.insert_entry(p1,p2,ident);
1040711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1040811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1040911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return all non GENERATE FDB to etb queue
1041011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (tmp_q.m_size) {
1041111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        tmp_q.pop_entry(&p1,&p2,&ident);
1041211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_etb_q.insert_entry(p1,p2,ident);
1041311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1041411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
1041511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // process all pending buffer dones
1041611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (pending_bd_q.m_size) {
1041711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pending_bd_q.pop_entry(&p1,&p2,&ident);
1041811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (ident) {
1041911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_EBD:
1042011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) {
1042111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!");
1042211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
1042311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1042411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1042511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1042611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_COMPONENT_GENERATE_FBD:
1042711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) {
1042811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!");
1042911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_error ();
1043011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1043111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1043211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1043311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1043411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1043511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1043611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::set_frame_rate(OMX_S64 act_timestamp)
1043711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1043811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 new_frame_interval = 0;
1043911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (VALID_TS(act_timestamp) && VALID_TS(prev_ts) && act_timestamp != prev_ts
1044011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            && llabs(act_timestamp - prev_ts) > 2000) {
1044111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        new_frame_interval = client_set_fps ? frm_int : (act_timestamp - prev_ts) > 0 ?
1044211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            llabs(act_timestamp - prev_ts) : llabs(act_timestamp - prev_ts_actual);
1044311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (new_frame_interval != frm_int || frm_int == 0) {
1044411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frm_int = new_frame_interval;
1044511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (frm_int) {
1044611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.frame_rate.fps_numerator = 1e6;
1044711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                drv_ctx.frame_rate.fps_denominator = frm_int;
1044811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set_frame_rate: frm_int(%u) fps(%f)",
1044911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator /
1045011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (float)drv_ctx.frame_rate.fps_denominator);
1045111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_perf_control.request_cores(frm_int);
1045211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* We need to report the difference between this FBD and the previous FBD
1045311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * back to the driver for clock scaling purposes. */
1045411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_outputparm oparm;
1045511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /*XXX: we're providing timing info as seconds per frame rather than frames
1045611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * per second.*/
1045711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator;
1045811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator;
1045911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1046011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_streamparm sparm;
1046111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1046211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                sparm.parm.output = oparm;
1046311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) {
1046411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Unable to convey fps info to driver, \
1046511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            performance might be affected");
1046611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1046711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1046811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1046911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1047011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1047111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prev_ts = act_timestamp;
1047211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1047311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1047411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
1047511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1047611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rst_prev_ts && VALID_TS(act_timestamp)) {
1047711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts = act_timestamp;
1047811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prev_ts_actual = act_timestamp;
1047911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = false;
1048011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (VALID_TS(prev_ts)) {
1048111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool codec_cond = (drv_ctx.timestamp_adjust)?
1048211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!VALID_TS(act_timestamp) || act_timestamp < prev_ts_actual || llabs(act_timestamp - prev_ts_actual) <= 2000) :
1048311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (!VALID_TS(act_timestamp) || act_timestamp <= prev_ts_actual);
1048411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             prev_ts_actual = act_timestamp; //unadjusted previous timestamp
1048511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (frm_int > 0 && codec_cond) {
1048611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("adjust_timestamp: original ts[%lld]", act_timestamp);
1048711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            act_timestamp = prev_ts + frm_int;
1048811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("adjust_timestamp: predicted ts[%lld]", act_timestamp);
1048911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            prev_ts = act_timestamp;
1049011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1049111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (drv_ctx.picture_order == VDEC_ORDER_DISPLAY && act_timestamp < prev_ts) {
1049211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // ensure that timestamps can never step backwards when in display order
1049311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                act_timestamp = prev_ts;
1049411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1049511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            set_frame_rate(act_timestamp);
1049611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1049711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (frm_int > 0)          // In this case the frame rate was set along
1049811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {                               // with the port definition, start ts with 0
1049911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        act_timestamp = prev_ts = 0;  // and correct if a valid ts is received.
1050011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rst_prev_ts = true;
1050111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1050211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1050311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1050411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::get_omx_output_buffer_header(int index)
1050511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1050611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_out_mem_ptr + index;
1050711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1050811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10509fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
10510fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, ColorAspects *aspects)
10511fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
10512fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (primaries) {
10513fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT709_5:
10514fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            *color_space = ITU_R_709;
10515fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT709_5;
10516fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10517fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT470_6_M:
10518fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT470_6M;
10519fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10520fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT601_6_625:
10521fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10522fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10523fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT601_6_525:
10524fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            *color_space = range ? ITU_R_601_FR : ITU_R_601;
10525fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT601_6_525;
10526fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10527fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_GENERIC_FILM:
10528fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesGenericFilm;
10529fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10530fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_BT2020:
10531fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10532fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10533fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_UNSPECIFIED:
10534fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //Client does not expect ColorAspects::PrimariesUnspecified, but rather the supplied default
10535fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10536fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mPrimaries = ColorAspects::PrimariesOther;
10537fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10538fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10539fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10540fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10541fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    aspects->mRange = range ? ColorAspects::RangeFull : ColorAspects::RangeLimited;
10542fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10543fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (transfer) {
10544fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT709_5:
10545fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_601_6_525: // case MSM_VIDC_TRANSFER_601_6_625:
10546fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10547fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10548fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_470_6_M:
10549fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferGamma22;
10550fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10551fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_470_6_BG:
10552fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferGamma28;
10553fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10554fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_SMPTE_240M:
10555fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10556fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10557fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_LINEAR:
10558fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferLinear;
10559fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10560fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_IEC_61966:
10561fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferXvYCC;
10562fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10563fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_BT_1361:
10564fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferBT1361;
10565fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10566fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_TRANSFER_SRGB:
10567fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = ColorAspects::TransferSRGB;
10568fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10569fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10570fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mTransfer = ColorAspects::TransferOther;
10571fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mTransfer = m_client_color_space.sAspects.mTransfer;
10572fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10573fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10574fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10575fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (matrix) {
10576fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_709_5:
10577fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10578fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10579fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_FCC_47:
10580fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT470_6M;
10581fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10582fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_601_6_625:
10583fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_601_6_525:
10584fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10585fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10586fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_SMPTE_240M:
10587fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixSMPTE240M;
10588fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10589fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_2020:
10590fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10591fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10592fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case MSM_VIDC_MATRIX_BT_2020_CONST:
10593fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020Constant;
10594fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10595fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10596fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            //aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10597fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10598fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10599fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10600fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10601fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10602fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) {
10603fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d",
10604fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs);
10605fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10606fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10607fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_color_space_info(void *data, unsigned int buf_index)
10608fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
10609fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorSpace_t color_space = ITU_R_601;
10610fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorAspects tempAspects;
10611fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&tempAspects, 0x0, sizeof(ColorAspects));
10612fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    ColorAspects *aspects = &tempAspects;
10613fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10614fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch(output_capability) {
10615fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_MPEG2:
10616fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10617fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_mpeg2_seqdisp_payload *seqdisp_payload;
10618fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                seqdisp_payload = (struct msm_vidc_mpeg2_seqdisp_payload *)data;
10619fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10620fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer MPEG2 Spec @ Rec. ISO/IEC 13818-2, ITU-T Draft Rec. H.262 to
10621fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * understand this code */
10622fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10623fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (seqdisp_payload && seqdisp_payload->color_descp) {
10624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(seqdisp_payload->color_primaries, 1,
10626fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            seqdisp_payload->transfer_char, seqdisp_payload->matrix_coeffs,
10627fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            &color_space,aspects);
10628fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    m_disp_hor_size = seqdisp_payload->disp_width;
10629fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    m_disp_vert_size = seqdisp_payload->disp_height;
10630fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10631fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10632fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10633fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_H264:
10634fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_HEVC:
10635fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10636fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vui_display_info_payload *display_info_payload;
10637fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                display_info_payload = (struct msm_vidc_vui_display_info_payload*)data;
10638fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10639fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer H264 Spec @ Rec. ITU-T H.264 (02/2014) to understand this code */
10640fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10641fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (display_info_payload->video_signal_present_flag &&
10642fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        display_info_payload->color_description_present_flag) {
10643fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(display_info_payload->color_primaries,
10644fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->video_full_range_flag,
10645fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->transfer_characteristics,
10646fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            display_info_payload->matrix_coefficients,
10647fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            &color_space,aspects);
10648fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10649fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10650fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10651fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VC1_ANNEX_G:
10652fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VC1_ANNEX_L:
10653fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10654fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vc1_seqdisp_payload *vc1_seq_disp_payload;
10655fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vc1_seq_disp_payload = (struct msm_vidc_vc1_seqdisp_payload*)data;
10656fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10657fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VC-1 Spec @ SMPTE Draft Standard for Television Date: 2005-08-23
10658fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * SMPTE 421M to understand this code */
10659fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10660fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (m_enable_android_native_buffers &&
10661fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        vc1_seq_disp_payload->color_primaries) {
10662fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10663fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    convert_color_space_info(vc1_seq_disp_payload->color_primaries,
10664fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            1,
10665fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            vc1_seq_disp_payload->transfer_char,
10666fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            vc1_seq_disp_payload->matrix_coeffs,
10667fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            &color_space,aspects);
10668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10670fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VP8:
10672fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10673fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10674fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10675fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10676fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VP8 Data Format in latest VP8 spec and Decoding Guide November 2011
10677fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * to understand this code */
10678fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10679fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (vpx_color_space_payload->color_space == 0) {
10680fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    color_space = ITU_R_601;
10681fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                } else {
10682fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Unsupported Color space for VP8");
10683fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
10684fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10685fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10686fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10687fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_VP9:
10688fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
10689fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                struct msm_vidc_vpx_colorspace_payload *vpx_color_space_payload;
10690fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                vpx_color_space_payload = (struct msm_vidc_vpx_colorspace_payload*)data;
10691fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10692fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                /* Refer VP9 Spec @ VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016
10693fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                 * to understand this code */
10694fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10695fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch(vpx_color_space_payload->color_space) {
10696fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_601:
10697fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT601_6;
10698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10699fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesBT601_6_625;
10700fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10701fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10702fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_709:
10703fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = ITU_R_709;
10704fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10705fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10706fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries =  ColorAspects::PrimariesBT709_5;
10707fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10708fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10709fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_SMPTE_170:
10710fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10711fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10712fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10713fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10714fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10715fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_SMPTE_240:
10716fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = m_client_color_space.sAspects.mMatrixCoeffs;
10717fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE240M;
10718fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = m_client_color_space.sAspects.mPrimaries;
10719fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10720fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10721fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_BT_2020:
10722fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT2020;
10723fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects:: TransferSMPTE170M;
10724fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesBT2020;
10725fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10726fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10727fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_RESERVED:
10728fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixOther;
10729fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferOther;
10730fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10731fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10732fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10733fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case MSM_VIDC_CS_RGB:
10734fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mMatrixCoeffs = ColorAspects::MatrixBT709_5;
10735fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mTransfer = ColorAspects::TransferSMPTE170M;
10736fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mPrimaries = ColorAspects::PrimariesOther;
10737fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        aspects->mRange = m_client_color_space.sAspects.mRange;
10738fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10739fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
10740fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
10741fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
10742fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
10743fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10744fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
10745fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
10746fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10747fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_enable_android_native_buffers) {
10748fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry 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);
10749fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        set_colorspace_in_handle(color_space, buf_index);
10750fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10751fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    print_debug_color_aspects(aspects, "Bitstream");
10752fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10753fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_internal_color_space.sAspects.mPrimaries != aspects->mPrimaries ||
10754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mTransfer != aspects->mTransfer ||
10755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mMatrixCoeffs != aspects->mMatrixCoeffs ||
10756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_internal_color_space.sAspects.mRange != aspects->mRange) {
10757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memcpy(&(m_internal_color_space.sAspects), aspects, sizeof(ColorAspects));
10758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_internal_color_space.bDataSpaceChanged = OMX_TRUE;
10759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10760fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to Color Aspects Change");
10761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(m_internal_color_space.sAspects), "Internal");
10762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        print_debug_color_aspects(&(m_client_color_space.sAspects), "Client");
10763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        post_event(OMX_CORE_OUTPUT_PORT_INDEX,
10765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_QTIIndexConfigDescribeColorAspects,
10766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_COMPONENT_GENERATE_PORT_RECONFIG);
10767fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return true;
10768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10769fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return false;
10770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_vdec::set_colorspace_in_handle(ColorSpace_t color_space, unsigned int buf_index) {
10773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    private_handle_t *private_handle = NULL;
10774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (buf_index < drv_ctx.op_buf.actualcount &&
10775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            buf_index < MAX_NUM_INPUT_OUTPUT_BUFFERS &&
10776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            native_buffer[buf_index].privatehandle) {
10777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        private_handle = native_buffer[buf_index].privatehandle;
10778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (private_handle) {
10780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        setMetaData(private_handle, UPDATE_COLOR_SPACE, (void*)&color_space);
10781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
10782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
10783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
10784fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelvoid omx_vdec::print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix)
10785fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
10786fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (!hdr_info->mID) {
10787fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mR.x = %d mR.y = %d", prefix,
10788fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mR.x, hdr_info->sType1.mR.y);
10789fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mG.x = %d mG.y = %d", prefix,
10790fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mG.x, hdr_info->sType1.mG.y);
10791fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mB.x = %d mB.y = %d", prefix,
10792fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mB.x, hdr_info->sType1.mB.y);
10793fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: mW.x = %d mW.y = %d", prefix,
10794fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mW.x, hdr_info->sType1.mW.y);
10795fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo MDC: maxDispLum = %d minDispLum = %d", prefix,
10796fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                         hdr_info->sType1.mMaxDisplayLuminance, hdr_info->sType1.mMinDisplayLuminance);
10797fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DEBUG_PRINT_LOW("%s : HDRstaticinfo CLL: CLL = %d FLL = %d", prefix,
10798fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        hdr_info->sType1.mMaxContentLightLevel, hdr_info->sType1.mMaxFrameAverageLightLevel);
10799fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
10800fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10801fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
10802fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10803fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10804fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10805fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_content_light_level_info(void* data)
10806fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
10807fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    struct msm_vidc_content_light_level_sei_payload *light_level_payload =
10808fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (msm_vidc_content_light_level_sei_payload*)(data);
10809fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10810fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if ((m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel != light_level_payload->nMaxContentLight) ||
10811fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel != light_level_payload->nMaxPicAverageLight)) {
10812fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_internal_hdr_info.sInfo.sType1.mMaxContentLightLevel = light_level_payload->nMaxContentLight;
10813fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_internal_hdr_info.sInfo.sType1.mMaxFrameAverageLightLevel = light_level_payload->nMaxPicAverageLight;
10814fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        return true;
10815fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
10816fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return false;
10817fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
10818fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10819fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudelbool omx_vdec::handle_mastering_display_color_info(void* data)
10820fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel{
10821fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    struct msm_vidc_mastering_display_colour_sei_payload *mastering_display_payload =
10822fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (msm_vidc_mastering_display_colour_sei_payload*)(data);
10823fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    HDRStaticInfo* hdr_info = &m_internal_hdr_info.sInfo;
10824fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool internal_disp_changed_flag = false;
10825fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10826fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag  = (hdr_info->sType1.mR.x != mastering_display_payload->nDisplayPrimariesX[0]) ||
10827fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mR.y != mastering_display_payload->nDisplayPrimariesY[0]);
10828fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mG.x != mastering_display_payload->nDisplayPrimariesX[1]) ||
10829fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mG.y != mastering_display_payload->nDisplayPrimariesY[1]);
10830fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mB.x != mastering_display_payload->nDisplayPrimariesX[2]) ||
10831fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mB.y != mastering_display_payload->nDisplayPrimariesY[2]);
10832fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10833fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag |= (hdr_info->sType1.mW.x != mastering_display_payload->nWhitePointX) ||
10834fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mW.y != mastering_display_payload->nWhitePointY);
10835fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10836fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    internal_disp_changed_flag != (hdr_info->sType1.mMaxDisplayLuminance != mastering_display_payload->nMaxDisplayMasteringLuminance) ||
10837fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (hdr_info->sType1.mMinDisplayLuminance != mastering_display_payload->nMinDisplayMasteringLuminance);
10838fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10839fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (internal_disp_changed_flag) {
10840fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mR.x = mastering_display_payload->nDisplayPrimariesX[0];
10841fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mR.y = mastering_display_payload->nDisplayPrimariesY[0];
10842fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mG.x = mastering_display_payload->nDisplayPrimariesX[1];
10843fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mG.y = mastering_display_payload->nDisplayPrimariesY[1];
10844fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mB.x = mastering_display_payload->nDisplayPrimariesX[2];
10845fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mB.y = mastering_display_payload->nDisplayPrimariesY[2];
10846fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mW.x = mastering_display_payload->nWhitePointX;
10847fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mW.y = mastering_display_payload->nWhitePointY;
10848fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10849fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mMaxDisplayLuminance = mastering_display_payload->nMaxDisplayMasteringLuminance;
10850fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        hdr_info->sType1.mMinDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance;
10851fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    }
10852fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
10853fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    return internal_disp_changed_flag;
10854fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel}
10855fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1085611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
1085711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
108582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL, *p_client_extra = NULL;
108592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    OMX_U8 *pBuffer = NULL;
1086011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_conceal_MB = 0;
1086111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_TICKS time_stamp = 0;
1086211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 frame_rate = 0;
1086311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long consumed_len = 0;
1086411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_MB_in_frame;
1086511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 recovery_sei_flags = 1;
1086611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int enable = OMX_InterlaceFrameProgressive;
10867fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool internal_hdr_info_changed_flag = false;
10868fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    bool color_event = false;
1086911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (output_flush_progress)
1087011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1087111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1087211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int buf_index = p_buf_hdr - m_out_mem_ptr;
1087311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buf_index >= drv_ctx.extradata_info.count) {
1087411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
1087511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf_index, drv_ctx.extradata_info.count);
1087611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1087711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1087811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_panscan_window_payload *panscan_payload = NULL;
1087911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1088011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.ptr_outputbuffer[buf_index].bufferaddr == NULL) {
1088111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_extradata: Error: Mapped output buffer address is NULL");
1088211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1088311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1088411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1088511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!drv_ctx.extradata_info.uaddr) {
1088611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("NULL drv_ctx.extradata_info.uaddr");
1088711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1088811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1088911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!secure_mode && (drv_ctx.extradata_info.buffer_size > (p_buf_hdr->nAllocLen - p_buf_hdr->nFilledLen)) ) {
1089011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: Insufficient size allocated for extra-data");
1089111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
1089211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1089311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
108942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (!secure_mode) {
108952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        pBuffer = (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[buf_index].buffer_len,
108962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    PROT_READ|PROT_WRITE, MAP_SHARED, drv_ctx.ptr_outputbuffer[buf_index].pmem_fd, 0);
108972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (pBuffer == MAP_FAILED) {
108982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_ERROR("handle_extradata output buffer mmap failed - errno: %d", errno);
108992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            return;
109002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1090111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)
1090211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((unsigned long)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
109032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    } else
1090411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = m_other_extradata;
109052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
109062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    AutoUnmap autounmap(pBuffer, drv_ctx.ptr_outputbuffer[buf_index].buffer_len);
109072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (m_client_extradata_info.getBase() &&
109082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        m_client_extradata_info.getSize() >= drv_ctx.extradata_info.buffer_size) {
109092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (m_client_extradata_info.getBase() +
109102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            buf_index * m_client_extradata_info.getSize());
109112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
109122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1091311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
1091411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1091511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1091611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
1091711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
1091811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1091911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1092011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata_info.output_crop_updated = OMX_FALSE;
1092111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
1092211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (data && p_extra) {
1092311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while ((consumed_len < drv_ctx.extradata_info.buffer_size)
1092411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                && (data->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
1092511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((consumed_len + data->nSize) > (unsigned)drv_ctx.extradata_info.buffer_size) {
1092611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Invalid extra data size");
1092711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1092811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1092911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1093011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!secure_mode && ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))) {
1093111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra = NULL;
1093211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Error: out of bound memory access by p_extra");
1093311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return;
1093411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1093511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10936fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_LOW("handle_extradata: eType = 0x%x", data->eType);
1093711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch ((unsigned long)data->eType) {
1093811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_INTERLACE_VIDEO:
1093911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_interlace_payload *payload;
1094011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U32 interlace_color_format;
1094111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    payload = (struct msm_vidc_interlace_payload *)(void *)data->data;
1094211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (payload) {
1094311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        enable = OMX_InterlaceFrameProgressive;
1094411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (payload->format) {
1094511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE:
1094611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1094711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1094811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST:
1094911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1095011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                enable = OMX_InterlaceInterleaveFrameTopFieldFirst;
1095111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1095211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            case MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST:
1095311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
1095411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                enable = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1095511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                break;
1095611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            default:
1095711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_LOW("default case - set to progressive");
1095811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1095911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1096011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        switch (payload->color_format) {
1096111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12:
1096211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1096311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
1096411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           case MSM_VIDC_HAL_INTERLACE_COLOR_FORMAT_NV12_UBWC:
1096511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
1096611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               break;
1096711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           default:
1096811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               interlace_color_format = (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1096911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               DEBUG_PRINT_ERROR("Error - Unknown color format hint for interlaced frame");
1097011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1097111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1097211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1097311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_enable_android_native_buffers) {
1097411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("setMetaData INTERLACED format:%d color_format: %x enable:%d mbaff:%d",
1097511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         payload->format, interlace_color_format ,enable,
1097611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        (p_buf_hdr->nFlags & QOMX_VIDEO_BUFFERFLAG_MBAFF)?true:false);
1097711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1097811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
1097911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               PP_PARAM_INTERLACED, (void*)&enable);
1098011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1098111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
1098211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
1098311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               LINEAR_FORMAT, (void*)&interlace_color_format);
10984fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        } else if (interlace_color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) {
10985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
10986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                               LINEAR_FORMAT, NULL);
1098711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1098811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1098911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_INTERLACE_EXTRADATA) {
1099011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_interlace_extradata(p_extra, payload->format);
109912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
109922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
109932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_interlace_extradata(p_client_extra, payload->format);
109942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *)
109952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                (((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4));
109962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1099711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1099811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1099911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_RATE:
1100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_framerate_payload *frame_rate_payload;
1100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frame_rate_payload = (struct msm_vidc_framerate_payload *)(void *)data->data;
1100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    frame_rate = frame_rate_payload->frame_rate;
1100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_TIMESTAMP:
1100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_ts_payload *time_stamp_payload;
1100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp_payload = (struct msm_vidc_ts_payload *)(void *)data->data;
1100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp = time_stamp_payload->timestamp_lo;
1100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp |= ((unsigned long long)time_stamp_payload->timestamp_hi << 32);
1100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    p_buf_hdr->nTimeStamp = time_stamp;
1101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB:
1101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_concealmb_payload *conceal_mb_payload;
1101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    conceal_mb_payload = (struct msm_vidc_concealmb_payload *)(void *)data->data;
1101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_conceal_MB = ((num_MB_in_frame > 0)?(conceal_mb_payload->num_mbs * 100 / num_MB_in_frame) : 0);
1101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_INDEX:
1101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int *etype;
1102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    etype  = (int *)(void *)data->data;
1102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (etype && *etype == MSM_VIDC_EXTRADATA_ASPECT_RATIO) {
1102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct msm_vidc_aspect_ratio_payload *aspect_ratio_payload;
1102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        aspect_ratio_payload = (struct msm_vidc_aspect_ratio_payload *)(++etype);
1102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (aspect_ratio_payload) {
1102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((struct vdec_output_frameinfo *)
1102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_width = aspect_ratio_payload->aspect_width;
1102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((struct vdec_output_frameinfo *)
1102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
1102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else if (etype && *etype == MSM_VIDC_EXTRADATA_OUTPUT_CROP) {
1103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct msm_vidc_output_crop_payload *output_crop_payload;
1103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        output_crop_payload = (struct msm_vidc_output_crop_payload *)(++etype);
1103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (output_crop_payload) {
1103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nLeft = output_crop_payload->left;
1103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nTop = output_crop_payload->top;
1103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nWidth = output_crop_payload->left + output_crop_payload->display_width;
1103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_rect.nHeight = output_crop_payload->top + output_crop_payload->display_height;
1103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_width = output_crop_payload->width;
1103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_height = output_crop_payload->height;
1104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_extradata_info.output_crop_updated = OMX_TRUE;
1104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
1104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
1104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_recoverysei_payload *recovery_sei_payload;
1104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    recovery_sei_payload = (struct msm_vidc_recoverysei_payload *)(void *)data->data;
1104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    recovery_sei_flags = recovery_sei_payload->flags;
1104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (recovery_sei_flags != MSM_VIDC_FRAME_RECONSTRUCTION_CORRECT) {
1104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
1105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("***************************************************");
1105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("FillBufferDone: OMX_BUFFERFLAG_DATACORRUPT Received");
1105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_HIGH("***************************************************");
1105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               case MSM_VIDC_EXTRADATA_PANSCAN_WINDOW:
1105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    panscan_payload = (struct msm_vidc_panscan_window_payload *)(void *)data->data;
1105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (panscan_payload->num_panscan_windows > MAX_PAN_SCAN_WINDOWS) {
1105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Panscan windows are more than supported\n");
1105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Max supported = %d FW returned = %d\n",
1106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            MAX_PAN_SCAN_WINDOWS, panscan_payload->num_panscan_windows);
1106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return;
1106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_MPEG2_SEQDISP:
11065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO:
11066fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VC1_SEQDISP:
11067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO:
11068fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    color_event = handle_color_space_info((void *)data->data, buf_index);
1106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_S3D_FRAME_PACKING:
1107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload;
1107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    s3d_frame_packing_payload = (struct msm_vidc_s3d_frame_packing_payload *)(void *)data->data;
1107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    switch (s3d_frame_packing_payload->fpa_type) {
1107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case MSM_VIDC_FRAMEPACK_SIDE_BY_SIDE:
1107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (s3d_frame_packing_payload->content_interprtation_type == 1)
1107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_3D_SIDE_BY_SIDE_L_R;
1107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            else if (s3d_frame_packing_payload->content_interprtation_type == 2)
1107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_3D_SIDE_BY_SIDE_R_L;
1107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            else {
1108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_ERROR("Unsupported side-by-side framepacking type");
1108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                stereo_output_mode = HAL_NO_3D;
1108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
1108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
1108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        case MSM_VIDC_FRAMEPACK_TOP_BOTTOM:
1108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            stereo_output_mode = HAL_3D_TOP_BOTTOM;
1108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            break;
1108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        default:
1108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Unsupported framepacking type");
1108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            stereo_output_mode = HAL_NO_3D;
1109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("setMetaData FRAMEPACKING : fpa_type = %u, content_interprtation_type = %u, stereo_output_mode= %d",
1109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        s3d_frame_packing_payload->fpa_type, s3d_frame_packing_payload->content_interprtation_type, stereo_output_mode);
1109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_FRAMEPACK_EXTRADATA) {
1109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_framepack_extradata(p_extra, s3d_frame_packing_payload);
110952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
110962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
110972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_framepack_extradata(p_client_extra, s3d_frame_packing_payload);
110982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
110992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_QP:
1110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_frame_qp_payload *qp_payload;
1110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    qp_payload = (struct msm_vidc_frame_qp_payload*)(void *)data->data;
1110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_QP_EXTRADATA) {
1110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_qp_extradata(p_extra, qp_payload);
111072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_qp_extradata(p_client_extra, qp_payload);
111102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_FRAME_BITS_INFO:
1111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_frame_bits_info_payload *bits_info_payload;
1111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bits_info_payload = (struct msm_vidc_frame_bits_info_payload*)(void *)data->data;
1111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_BITSINFO_EXTRADATA) {
1111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_bitsinfo_extradata(p_extra, bits_info_payload);
111192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_bitsinfo_extradata(p_client_extra, bits_info_payload);
111222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_STREAM_USERDATA:
1112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_EXTNUSER_EXTRADATA) {
1112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_user_extradata(p_extra, data);
111292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_user_extradata(p_client_extra, data);
111322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
1113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case MSM_VIDC_EXTRADATA_VQZIP_SEI:
1113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    struct msm_vidc_vqzip_sei_payload *vqzip_payload;
1113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data;
1113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (client_extradata & OMX_VQZIPSEI_EXTRADATA) {
1114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        append_vqzip_extradata(p_extra, vqzip_payload);
111422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        if (p_client_extra) {
111442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            append_vqzip_extradata(p_client_extra, vqzip_payload);
111452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        }
1114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
11149fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                case MSM_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI:
11150fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    internal_hdr_info_changed_flag |= handle_content_light_level_info((void*)data->data);
11151fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    break;
11152fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                case MSM_VIDC_EXTRADATA_MASTERING_DISPLAY_COLOUR_SEI:
11153fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    internal_hdr_info_changed_flag |= handle_mastering_display_color_info((void*)data->data);
11154fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    break;
1115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
1115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Unrecognized extradata");
1115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    goto unrecognized_extradata;
1115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            consumed_len += data->nSize;
1116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
1116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (client_extradata & OMX_FRAMEINFO_EXTRADATA) {
1116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            append_frame_info_extradata(p_extra,
1116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
1116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
1116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
111682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (p_client_extra) {
111702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                append_frame_info_extradata(p_client_extra,
111712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
111722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
111732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
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        if (client_extradata & OMX_FRAMEDIMENSION_EXTRADATA) {
1117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            append_frame_dimension_extradata(p_extra);
111792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + ALIGN(p_extra->nSize, 4));
111802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (p_client_extra) {
111812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                append_frame_dimension_extradata(p_client_extra);
111822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                p_client_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_client_extra) + ALIGN(p_client_extra->nSize, 4));
111832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
1118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
11185fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
11186fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if(internal_hdr_info_changed_flag) {
11187fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_internal_hdr_info.sInfo), "Internal");
11188fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            print_debug_hdr_color_info(&(m_client_hdr_info.sInfo), "Client");
11189fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            auto_lock lock(m_hdr_info_client_lock);
11190fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_change_client_hdr_info = true;
11191fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if(!color_event) {
11192fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_HIGH("Initiating PORT Reconfig due to HDR Info Change");
11193fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                post_event(OMX_CORE_OUTPUT_PORT_INDEX,
11194fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           OMX_QTIIndexConfigDescribeHDRColorInfo,
11195fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                           OMX_COMPONENT_GENERATE_PORT_RECONFIG);
11196fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
11197fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
11198fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunrecognized_extradata:
1120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (client_extradata && p_extra) {
1120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
1120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        append_terminator_extradata(p_extra);
112042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (p_client_extra) {
112052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            append_terminator_extradata(p_client_extra);
112062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (secure_mode && p_extradata && m_other_extradata) {
1120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_output_frameinfo  *ptr_extradatabuff = NULL;
1121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy(p_extradata, m_other_extradata, drv_ctx.extradata_info.buffer_size);
1121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff = (struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate;
1121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.metabufaddr = (void *)p_extradata;
1121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.size = drv_ctx.extradata_info.buffer_size;
1121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.fd = drv_ctx.extradata_info.ion.fd_ion_data.fd;
1121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.offset = buf_index * drv_ctx.extradata_info.buffer_size;
1121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ptr_extradatabuff->metadata_info.buffer_size = drv_ctx.extradata_info.size;
1121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11221fa202b9b18f17f7835fd602db5fff530e61112b4Thierry StrudelOMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U64 requested_extradata,
1122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_internal, bool enable)
1122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE ret = OMX_ErrorNone;
1122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
1122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state != OMX_StateLoaded) {
1122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
1122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorIncorrectStateOperation;
1122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d",
1123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal);
1123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!is_internal) {
1123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (enable)
1123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= requested_extradata;
1123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata = client_extradata & ~requested_extradata;
1123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable) {
1124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
1124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
1124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set interlaced extradata."
1124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        " Quality of interlaced clips might be impacted.");
1124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_FRAMEINFO_EXTRADATA) {
1125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE;
1125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set framerate extradata");
1125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB;
1125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set concealed MB extradata");
1125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI;
1126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set recovery point SEI extradata");
1126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW;
1126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO;
1127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_MPEG2) {
1127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
1127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Failed to set panscan extradata");
1128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_TIMEINFO_EXTRADATA) {
1128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP;
1128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set timeinfo extradata");
1128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && (requested_extradata & OMX_FRAMEPACK_EXTRADATA)) {
1129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (output_capability == V4L2_PIX_FMT_H264) {
1129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("enable OMX_FRAMEPACK_EXTRADATA");
1129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value =  V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING;
1129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Failed to set S3D_FRAME_PACKING extradata");
1129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("OMX_FRAMEPACK_EXTRADATA supported for H264 only");
1130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_QP_EXTRADATA) {
1130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
1130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set QP extradata");
1130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_BITSINFO_EXTRADATA) {
1131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_BITS_INFO;
1131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set frame bits info extradata");
1131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && (requested_extradata & OMX_EXTNUSER_EXTRADATA)) {
1131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_STREAM_USERDATA;
1131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set stream userdata extradata");
1132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_VQZIPSEI_EXTRADATA) {
1132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI;
1132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata");
1132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= OMX_VQZIPSEI_EXTRADATA;
1133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
1133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set QP extradata");
1133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            client_extradata |= OMX_QP_EXTRADATA;
1133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) {
1133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
1134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_OUTPUT_CROP;
1134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Enable output crop extra data");
1134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Failed to set output crop extradata");
1134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
11346fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (requested_extradata & OMX_DISPLAY_INFO_EXTRADATA) {
11347fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
11348fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            switch(output_capability) {
11349fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_H264:
11350fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_HEVC:
11351fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
11352fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11353fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case CODEC_TYPE_MPEG2:
11354fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value =  V4L2_MPEG_VIDC_EXTRADATA_MPEG2_SEQDISP;
11355fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11356fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VP8:
11357fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VP9:
11358fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VPX_COLORSPACE;
11359fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11360fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VC1_ANNEX_G:
11361fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                case V4L2_PIX_FMT_VC1_ANNEX_L:
11362fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    control.value = V4L2_MPEG_VIDC_EXTRADATA_VC1_SEQDISP;
11363fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
11364fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                default:
11365fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_HIGH("Don't support Disp info for this codec : %s", drv_ctx.kind);
11366fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    return ret;
11367fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11368fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
11369fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11370fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_HIGH("Failed to set Display info extradata");
11371fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
11372fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
11373fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if (requested_extradata & OMX_HDR_COLOR_INFO_EXTRADATA) {
11374fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
11375fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            if (output_capability == V4L2_PIX_FMT_H264 ||
11376fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                output_capability == V4L2_PIX_FMT_HEVC) {
11377fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_DISPLAY_COLOUR_SEI;
11378fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11379fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    DEBUG_PRINT_HIGH("Failed to set Display Colour SEI extradata");
11380fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
11381fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI;
11382fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
11383fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                    DEBUG_PRINT_HIGH("Failed to set Content Light Level SEI extradata");
11384fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                }
11385fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
11386fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        }
1138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = get_buffer_req(&drv_ctx.op_buf);
1138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
1139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_vdec::count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 num_MB = 0, byte_count = 0, num_MB_in_frame = 0;
1139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *data_ptr = extra->data, data = 0;
1139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (byte_count < extra->nDataSize) {
1139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data = *data_ptr;
1139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (data) {
1139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            num_MB += (data&0x01);
1140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data >>= 1;
1140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data_ptr++;
1140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        byte_count++;
1140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    num_MB_in_frame = ((drv_ctx.video_resolution.frame_width + 15) *
1140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (drv_ctx.video_resolution.frame_height + 15)) >> 8;
1140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ((num_MB_in_frame > 0)?(num_MB * 100 / num_MB_in_frame) : 0);
1140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_debug_extradata || !extra)
1141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH(
1141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "============== Extra Data ==============\n"
1141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "           Size: %u\n"
1141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "        Version: %u\n"
1142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "      PortIndex: %u\n"
1142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "           Type: %x\n"
1142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "       DataSize: %u",
1142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)extra->nSize, (unsigned int)extra->nVersion.nVersion,
1142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)extra->nPortIndex, extra->eType, (unsigned int)extra->nDataSize);
1142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat) {
1142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_STREAMINTERLACEFORMAT *intfmt = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "------ Interlace Format ------\n"
1143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                Size: %u\n"
1143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             Version: %u\n"
1143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           PortIndex: %u\n"
1143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " Is Interlace Format: %d\n"
1143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   Interlace Formats: %u\n"
1143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "=========== End of Interlace ===========",
1143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)intfmt->nSize, (unsigned int)intfmt->nVersion.nVersion, (unsigned int)intfmt->nPortIndex,
1143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                intfmt->bInterlaceFormat, (unsigned int)intfmt->nInterlaceFormats);
1143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo) {
1143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *fminfo = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "-------- Frame Format --------\n"
1144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             Picture Type: %d\n"
1144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Interlace Type: %d\n"
1144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " Pan Scan Total Frame Num: %u\n"
1144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   Concealed Macro Blocks: %u\n"
1144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               frame rate: %u\n"
1144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               Time Stamp: %llu\n"
1144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Aspect Ratio X: %u\n"
1145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "           Aspect Ratio Y: %u",
1145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->ePicType,
1145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->interlaceType,
1145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->panScan.numWindows,
1145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->nConcealedMacroblocks,
1145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->nFrameRate,
1145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fminfo->nTimeStamp,
1145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->aspectRatio.aspectRatioX,
1145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)fminfo->aspectRatio.aspectRatioY);
1145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < fminfo->panScan.numWindows; i++) {
1146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH(
1146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "------------------------------"
1146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "     Pan Scan Frame Num: %u\n"
1146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "            Rectangle x: %d\n"
1146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "            Rectangle y: %d\n"
1146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "           Rectangle dx: %d\n"
1146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "           Rectangle dy: %d",
1146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)i, (unsigned int)fminfo->panScan.window[i].x, (unsigned int)fminfo->panScan.window[i].y,
1146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)fminfo->panScan.window[i].dx, (unsigned int)fminfo->panScan.window[i].dy);
1147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("========= End of Frame Format ==========");
1147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement) {
1147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
1147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "------------------ Framepack Format ----------\n"
1147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                           id: %u \n"
1147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                  cancel_flag: %u \n"
1147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                         type: %u \n"
1148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " quincunx_sampling_flagFormat: %u \n"
1148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "  content_interpretation_type: %u \n"
1148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "        spatial_flipping_flag: %u \n"
1148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "          frame0_flipped_flag: %u \n"
1148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "             field_views_flag: %u \n"
1148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " current_frame_is_frame0_flag: %u \n"
1148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   frame0_self_contained_flag: %u \n"
1148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "   frame1_self_contained_flag: %u \n"
1148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame0_grid_position_x: %u \n"
1148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame0_grid_position_y: %u \n"
1149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame1_grid_position_x: %u \n"
1149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "       frame1_grid_position_y: %u \n"
1149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "                reserved_byte: %u \n"
1149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "            repetition_period: %u \n"
1149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "               extension_flag: %u \n"
1149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "================== End of Framepack ===========",
1149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->id,
1149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->cancel_flag,
1149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->type,
1149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->quincunx_sampling_flag,
1150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->content_interpretation_type,
1150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->spatial_flipping_flag,
1150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_flipped_flag,
1150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->field_views_flag,
1150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->current_frame_is_frame0_flag,
1150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_self_contained_flag,
1150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_self_contained_flag,
1150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_grid_position_x,
1150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame0_grid_position_y,
1150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_grid_position_x,
1151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->frame1_grid_position_y,
1151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->reserved_byte,
1151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->repetition_period,
1151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)framepack->extension_flag);
1151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataQP) {
1151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_QP * qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
1151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "---- QP (Frame quantization parameter) ----\n"
1151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Frame QP: %u \n"
1151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "================ End of QP ================\n",
1152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)qp->nQP);
1152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataInputBitsInfo) {
1152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_BITS_INFO * bits = (OMX_QCOM_EXTRADATA_BITS_INFO *)(void *)extra->data;
1152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------- Input bits information --------\n"
1152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Header bits: %u \n"
1152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "     Frame bits: %u \n"
1152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "===== End of Input bits information =====\n",
1152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)bits->header_bits, (unsigned int)bits->frame_bits);
1152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData) {
1153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_USERDATA *userdata = (OMX_QCOM_EXTRADATA_USERDATA *)(void *)extra->data;
1153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 *data_ptr = (OMX_U8 *)userdata->data;
1153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 userdata_size = extra->nDataSize - sizeof(userdata->type);
1153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 i = 0;
1153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------------  Userdata  -------------\n"
1153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Stream userdata type: %u\n"
1153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "          userdata size: %u\n"
1153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    STREAM_USERDATA:",
1153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)userdata->type, (unsigned int)userdata_size);
1154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                for (i = 0; i < userdata_size; i+=4) {
1154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("        %x %x %x %x",
1154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        data_ptr[i], data_ptr[i+1],
1154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        data_ptr[i+2], data_ptr[i+3]);
1154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "=========== End of Userdata ===========");
1154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI) {
1154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_VQZIPSEI *vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
1154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH(
1155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "--------------  VQZip  -------------\n"
1155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "    Size: %u\n",
1155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)vq->nSize);
1155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH( "=========== End of VQZip ===========");
1155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra->eType == OMX_ExtraDataNone) {
1155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("========== End of Terminator ===========");
1155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("======= End of Driver Extradata ========");
1155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 interlaced_format_type)
1156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STREAMINTERLACEFORMAT *interlace_format;
1156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
1156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!extra) {
1157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Error: append_interlace_extradata - invalid input");
1157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return;
1157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
1157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataInterlaceFormat;
1157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format = (OMX_STREAMINTERLACEFORMAT *)(void *)extra->data;
1157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nSize = sizeof(OMX_STREAMINTERLACEFORMAT);
1158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nVersion.nVersion = OMX_SPEC_VERSION;
1158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    interlace_format->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (interlaced_format_type == MSM_VIDC_INTERLACE_FRAME_PROGRESSIVE) {
1158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_FALSE;
1158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_TOPFIELDFIRST) {
1158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_TRUE;
1158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;
1159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
1159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (interlaced_format_type == MSM_VIDC_INTERLACE_INTERLEAVE_FRAME_BOTTOMFIELDFIRST) {
1159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_TRUE;
1159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameBottomFieldFirst;
1159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceInterleaveFrameBottomFieldFirst;
1159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //default case - set to progressive
1159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->bInterlaceFormat = OMX_FALSE;
1159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
1159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
1160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_FRAMEDIMENSION *frame_dimension;
1160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_FRAMEDIMENSION_EXTRADATA)) {
1160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEDIMENSION_EXTRADATA_SIZE;
1161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameDimension;
1161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION);
1161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)(void *)extra->data;
1161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nDecWidth = rectangle.nLeft;
1161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nDecHeight = rectangle.nTop;
1161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nActualWidth = rectangle.nWidth;
1161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_dimension->nActualHeight = rectangle.nHeight;
1162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::fill_aspect_ratio_info(
1162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_aspectratioinfo *aspect_ratio_info,
1162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
1162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata = frame_info;
1162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
1162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
1162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("aspectRatioX %u aspectRatioY %u", (unsigned int)m_extradata->aspectRatio.aspectRatioX,
1163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)m_extradata->aspectRatio.aspectRatioY);
1163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 num_conceal_mb, OMX_U32 picture_type, OMX_U32 frame_rate,
1163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_TICKS time_stamp, struct msm_vidc_panscan_window_payload *panscan_payload,
1163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_aspectratioinfo *aspect_ratio_info)
1163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
1163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_panscan_window *panscan_window;
1164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
1164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
1164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFrameInfo;
1164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO);
1164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(void *)extra->data;
1164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (picture_type) {
1165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_I:
1165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeI;
1165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_P:
1165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeP;
1165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case PICTURE_TYPE_B:
1165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = OMX_VIDEO_PictureTypeB;
1165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
1166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->ePicType = (OMX_VIDEO_PICTURETYPE)0;
1166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameTopFieldFirst)
1166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
1166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (drv_ctx.interlace == VDEC_InterlaceInterleaveFrameBottomFieldFirst)
1166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
1166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
1166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->interlaceType = OMX_QCOM_InterlaceFrameProgressive;
1166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&frame_info->aspectRatio, 0, sizeof(frame_info->aspectRatio));
1166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nConcealedMacroblocks = num_conceal_mb;
1167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nFrameRate = frame_rate;
1167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->nTimeStamp = time_stamp;
1167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frame_info->panScan.numWindows = 0;
1167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (output_capability == V4L2_PIX_FMT_MPEG2) {
1167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_disp_hor_size && m_disp_vert_size) {
1167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayHorizontalSize = m_disp_hor_size;
1167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayVerticalSize = m_disp_vert_size;
1167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayHorizontalSize = 0;
1167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->displayAspectRatio.displayVerticalSize = 0;
1168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (panscan_payload) {
1168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_info->panScan.numWindows = panscan_payload->num_panscan_windows;
1168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        panscan_window = &panscan_payload->wnd[0];
1168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < frame_info->panScan.numWindows; i++) {
1168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].x = panscan_window->panscan_window_width;
1168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].y = panscan_window->panscan_window_height;
1168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].dx = panscan_window->panscan_width_offset;
1169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            frame_info->panScan.window[i].dy = panscan_window->panscan_height_offset;
1169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            panscan_window++;
1169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fill_aspect_ratio_info(aspect_ratio_info, frame_info);
1169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
1170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
1170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataPortDef;
1170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
1170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *)(void *)extra->data;
1170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *portDefn = m_port_def;
1170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("append_portdef_extradata height = %u width = %u "
1170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "stride = %u sliceheight = %u",(unsigned int)portDefn->format.video.nFrameHeight,
1171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nFrameWidth,
1171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nStride,
1171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)portDefn->format.video.nSliceHeight);
1171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload)
1171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_FRAME_PACK_ARRANGEMENT *framepack;
1171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (FRAME_PACK_SIZE*sizeof(OMX_U32) != sizeof(struct msm_vidc_s3d_frame_packing_payload)) {
1172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("frame packing size mismatch");
1172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_FRAMEPACK_EXTRADATA_SIZE;
1172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataFramePackingArrangement;
1172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack = (OMX_QCOM_FRAME_PACK_ARRANGEMENT *)(void *)extra->data;
1172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nSize = sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nVersion.nVersion = OMX_SPEC_VERSION;
1173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    framepack->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&framepack->id, s3d_frame_packing_payload,
1173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sizeof(struct msm_vidc_s3d_frame_packing_payload));
1173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&m_frame_pack_arrangement, framepack,
1173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT));
1173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct msm_vidc_frame_qp_payload *qp_payload)
1174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_QP * qp = NULL;
1174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!qp_payload) {
1174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("QP payload is NULL");
1174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_QP_EXTRADATA_SIZE;
1174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataQP;
1175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_QP);
1175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    qp = (OMX_QCOM_EXTRADATA_QP *)(void *)extra->data;
1175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    qp->nQP = qp_payload->frame_qp;
1175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            struct msm_vidc_frame_bits_info_payload *bits_payload)
1175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_BITS_INFO * bits = NULL;
1176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bits_payload) {
1176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("bits info payload is NULL");
1176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_BITSINFO_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_ExtraDataInputBitsInfo;
1176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_BITS_INFO);
1177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits = (OMX_QCOM_EXTRADATA_BITS_INFO*)(void *)extra->data;
1177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits->frame_bits = bits_payload->frame_bits;
1177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bits->header_bits = bits_payload->header_bits;
1177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_OTHER_EXTRADATATYPE *p_user)
1177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int userdata_size = 0;
1178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_stream_userdata_payload *userdata_payload = NULL;
1178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    userdata_payload =
1178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (struct msm_vidc_stream_userdata_payload *)(void *)p_user->data;
1178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    userdata_size = p_user->nDataSize;
1178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_USERDATA_EXTRADATA_SIZE + userdata_size;
1178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataMP2UserData;
1178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = userdata_size;
1178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra->nDataSize && (p_user->nDataSize >= extra->nDataSize))
1179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memcpy(extra->data, p_user->data, extra->nDataSize);
1179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
1179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!client_extradata) {
1179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
1180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = OMX_ExtraDataNone;
1180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = 0;
1180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->data[0] = 0;
1180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra,
1180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct msm_vidc_vqzip_sei_payload *vqzip_payload)
1181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_VQZIPSEI *vq = NULL;
1181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nSize = OMX_VQZIPSEI_EXTRADATA_SIZE + vqzip_payload->size;
1181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nVersion.nVersion = OMX_SPEC_VERSION;
1181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVQZipSEI;
1181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra->nDataSize = sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + vqzip_payload->size;
1181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vq = (OMX_QCOM_EXTRADATA_VQZIPSEI *)(void *)extra->data;
1182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vq->nSize = vqzip_payload->size;
1182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(vq->data, vqzip_payload->data, vqzip_payload->size);
1182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    print_debug_extradata(extra);
1182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_vdec::allocate_desc_buffer(OMX_U32 index)
1182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index >= drv_ctx.ip_buf.actualcount) {
1183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR:Desc Buffer Index not found");
1183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr == NULL) {
1183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_desc_buffer_ptr = (desc_buffer_hdr*) \
1183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    calloc( (sizeof(desc_buffer_hdr)),
1183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            drv_ctx.ip_buf.actualcount);
1183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_desc_buffer_ptr == NULL) {
1183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("m_desc_buffer_ptr Allocation failed ");
1183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
1184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_desc_buffer_ptr[index].buf_addr = (unsigned char *)malloc (DESC_BUFFER_SIZE * sizeof(OMX_U8));
1184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr[index].buf_addr == NULL) {
1184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("desc buffer Allocation failed ");
1184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::insert_demux_addr_offset(OMX_U32 address_offset)
1185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inserting address offset (%u) at idx (%u)", (unsigned int)address_offset,(unsigned int)m_demux_entries);
1185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_demux_entries < 8192) {
1185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_demux_offsets[m_demux_entries++] = address_offset;
1185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr)
1186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 bytes_to_parse = buf_hdr->nFilledLen;
1186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *buf = buf_hdr->pBuffer + buf_hdr->nOffset;
1186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 index = 0;
1186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
1186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (index < bytes_to_parse) {
1187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ( ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (buf[index+2] == 0x00) && (buf[index+3] == 0x01)) ||
1187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ((buf[index] == 0x00) && (buf[index+1] == 0x00) &&
1187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (buf[index+2] == 0x01)) ) {
1187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Found start code, insert address offset
1187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            insert_demux_addr_offset(index);
1187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (buf[index+2] == 0x01) // 3 byte start code
1187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                index += 3;
1187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else                      //4 byte start code
1187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                index += 4;
1188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            index++;
1188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Extracted (%u) demux entry offsets", (unsigned int)m_demux_entries);
1188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return;
1188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::handle_demux_data(OMX_BUFFERHEADERTYPE *p_buf_hdr)
1188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //fix this, handle 3 byte start code, vc1 terminator entry
1189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8 *p_demux_data = NULL;
1189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 desc_data = 0;
1189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 start_addr = 0;
1189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nal_size = 0;
1189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 suffix_byte = 0;
1189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 demux_index = 0;
1189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 buffer_index = 0;
1189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_desc_buffer_ptr == NULL) {
1189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("m_desc_buffer_ptr is NULL. Cannot append demux entries.");
1190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_index = p_buf_hdr - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr);
1190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_index > drv_ctx.ip_buf.actualcount) {
1190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("handle_demux_data:Buffer index is incorrect (%u)", (unsigned int)buffer_index);
1190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    p_demux_data = (OMX_U8 *) m_desc_buffer_ptr[buffer_index].buf_addr;
1191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( ((OMX_U8*)p_demux_data == NULL) ||
1191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((m_demux_entries * 16) + 1) > DESC_BUFFER_SIZE) {
1191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficient buffer. Cannot append demux entries.");
1191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (; demux_index < m_demux_entries; demux_index++) {
1191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0;
1191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            start_addr = m_demux_offsets[demux_index];
1191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 2] == 0x01) {
1192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 3];
1192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                suffix_byte = p_buf_hdr->pBuffer[m_demux_offsets[demux_index] + 4];
1192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (demux_index < (m_demux_entries - 1)) {
1192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_size = m_demux_offsets[demux_index + 1] - m_demux_offsets[demux_index] - 2;
1192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                nal_size = p_buf_hdr->nFilledLen - m_demux_offsets[demux_index] - 2;
1192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Start_addr(0x%x), suffix_byte(0x%x),nal_size(%u),demux_index(%u)",
1193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)start_addr,
1193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)suffix_byte,
1193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)nal_size,
1193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)demux_index);
1193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = (start_addr >> 3) << 1;
1193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data |= (start_addr & 7) << 21;
1193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data |= suffix_byte << 24;
1193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data + 4, &nal_size, sizeof(OMX_U32));
1194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_demux_data += 16;
1194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_type_parse == CODEC_TYPE_VC1) {
1194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VC1 terminator entry");
1194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0;
1194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            desc_data = 0x82 << 24;
1194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(p_demux_data, &desc_data, sizeof(OMX_U32));
1195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 4, 0, sizeof(OMX_U32));
1195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 8, 0, sizeof(OMX_U32));
1195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(p_demux_data + 12, 0, sizeof(OMX_U32));
1195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_demux_data += 16;
1195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_demux_entries++;
1195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Add zero word to indicate end of descriptors
1195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(p_demux_data, 0, sizeof(OMX_U32));
1195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_desc_buffer_ptr[buffer_index].desc_data_size = (m_demux_entries * 16) + sizeof(OMX_U32);
1196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("desc table data size=%u", (unsigned int)m_desc_buffer_ptr[buffer_index].desc_data_size);
1196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
1196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_demux_entries = 0;
1196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Demux table complete!");
1196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::request_perf_level(enum vidc_perf_level perf_level)
1196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
1197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
1197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.turbo", property_value, "0");
1197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0, sizeof(v4l2_control));
1197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
1197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (perf_level) {
1197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VIDC_NOMINAL:
1197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(property_value))
1197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
1198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
1198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VIDC_TURBO:
1198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
1198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     default:
1198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Requested PERF level not supported");
1198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((current_perf_level == (OMX_U32)control.value) && !in_reconfig)
1199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("changing performance level to %d", control.value);
1199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
1199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        current_perf_level = control.value;
1199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set PERF level");
1199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::allocate_color_convert_buf()
1200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enabled = false;
1200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = NULL;
1200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_members();
1200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ColorFormat = OMX_COLOR_FormatMax;
1200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dest_format = YCbCr420P;
1200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_width = 0;
1200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_height = 0;
1201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client)
1201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx = reinterpret_cast<omx_vdec*>(client);
1201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::allocate_color_convert_buf::init_members()
1201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocated_count = 0;
1202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_size_req = 0;
1202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buffer_alignment_req = 0;
1202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_c2d_width = m_c2d_height = 0;
1202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_platform_list_client,0,sizeof(m_platform_list_client));
1202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_platform_entry_client,0,sizeof(m_platform_entry_client));
1202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_pmem_info_client,0,sizeof(m_pmem_info_client));
1202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(m_out_mem_ptr_client,0,sizeof(m_out_mem_ptr_client));
1202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(op_buf_ion_info,0,sizeof(m_platform_entry_client));
1202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (int i = 0; i < MAX_COUNT; i++)
1203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pmem_fd[i] = -1;
1203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::allocate_color_convert_buf::~allocate_color_convert_buf()
1203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2d.destroy();
1203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::update_buffer_req()
1204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int src_size = 0, destination_size = 0;
120432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    unsigned int height, width;
120442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_format fmt;
1204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_COLOR_FORMATTYPE drv_color_format;
120462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid client in color convert");
1204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
1205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("No color conversion required");
1205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return status;
1205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
120572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    memset(&fmt, 0x0, sizeof(struct v4l2_format));
120582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
120592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fmt.fmt.pix_mp.pixelformat = omx->capture_capability;
120602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_G_FMT, &fmt);
120612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    width = fmt.fmt.pix_mp.width;
120622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    height =  fmt.fmt.pix_mp.height;
120632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
120642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    bool resolution_upgrade = (height > m_c2d_height ||
120652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            width > m_c2d_width);
1206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (resolution_upgrade) {
1206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // resolution upgraded ? ensure we are yet to allocate;
1206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // failing which, c2d buffers will never be reallocated and bad things will happen
1206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocated_count > 0) {
1207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Cannot change C2D buffer requirements with %d active allocations",
1207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    allocated_count);
1207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto fail_update_buf_req;
1207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx->drv_ctx.output_format != VDEC_YUV_FORMAT_NV12 &&
1207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat != OMX_COLOR_FormatYUV420Planar) {
1207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("update_buffer_req: Unsupported color conversion");
1208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
1208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto fail_update_buf_req;
1208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2d.close();
120842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    status = c2d.open(height,
120852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            width,
1208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            NV12_128m,dest_format);
1208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
1208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = c2d.get_buffer_size(C2D_INPUT,src_size);
1208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (status)
1209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = c2d.get_buffer_size(C2D_OUTPUT,destination_size);
1209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
1209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!src_size || src_size > omx->drv_ctx.op_buf.buffer_size ||
1209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                !destination_size) {
1209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Size mismatch in C2D src_size %d"
1209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "driver size %u destination size %d",
1209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    src_size, (unsigned int)omx->drv_ctx.op_buf.buffer_size,
1209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    destination_size);
1209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            c2d.close();
1210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req = 0;
1210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // TODO: make this fatal. Driver is not supposed to quote size
1210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //  smaller than what C2D needs !!
1210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req = destination_size;
121062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            m_c2d_height = height;
121072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            m_c2d_width = width;
1210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_update_buf_req:
1211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::set_color_format(
1211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE dest_color_format)
1211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
12118b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool status = true, drv_colorformat_c2d_enable = false;
12119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    bool dest_color_format_c2d_enable = false;
12120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    OMX_COLOR_FORMATTYPE drv_color_format = OMX_COLOR_FormatUnused;
1212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid client in color convert");
1212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
1212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12)
1212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
1212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
1212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
1213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
1213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
1213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC) {
1213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         drv_color_format = (OMX_COLOR_FORMATTYPE)
1213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
12136b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel     } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC) {
12137b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            drv_color_format = (OMX_COLOR_FORMATTYPE)
12138b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed;
1213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     } else {
1214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Incorrect color format");
1214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
1214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
12143b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    drv_colorformat_c2d_enable = (drv_color_format != dest_color_format) &&
12144b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12145b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView) &&
12146b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12147b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) &&
12148b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        (drv_color_format != (OMX_COLOR_FORMATTYPE)
12149b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed);
12150b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
12151b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    dest_color_format_c2d_enable = (dest_color_format != (OMX_COLOR_FORMATTYPE)
12152b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) &&
12153b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            (dest_color_format != (OMX_COLOR_FORMATTYPE)
12154b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed);
12155b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
12156b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (status && drv_colorformat_c2d_enable && dest_color_format_c2d_enable) {
1215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Enabling C2D");
1215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) &&
1215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) {
1216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported color format for c2d");
1216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
1216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat = dest_color_format;
1216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ?
1216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    YCbCr420P : YCbCr420SP;
1216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (enabled)
1216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                c2d.destroy();
1216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            enabled = false;
1216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!c2d.init()) {
1217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("open failed for c2d");
1217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
1217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else
1217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                enabled = true;
1217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (enabled)
1217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            c2d.destroy();
1217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enabled = false;
1217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr()
1218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->m_out_mem_ptr;
1219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return m_out_mem_ptr_client;
1219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_il_buf_hdr
1219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd)
1219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bufadd;
1220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index = 0;
1220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufadd - omx->m_out_mem_ptr;
1220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < omx->drv_ctx.op_buf.actualcount) {
1220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr_client[index].nFlags = (bufadd->nFlags & OMX_BUFFERFLAG_EOS);
1220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr_client[index].nTimeStamp = bufadd->nTimeStamp;
1221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool status;
1221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!omx->in_reconfig && !omx->output_flush_progress && bufadd->nFilledLen) {
1221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_lock(&omx->c_lock);
1221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            cache_clean_buffer(index);
1221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = c2d.convert(omx->drv_ctx.ptr_outputbuffer[index].pmem_fd,
1221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->m_out_mem_ptr->pBuffer, bufadd->pBuffer, pmem_fd[index],
1221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pmem_baseaddress[index], pmem_baseaddress[index]);
1221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!status) {
1221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed color conversion %d", status);
1221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr_client[index].nFilledLen = 0;
1222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_unlock(&omx->c_lock);
1222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return &m_out_mem_ptr_client[index];
1222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
1222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int filledLen = 0;
1222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                c2d.get_output_filled_length(filledLen);
1222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_out_mem_ptr_client[index].nFilledLen = filledLen;
1222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cache_clean_invalidate_buffer(index);
1222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_unlock(&omx->c_lock);
1222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_out_mem_ptr_client[index].nFilledLen = 0;
1223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return &m_out_mem_ptr_client[index];
1223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Index messed up in the get_il_buf_hdr");
1223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
1223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omx_vdec::allocate_color_convert_buf::get_dr_buf_hdr
1223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(OMX_BUFFERHEADERTYPE *bufadd)
1223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx) {
1224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid param get_buf_hdr");
1224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return NULL;
1224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return bufadd;
1224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index = 0;
1224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufadd - m_out_mem_ptr_client;
1224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index < omx->drv_ctx.op_buf.actualcount) {
1224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return &omx->m_out_mem_ptr[index];
1225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Index messed up in the get_dr_buf_hdr");
1225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
1225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool omx_vdec::allocate_color_convert_buf::get_buffer_req
1225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(unsigned int &buffer_size)
1225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&omx->c_lock);
1225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_size = omx->drv_ctx.op_buf.buffer_size;
1226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
1226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!c2d.get_buffer_size(C2D_OUTPUT,buffer_size)) {
1226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Get buffer size failed");
1226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto fail_get_buffer_size;
1226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfail_get_buffer_size:
1226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&omx->c_lock);
1227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::set_buffer_req(
1227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 buffer_size, OMX_U32 actual_count) {
1227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 expectedSize = enabled ? buffer_size_req : omx->drv_ctx.op_buf.buffer_size;
1227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer_size < expectedSize) {
1227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("OP Requirements: Client size(%u) insufficient v/s requested(%u)",
1227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buffer_size, expectedSize);
1228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (actual_count < omx->drv_ctx.op_buf.actualcount) {
1228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("OP Requirements: Client count(%u) insufficient v/s requested(%u)",
1228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                actual_count, omx->drv_ctx.op_buf.actualcount);
1228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool reqs_updated = false;
1228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled) {
1229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // disallow changing buffer size/count while we have active allocated buffers
1229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (allocated_count > 0) {
1229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Cannot change C2D buffer size from %u to %u with %d active allocations",
1229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    buffer_size_req, buffer_size, allocated_count);
1229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInvalidState;
1229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buffer_size_req = buffer_size;
1229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (buffer_size > omx->drv_ctx.op_buf.buffer_size) {
1230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->drv_ctx.op_buf.buffer_size = buffer_size;
1230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            reqs_updated = true;
1230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (actual_count > omx->drv_ctx.op_buf.actualcount) {
1230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.op_buf.actualcount = actual_count;
1230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        reqs_updated = true;
1230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (reqs_updated) {
1231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.extradata_info.count = omx->drv_ctx.op_buf.actualcount;
1231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->drv_ctx.extradata_info.size = omx->drv_ctx.extradata_info.count *
1231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->drv_ctx.extradata_info.buffer_size;
1231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->set_buffer_req(&(omx->drv_ctx.op_buf));
1231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::free_output_buffer(
1232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE *bufhdr)
1232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int index = 0;
1232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled)
1232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return omx->free_output_buffer(bufhdr);
1232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled && omx->is_component_secure())
1232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
1232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!allocated_count || !bufhdr) {
1232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Color convert no buffer to be freed %p",bufhdr);
1233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    index = bufhdr - m_out_mem_ptr_client;
1233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (index >= omx->drv_ctx.op_buf.actualcount) {
1233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Incorrect index color convert free_output_buffer");
1233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_fd[index] >= 0) {
1233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        munmap(pmem_baseaddress[index], buffer_size_req);
1233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(pmem_fd[index]);
1234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_fd[index] = -1;
1234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx->free_ion_memory(&op_buf_ion_info[index]);
1234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr[index].video_heap_ptr = NULL;
1234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocated_count > 0)
1234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocated_count--;
1234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
1234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocated_count = 0;
1235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!allocated_count) {
1235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&omx->c_lock);
1235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        c2d.close();
1235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        init_members();
1235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&omx->c_lock);
1235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return omx->free_output_buffer(&omx->m_out_mem_ptr[index]);
1235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
1236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,OMX_U32 bytes)
1236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = omx->allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
1236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enabled && omx->is_component_secure()) {
1236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Notin color convert mode secure_mode %d",
1236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->is_component_secure());
1237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUnsupportedSetting;
1237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!bufferHdr || bytes > buffer_size_req) {
1237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid params allocate_buffers_color_convert %p", bufferHdr);
1237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("color_convert buffer_size_req %u bytes %u",
1237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)buffer_size_req, (unsigned int)bytes);
1237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (allocated_count >= omx->drv_ctx.op_buf.actualcount) {
1237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Actual count err in allocate_buffers_color_convert");
1238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *temp_bufferHdr = NULL;
1238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    eRet = omx->allocate_output_buffer(hComp,&temp_bufferHdr,
1238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            port,appData,omx->drv_ctx.op_buf.buffer_size);
1238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone || !temp_bufferHdr) {
1238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer allocation failed color_convert");
1238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return eRet;
1238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((temp_bufferHdr - omx->m_out_mem_ptr) >=
1239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (int)omx->drv_ctx.op_buf.actualcount) {
1239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid header index %ld",
1239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               (long int)(temp_bufferHdr - omx->m_out_mem_ptr));
1239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
1239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int i = allocated_count;
1239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
1239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Allocate color-conversion buffers as cached to improve software-reading
1239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // performance of YUV (thumbnails). NOTE: These buffers will need an explicit
1239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // cache invalidation.
1240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    op_buf_ion_info[i].ion_device_fd = omx->alloc_map_ion_memory(
1240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buffer_size_req,buffer_alignment_req,
1240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            &op_buf_ion_info[i].ion_alloc_data,&op_buf_ion_info[i].fd_ion_data,
1240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ION_FLAG_CACHED);
1240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_fd[i] = op_buf_ion_info[i].fd_ion_data.fd;
1240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (op_buf_ion_info[i].ion_device_fd < 0) {
1240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("alloc_map_ion failed in color_convert");
1240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_baseaddress[i] = (unsigned char *)mmap(NULL,buffer_size_req,
1241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            PROT_READ|PROT_WRITE,MAP_SHARED,pmem_fd[i],0);
1241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_baseaddress[i] == MAP_FAILED) {
1241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("MMAP failed for Size %d",buffer_size_req);
1241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(pmem_fd[i]);
1241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->free_ion_memory(&op_buf_ion_info[i]);
1241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorInsufficientResources;
1241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr[i].video_heap_ptr = new VideoHeap (
1241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            op_buf_ion_info[i].ion_device_fd,buffer_size_req,
1242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pmem_baseaddress[i],op_buf_ion_info[i].ion_alloc_data.handle,pmem_fd[i]);
1242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info_client[i].pmem_fd = (unsigned long)m_heap_ptr[i].video_heap_ptr.get();
1242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_pmem_info_client[i].offset = 0;
1242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry_client[i].entry = (void *)&m_pmem_info_client[i];
1242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_entry_client[i].type = OMX_QCOM_PLATFORM_PRIVATE_PMEM;
1242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list_client[i].nEntries = 1;
1242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_platform_list_client[i].entryList = &m_platform_entry_client[i];
1242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pOutputPortPrivate = NULL;
1242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nAllocLen = buffer_size_req;
1243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nFilledLen = 0;
1243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nFlags = 0;
1243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
1243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nSize = sizeof(OMX_BUFFERHEADERTYPE);
1243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].nVersion.nVersion = OMX_SPEC_VERSION;
1243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pPlatformPrivate = &m_platform_list_client[i];
1243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pBuffer = pmem_baseaddress[i];
1243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_out_mem_ptr_client[i].pAppPrivate = appData;
1243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *bufferHdr = &m_out_mem_ptr_client[i];
1243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("IL client buffer header %p", *bufferHdr);
1244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    allocated_count++;
1244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
1244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::is_component_secure()
1244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return secure_mode;
1244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format)
1245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
1245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12) {
1245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->drv_ctx.decoder_format == VDEC_CODECTYPE_MVC)
1245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dest_color_format = (OMX_COLOR_FORMATTYPE)
1245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView;
1245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
1245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_UBWC){
1246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed;
12461b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        } else if (omx->drv_ctx.output_format == VDEC_YUV_FORMAT_NV12_TP10_UBWC){
12462b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel             dest_color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed;
1246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ColorFormat == OMX_COLOR_FormatYUV420Planar ||
1246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
1246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_color_format = ColorFormat;
1246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
1247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
1247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
1247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::allocate_color_convert_buf::cache_ops(
1247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int index, unsigned int cmd)
1247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
1247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
1248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!omx || index >= omx->drv_ctx.op_buf.actualcount) {
1248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("%s: Invalid param", __func__);
1248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_flush_data flush_data;
1248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_custom_data custom_data;
1248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&flush_data, 0x0, sizeof(flush_data));
1249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&custom_data, 0x0, sizeof(custom_data));
1249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.vaddr = pmem_baseaddress[index];
1249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.fd = op_buf_ion_info[index].fd_ion_data.fd;
1249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.handle = op_buf_ion_info[index].fd_ion_data.handle;
1249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    flush_data.length = buffer_size_req;
1249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    custom_data.cmd = cmd;
1249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    custom_data.arg = (unsigned long)&flush_data;
1249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Cache %s: fd=%d handle=%d va=%p size=%d",
1250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
1250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            flush_data.fd, flush_data.handle, flush_data.vaddr,
1250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            flush_data.length);
1250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = ioctl(op_buf_ion_info[index].ion_device_fd, ION_IOC_CUSTOM, &custom_data);
1250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret < 0) {
1250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Cache %s failed: %s\n",
1250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (cmd == ION_IOC_CLEAN_CACHES) ? "Clean" : "Invalidate",
1250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                strerror(errno));
1250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
1251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_add(int nPortIndex)
1251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long i = 0;
1251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool buf_present = false;
1251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    long fd = drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd;
1251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 offset = drv_ctx.ptr_outputbuffer[nPortIndex].offset;
1252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dynamic_buf_mode || !out_dynamic_list) {
1252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //check the buffer fd, offset, uv addr with list contents
1252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //If present increment reference.
1252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((out_dynamic_list[i].fd == fd) &&
1253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (out_dynamic_list[i].offset == offset)) {
1253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("buf_ref_add: [ALREADY PRESENT] fd = %u ref_count = %u",
1253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (!secure_mode) {
1253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = out_dynamic_list[i].buffaddr;
1253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
1253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               buf_present = true;
1253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
1253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!buf_present) {
1254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //search for a entry to insert details of the new buffer
1254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (out_dynamic_list[i].dup_fd < 0) {
1254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].fd = fd;
1254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].offset = offset;
1254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].dup_fd = dup(fd);
1254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                out_dynamic_list[i].ref_count++;
1254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("buf_ref_add: [ADDED] fd = %u ref_count = %u",
1254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!secure_mode) {
1255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr =
1255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_U8*)mmap(0, drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len,
1255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          PROT_READ|PROT_WRITE, MAP_SHARED,
1255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          drv_ctx.ptr_outputbuffer[nPortIndex].pmem_fd, 0);
1255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    //mmap returns (void *)-1 on failure and sets error code in errno.
1255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr == MAP_FAILED) {
1255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("buf_ref_add: mmap failed - errno: %d", errno);
1255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr = NULL;
1256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
1256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    out_dynamic_list[i].buffaddr = drv_ctx.ptr_outputbuffer[nPortIndex].bufferaddr;
1256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    out_dynamic_list[i].mapped_size = drv_ctx.ptr_outputbuffer[nPortIndex].buffer_len;
1256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("mmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
1256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
1256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   pthread_mutex_unlock(&m_lock);
1257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::buf_ref_remove()
1257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long i = 0;
1257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dynamic_buf_mode || !out_dynamic_list) {
1257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&m_lock);
1258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < drv_ctx.op_buf.actualcount; i++) {
1258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!secure_mode && out_dynamic_list[i].buffaddr && out_dynamic_list[i].mapped_size) {
1258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("munmap: %p %ld", out_dynamic_list[i].buffaddr, out_dynamic_list[i].mapped_size);
1258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap(out_dynamic_list[i].buffaddr,
1258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        out_dynamic_list[i].mapped_size);
1258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_LOW("buf_ref_remove: [REMOVED] fd = %u ref_count = %u",
1259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (unsigned int)out_dynamic_list[i].fd, (unsigned int)out_dynamic_list[i].ref_count);
1259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         close(out_dynamic_list[i].dup_fd);
1259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         out_dynamic_list[i].dup_fd = -1;
1259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&m_lock);
1259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (out_dynamic_list) {
1259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(out_dynamic_list);
1259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        out_dynamic_list = NULL;
1259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
1260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::send_codec_config() {
1260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_config_flag) {
1260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p1 = 0; // Parameter - 1
1260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long p2 = 0; // Parameter - 2
1260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long ident = 0;
1260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&m_lock);
1260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n");
1261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        while (m_etb_q.m_size) {
1261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_etb_q.pop_entry(&p1,&p2,&ident);
1261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ident == OMX_COMPONENT_GENERATE_ETB_ARBITRARY) {
1261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy_arbitrary((OMX_HANDLETYPE)p1,\
1261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
1261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy_arbitrary failure");
1261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx_report_error();
1261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
1262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("\n Flush Input Heap Buffer %p",(OMX_BUFFERHEADERTYPE *)p2);
1262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_cb.EmptyBufferDone(&m_cmp ,m_app_data, (OMX_BUFFERHEADERTYPE *)p2);
1262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (ident == OMX_COMPONENT_GENERATE_ETB) {
1262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\
1262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) {
1262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure");
1262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        omx_report_error ();
1262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
1263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pending_input_buffers++;
12632b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers);
1263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_ETB %p, pending_input_buffers %d",
1263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_BUFFERHEADERTYPE *)p2, pending_input_buffers);
1263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2);
1263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (ident == OMX_COMPONENT_GENERATE_EBD) {
1263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("\n Flush Input OMX_COMPONENT_GENERATE_EBD %p",
1263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_BUFFERHEADERTYPE *)p1);
1264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1);
1264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
1264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&m_lock);
1264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
1264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::perf_control()
1264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lib = NULL;
1265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_handle = 0;
1265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock_acquire = NULL;
1265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock_release = NULL;
1265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_control::~perf_control()
1265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_handle != 0 && m_perf_lock_release) {
1265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("NOTE2: release perf lock");
1266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release(m_perf_handle);
1266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib) {
1266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(m_perf_lib);
1266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct omx_vdec::perf_control::mpctl_stats omx_vdec::perf_control::mpctl_obj = {0, 0, 0};
1266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_vdec::perf_lock omx_vdec::perf_control::m_perf_lock;
1267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::send_hint_to_mpctl(bool state)
1267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (load_lib() == false) {
1267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return;
1267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock.lock();
1267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* 0x4401 maps to video decode playback hint
1267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * in perflock, enum number is 44 and state
1267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * being sent on perflock acquire is 01 (true)
1268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
1268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int arg = 0x4401;
1268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (state == true) {
1268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_inst_count++;
1268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (state == false) {
1268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_inst_count--;
1268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lock_acquire && mpctl_obj.vid_inst_count == 1 && mpctl_obj.vid_acquired == false) {
1269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_disp_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int));
1269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_acquired = true;
1269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Video slvp perflock acquired");
1269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_perf_lock_release && (mpctl_obj.vid_inst_count == 0 || mpctl_obj.vid_inst_count > 1) && mpctl_obj.vid_acquired == true) {
1269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release(mpctl_obj.vid_disp_handle);
1269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mpctl_obj.vid_acquired = false;
1269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Video slvp perflock released");
1269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lock.unlock();
1269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::perf_control::request_cores(int frame_duration_us)
1270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frame_duration_us > MIN_FRAME_DURATION_FOR_PERF_REQUEST_US) {
1270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool retVal = load_lib();
1270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (retVal && m_perf_lock_acquire && m_perf_handle == 0) {
1270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int arg = 0x700 /*base value*/ + 2 /*cores*/;
1270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_handle = m_perf_lock_acquire(m_perf_handle, 0, &arg, sizeof(arg)/sizeof(int));
1271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_handle) {
1271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("perf lock acquired");
1271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_vdec::perf_control::load_lib()
1271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char perf_lib_path[PROPERTY_VALUE_MAX] = {0};
1271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib)
1272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
1272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) {
1272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library");
1272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto handle_err;
1272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) {
1272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror());
1272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        goto handle_err;
1273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq");
1273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_lock_acquire == NULL) {
1273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq");
1273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto handle_err;
1273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel");
1273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_perf_lock_release == NULL) {
1273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel");
1273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto handle_err;
1274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
1274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelhandle_err:
1274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_perf_lib) {
1274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(m_perf_lib);
1274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_perf_lib = NULL;
1274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return false;
1275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::enable_adaptive_playback(unsigned long nMaxFrameWidth,
1275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            unsigned long nMaxFrameHeight)
1275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
1275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
1275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret = 0;
1275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long min_res_buf_count = 0;
1275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    eRet = enable_smoothstreaming();
1276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet != OMX_ErrorNone) {
1276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Failed to enable Adaptive Playback on driver");
1276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_HIGH("Enabling Adaptive playback for %lu x %lu",
1276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             nMaxFrameWidth,
1276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             nMaxFrameHeight);
1276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_mode = true;
1277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_width = nMaxFrameWidth;
1277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     m_smoothstreaming_height = nMaxFrameHeight;
1277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     //Get upper limit buffer count for min supported resolution
1277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     struct v4l2_format fmt;
1277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.height = m_decoder_capability.min_height;
1277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.width = m_decoder_capability.min_width;
1277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.pixelformat = output_capability;
1277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (ret) {
1278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Set Resolution failed for HxW = %ux%u",
1278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_decoder_capability.min_height,
1278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_decoder_capability.min_width);
1278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return OMX_ErrorUnsupportedSetting;
1278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req");
1279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     min_res_buf_count = drv_ctx.op_buf.mincount;
1279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer count = %lu for HxW %ux%u",
1279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     min_res_buf_count, m_decoder_capability.min_height, m_decoder_capability.min_width);
1279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12798fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nLeft = 0;
12799fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nTop = 0;
12800fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nWidth = m_smoothstreaming_width;
12801fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel     m_extradata_info.output_crop_rect.nHeight = m_smoothstreaming_height;
12802fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
1280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     update_resolution(m_smoothstreaming_width, m_smoothstreaming_height,
1280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       m_smoothstreaming_width, m_smoothstreaming_height);
1280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = is_video_session_supported();
1280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("video session is not supported");
1280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     //Get upper limit buffer size for max smooth streaming resolution set
1281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.height = drv_ctx.video_resolution.frame_height;
1281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.width = drv_ctx.video_resolution.frame_width;
1281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     fmt.fmt.pix_mp.pixelformat = output_capability;
1281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_S_FMT, &fmt);
1281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (ret) {
1281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("Set Resolution failed for adaptive playback");
1281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return OMX_ErrorUnsupportedSetting;
1282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req!!");
1282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_LOW("enable adaptive - upper limit buffer size = %u",
1282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (unsigned int)drv_ctx.op_buf.buffer_size);
1282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.mincount = min_res_buf_count;
1283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.actualcount = min_res_buf_count;
1283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     drv_ctx.op_buf.buffer_size = drv_ctx.op_buf.buffer_size;
1283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = set_buffer_req(&drv_ctx.op_buf);
1283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to set_buffer_req");
1283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     eRet = get_buffer_req(&drv_ctx.op_buf);
1284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     if (eRet != OMX_ErrorNone) {
1284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("failed to get_buffer_req!!!");
1284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         return eRet;
1284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     }
1284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_HIGH("adaptive playback enabled, buf count = %u bufsize = %u",
1284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      drv_ctx.op_buf.mincount, (unsigned int)drv_ctx.op_buf.buffer_size);
1284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     return eRet;
1284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//static
1285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_vdec::describeColorFormat(OMX_PTR pParam) {
1285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef FLEXYUV_SUPPORTED
1285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorUndefined;
1285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
1285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pParam == NULL) {
1285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("describeColorFormat: invalid params");
1285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
1285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DescribeColorFormatParams *params = (DescribeColorFormatParams*)pParam;
1286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MediaImage *img = &(params->sMediaImage);
1286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch(params->eColorFormat) {
1286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m:
1286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
1286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
1286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mNumPlanes = 3;
1286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // mWidth and mHeight represent the W x H of the largest plane
1287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // In our case, this happens to be the Stride x Scanlines of Y plane
1287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mWidth = params->nFrameWidth;
1287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mHeight = params->nFrameHeight;
1287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            size_t planeWidth = VENUS_Y_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            size_t planeHeight = VENUS_Y_SCANLINES(COLOR_FMT_NV12, params->nFrameHeight);
1287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mBitDepth = 8;
1287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 0 (Y)
1287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mOffset = 0;
1287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mColInc = 1;
1287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mRowInc = planeWidth; //same as stride
1288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mHorizSubsampling = 1;
1288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::Y].mVertSubsampling = 1;
1288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 1 (U)
1288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mOffset = planeWidth * planeHeight;
1288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mColInc = 2;           //interleaved UV
1288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mRowInc =
1288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mHorizSubsampling = 2;
1288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::U].mVertSubsampling = 2;
1288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Plane 2 (V)
1289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mOffset = planeWidth * planeHeight + 1;
1289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mColInc = 2;           //interleaved UV
1289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mRowInc =
1289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VENUS_UV_STRIDE(COLOR_FMT_NV12, params->nFrameWidth);
1289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mHorizSubsampling = 2;
1289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mPlane[MediaImage::V].mVertSubsampling = 2;
1289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
1289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420Planar:
1290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420SemiPlanar:
1290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // We need not describe the standard OMX linear formats as these are
1290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // understood by client. Fail this deliberately to let client fill-in
1290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorUnsupportedSetting;
1290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
1290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Rest all formats which are non-linear cannot be described
1290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("color-format %x is not flexible", params->eColorFormat);
1290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
1290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorNone;
1291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
1291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("NOTE: Describe color format : %x", params->eColorFormat);
1291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("  FrameWidth x FrameHeight : %d x %d", params->nFrameWidth, params->nFrameHeight);
1291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("  YWidth x YHeight : %d x %d", img->mWidth, img->mHeight);
1291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (size_t i = 0; i < img->mNumPlanes; ++i) {
1291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("  Plane[%zu] : offset=%d / xStep=%d / yStep = %d",
1291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                i, img->mPlane[i].mOffset, img->mPlane[i].mColInc, img->mPlane[i].mRowInc);
1291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
1292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //FLEXYUV_SUPPORTED
1292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
1292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_vdec::prefetchNewBuffers() {
1292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_decoder_cmd dec;
1292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t prefetch_count;
1292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t prefetch_size;
1292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t want_size;
1292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t have_size;
1293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int color_fmt, rc;
1293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_calculated_size;
1293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_buffer_size;
1293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t new_buffer_count;
1293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t old_buffer_size;
1293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t old_buffer_count;
1293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&dec, 0 , sizeof(dec));
1293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Old size : %zu, count : %d, width : %u, height : %u\n",
1293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.op_buf.buffer_size, drv_ctx.op_buf.actualcount,
1294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_width,
1294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            drv_ctx.video_resolution.frame_height);
1294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dec.cmd = V4L2_DEC_QCOM_CMD_RECONFIG_HINT;
1294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec)) {
1294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Buffer info cmd failed : %d\n", errno);
1294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
1294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("From driver, new size is %d, count is %d\n",
1294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dec.raw.data[0], dec.raw.data[1]);
1294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)drv_ctx.output_format) {
1295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VDEC_YUV_FORMAT_NV12:
1295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = COLOR_FMT_NV12;
1295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
1295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case VDEC_YUV_FORMAT_NV12_UBWC:
1295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = COLOR_FMT_NV12_UBWC;
1295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
12957b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    case VDEC_YUV_FORMAT_NV12_TP10_UBWC:
12958b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        color_fmt = COLOR_FMT_NV12_BPP10_UBWC;
12959b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        break;
1296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
1296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_fmt = -1;
1296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Color format : %x not supported for secure memory prefetching\n", drv_ctx.output_format);
1296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return;
1296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_calculated_size = VENUS_BUFFER_SIZE(color_fmt, m_reconfig_width, m_reconfig_height);
1296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("New calculated size for width : %d, height : %d, is %d\n",
1296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_reconfig_width, m_reconfig_height, new_calculated_size);
1296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_size = (dec.raw.data[0] > new_calculated_size) ? dec.raw.data[0] : new_calculated_size;
1297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_count = dec.raw.data[1];
1297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    old_buffer_size = drv_ctx.op_buf.buffer_size;
1297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    old_buffer_count = drv_ctx.op_buf.actualcount;
1297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count;
1297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prefetch_count = new_buffer_count;
1297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prefetch_size = new_buffer_size - old_buffer_size;
1297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    want_size = new_buffer_size * new_buffer_count;
1297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    have_size = old_buffer_size * old_buffer_count;
1298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (want_size > have_size) {
1298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Want: %d, have : %d\n", want_size, have_size);
1298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("prefetch_count: %d, prefetch_size : %d\n", prefetch_count, prefetch_size);
1298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ion_fd = open(MEM_DEVICE, O_RDONLY);
1298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ion_fd < 0) {
1298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd);
1298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return;
1298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data));
1299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data));
1299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions));
1299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count);
1299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) {
1299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("prefetch data allocation failed");
1299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            goto prefetch_exit;
1299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (uint32_t i = 0; i < prefetch_count; i++) {
1300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizes[i] = prefetch_size;
1300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].nr_sizes = prefetch_count;
1300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].sizes = sizes;
1300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        regions[0].vmid = ION_FLAG_CP_PIXEL;
1300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->nr_regions = 1;
1301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->regions = regions;
1301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        prefetch_data->heap_id = ION_HEAP(ION_SECURE_HEAP_ID);
1301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        custom_data->cmd = ION_IOC_PREFETCH;
1301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        custom_data->arg = (unsigned long )prefetch_data;
1301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data);
1301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
1301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno);
1301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelprefetch_exit:
1302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(ion_fd);
1302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(sizes);
1302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(regions);
1302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(prefetch_data);
1302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(custom_data);
1302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
1302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
13029