111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2013-2014, The Linux Foundation. All rights reserved.
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  Redistribution and use in source and binary forms, with or without
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  modification, are permitted provided that the following conditions
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  are met:
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions of source code must retain the above copyright
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  notice, this list of conditions and the following disclaimer.
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions in binary form must reproduce the above
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  copyright notice, this list of conditions and the following
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      disclaimer in the documentation and/or other materials provided
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      with the distribution.
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Neither the name of The Linux Foundation nor the names of its
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      contributors may be used to endorse or promote products derived
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      from this software without specific prior written permission.
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef __OMX_VDPP_H__
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define __OMX_VDPP_H__
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*============================================================================
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            O p e n M A X   Component
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                Video Decoder
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//** @file omx_vdpp.h
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  This module contains the class definition for openMAX video post-processing component.
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//*========================================================================*/
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//                             Include Files
4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h>
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdio.h>
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h>
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <inttypes.h>
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cstddef>
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <math.h>
5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define LOG_TAG "OMX-VDPP"
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/msm_ion.h>
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <binder/MemoryHeapBase.h>
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <ui/ANativeObjectBase.h>
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C"{
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <utils/Log.h>
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/videodev2.h>
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <poll.h>
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define TIMEOUT 5000
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_LOW(x, ...) ALOGV("[Entry] "x, ##__VA_ARGS__)
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_HIGH(x, ...) ALOGV("[Step] "x, ##__VA_ARGS__)
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_ERROR(x, ...) ALOGE("[Error] "x, ##__VA_ARGS__)
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*#define DEBUG_PRINT_LOW(x, ...)
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_HIGH(x, ...)
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_ERROR(x, ...) */
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //_ANDROID_
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_LOW printf
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_HIGH printf
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_ERROR printf
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h>
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_ICS_)
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <pthread.h>
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PC_DEBUG
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <semaphore.h>
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_Core.h"
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_QCOMExtns.h"
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_CoreExt.h"
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_IndexExt.h"
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "qc_omx_component.h"
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/android_pmem.h>
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <dlfcn.h>
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_vpu.h>
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C" {
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  OMX_API void * get_omx_component_factory_fn(void); //used by qc_omx_core
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    using namespace android;
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//                       Module specific globals
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_SPEC_VERSION  0x00000101
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// #define OUTPUT_BUFFER_LOG 1
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// #define INPUT_BUFFER_LOG  1
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//               Macros
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned) bufHdr,\
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// BitMask Management logic
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITS_PER_BYTE        32
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        &=  ~(BITMASK_FLAG(mIndex))
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        |=  BITMASK_FLAG(mIndex)
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        & BITMASK_FLAG(mIndex))
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        & BITMASK_FLAG(mIndex)) == 0x0)
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        & BITMASK_FLAG(mIndex))
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        & BITMASK_FLAG(mIndex)) == 0x0)
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_CONTROL_CMDQ_SIZE   200//100
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_QCIF_HEIGHT         144
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_QCIF_WIDTH          176
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_VGA_HEIGHT          480
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_VGA_WIDTH           640
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_WVGA_HEIGHT         480
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_WVGA_WIDTH          800
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_NUM_INPUT_OUTPUT_BUFFERS 32
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEINFO_EXTRADATA 0x00010000
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_INTERLACE_EXTRADATA 0x00020000
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_TIMEINFO_EXTRADATA  0x00040000
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_PORTDEF_EXTRADATA   0x00080000
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_EXTNUSER_EXTRADATA  0x00100000
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DRIVER_EXTRADATA_MASK   0x0000FFFF
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VALID_TS(ts)      ((ts < LLONG_MAX)? true : false)
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* STATUS CODES */
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Base value for status codes */
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_BASE	0x40000000
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Success */
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_SUCCESS	(VDPP_S_BASE)
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* General failure */
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_EFAIL	(VDPP_S_BASE + 1)
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Fatal irrecoverable  failure. Need to  tear down session. */
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_EFATAL   (VDPP_S_BASE + 2)
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Error detected in the passed  parameters */
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_EBADPARAM	(VDPP_S_BASE + 3)
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Command called in invalid  state. */
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_EINVALSTATE	(VDPP_S_BASE + 4)
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Insufficient OS  resources - thread, memory etc. */
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ENOSWRES	(VDPP_S_BASE + 5)
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Insufficient HW resources -  core capacity  maxed  out. */
19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ENOHWRES	(VDPP_S_BASE + 6)
19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Invalid command  called */
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_EINVALCMD	(VDPP_S_BASE + 7)
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Command timeout. */
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ETIMEOUT	(VDPP_S_BASE + 8)
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Pre-requirement is  not met for API. */
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ENOPREREQ	(VDPP_S_BASE + 9)
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Command queue is full. */
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ECMDQFULL	(VDPP_S_BASE + 10)
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Command is not supported  by this driver */
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ENOTSUPP	(VDPP_S_BASE + 11)
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Command is not implemented by thedriver. */
20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_ENOTIMPL	(VDPP_S_BASE + 12)
20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Command is not implemented by the driver.  */
20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_BUSY	(VDPP_S_BASE + 13)
20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_S_INPUT_BITSTREAM_ERR (VDPP_S_BASE + 14)
20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_INTF_VER	1
20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_BASE	0x0000000
20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* Codes to identify asynchronous message responses and events that driver
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  wants to communicate to the app.*/
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_INVALID	(VDPP_MSG_BASE + 0)
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_INPUT_BUFFER_DONE	(VDPP_MSG_BASE + 1)
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_OUTPUT_BUFFER_DONE	(VDPP_MSG_BASE + 2)
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_INPUT_FLUSHED	(VDPP_MSG_BASE + 3)
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_OUTPUT_FLUSHED	(VDPP_MSG_BASE + 4)
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_FLUSH_INPUT_DONE	(VDPP_MSG_BASE + 5)
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_FLUSH_OUTPUT_DONE	(VDPP_MSG_BASE + 6)
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_START_DONE	(VDPP_MSG_BASE + 7)
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_STOP_DONE	(VDPP_MSG_BASE + 8)
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_PAUSE_DONE	(VDPP_MSG_BASE + 9)
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_RESUME_DONE	(VDPP_MSG_BASE + 10)
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_RESP_RESOURCE_LOADED	(VDPP_MSG_BASE + 11)
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_EVT_RESOURCES_LOST	(VDPP_MSG_BASE + 12)
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_EVT_CONFIG_CHANGED	(VDPP_MSG_BASE + 13)
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_EVT_HW_ERROR	(VDPP_MSG_BASE + 14)
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_EVT_INFO_CONFIG_CHANGED	(VDPP_MSG_BASE + 15)
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_EVT_INFO_FIELD_DROPPED	(VDPP_MSG_BASE + 16)
22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS	(VDPP_MSG_BASE + 17)
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VP_INPUT_BUFFER_COUNT_INTERLACE 4
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VP_OUTPUT_BUFFER_COUNT 4
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VDPP_SESSION 1
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//#define STUB_VPU 1
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum port_indexes
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CORE_INPUT_PORT_INDEX        =0,
24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CORE_OUTPUT_PORT_INDEX       =1
24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_ion
24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_device_fd;
24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_fd_data fd_ion_data;
24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_allocation_data ion_alloc_data;
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct extradata_buffer_info {
25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	int buffer_size;
25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	char* uaddr;
25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	int count;
25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	int size;
25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	struct vdpp_ion ion;
26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_picsize {
26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t frame_width;
26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t frame_height;
26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t stride;
26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t scan_lines;
26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum vdpp_interlaced_format {
27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	VDPP_InterlaceFrameProgressive = 0x1,
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	VDPP_InterlaceInterleaveFrameTopFieldFirst = 0x2,
27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	VDPP_InterlaceInterleaveFrameBottomFieldFirst = 0x4
27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum vdpp_buffer {
27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	VDPP_BUFFER_TYPE_INPUT,
27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	VDPP_BUFFER_TYPE_OUTPUT
27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_allocatorproperty {
28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	enum vdpp_buffer buffer_type;
28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t mincount;
28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t maxcount;
28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t actualcount;
28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t buffer_size;
28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t alignment;
28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t buf_poolid;
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t frame_size;
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_bufferpayload {
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	void *bufferaddr;
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t buffer_len;
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	int pmem_fd;
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t offset;
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t mmaped_size;
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_framesize {
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t   left;
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t   top;
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t   right;
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t   bottom;
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_setbuffer_cmd {
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	enum vdpp_buffer buffer_type;
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	struct vdpp_bufferpayload buffer;
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_output_frameinfo {
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	void *bufferaddr;
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t offset;
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t len;
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t flags;
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	int64_t time_stamp;
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	void *client_data;
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	struct vdpp_framesize framesize;
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunion vdpp_msgdata {
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_rect ar_result;
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	struct vdpp_output_frameinfo output_frame;
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	void *input_frame_clientdata;
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_msginfo {
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t status_code;
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	uint32_t msgcode;
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	union vdpp_msgdata msgdata;
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t msgdatasize;
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdpp_framerate {
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	unsigned long fps_denominator;
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	unsigned long fps_numerator;
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltypedef struct vcap_etb_ftb_info
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int etb_cnt; // only simulate 1-to-1
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    __u32	etb_index;
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t  etb_len;
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ftb_cnt;
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    __u32   ftb_index;
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	size_t  ftb_len;
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}vcap_etb_ftb_info;
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct video_vpu_context
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int video_vpu_fd;
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    uint32_t output_format;
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum   v4l2_field interlace;
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_picsize video_resolution_input;
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_picsize video_resolution_output;
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_allocatorproperty ip_buf;
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_allocatorproperty op_buf;
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_bufferpayload *ptr_inputbuffer;
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_bufferpayload *ptr_outputbuffer;
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_output_frameinfo *ptr_respbuffer;
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_ion *ip_buf_ion_info;
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_ion *op_buf_ion_info;
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_framerate frame_rate;
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool timestamp_adjust;
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char kind[128];
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	struct extradata_buffer_info extradata_info;
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int input_num_planes;
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int output_num_planes;
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    double input_bytesperpixel[2];
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    double output_bytesperpixel[2];
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int sessionsSupported;
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int sessionAttached;
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef STUB_VPU
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool thread_exit;
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vcap_etb_ftb_info etb_ftb_info;
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_t             async_lock;
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltypedef struct _VdppExtensionData_t
38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool                           activeRegionDetectionDirtyFlag;
38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    QOMX_ACTIVEREGIONDETECTIONTYPE activeRegionDetection;
39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool                                  activeRegionDetectionStatusDirtyFlag;
39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    QOMX_ACTIVEREGIONDETECTION_STATUSTYPE activeRegionDetectionStatus;
39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool                  scalingModeDirtyFlag;
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    QOMX_SCALINGMODETYPE  scalingMode;
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool                    noiseReductionDirtyFlag;
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    QOMX_NOISEREDUCTIONTYPE noiseReduction;
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool                      imageEnhancementDirtyFlag;
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    QOMX_IMAGEENHANCEMENTTYPE imageEnhancement;
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} VdppExtensionData_t;
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// OMX video decoder class
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelclass omx_vdpp: public qc_omx_component
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelpublic:
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_vdpp();  // constructor
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    virtual ~omx_vdpp();  // destructor
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    static int async_message_process (void *context, void* message);
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    static void process_event_cb(void *ctxt,unsigned char id);
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct omx_event
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned param1;
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned param2;
41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned id;
41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct omx_cmd_queue
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned m_read;
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned m_write;
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned m_size;
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_cmd_queue();
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ~omx_cmd_queue();
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool insert_entry(unsigned p1, unsigned p2, unsigned id);
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // get msgtype of the first ele from the queue
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned get_q_msg_type();
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE allocate_buffer(
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_HANDLETYPE hComp,
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_BUFFERHEADERTYPE **bufferHdr,
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_U32 port,
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PTR appData,
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_U32 bytes
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                  );
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE component_init(OMX_STRING role);
44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE component_role_enum(
44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_HANDLETYPE hComp,
44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U8 *role,
44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_U32 index
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      );
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE component_tunnel_request(
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_HANDLETYPE hComp,
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_U32 port,
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_HANDLETYPE  peerComponent,
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_U32 peerPort,
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                            OMX_TUNNELSETUPTYPE *tunnelSetup
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                           );
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE empty_this_buffer(
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_HANDLETYPE hComp,
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_BUFFERHEADERTYPE *buffer
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    );
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE fill_this_buffer(
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_HANDLETYPE hComp,
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_BUFFERHEADERTYPE *buffer
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   );
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE free_buffer(
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_HANDLETYPE hComp,
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_U32 port,
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_BUFFERHEADERTYPE *buffer
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              );
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE get_component_version(
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_HANDLETYPE hComp,
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_STRING componentName,
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_VERSIONTYPE *componentVersion,
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_VERSIONTYPE *specVersion,
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_UUIDTYPE *componentUUID
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        );
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE get_config(
48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_HANDLETYPE hComp,
48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_INDEXTYPE configIndex,
48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              OMX_PTR configData
49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             );
49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE get_extension_index(
49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      OMX_HANDLETYPE hComp,
49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      OMX_STRING paramName,
49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      OMX_INDEXTYPE *indexType
49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                      );
49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_INDEXTYPE  paramIndex,
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_PTR        paramData);
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            OMX_STATETYPE *state);
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_COMMANDTYPE cmd,
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_U32         param1,
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               OMX_PTR         cmdData);
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_CALLBACKTYPE *callbacks,
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_PTR          appData);
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_INDEXTYPE  configIndex,
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PTR        configData);
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_INDEXTYPE  paramIndex,
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_PTR        paramData);
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_BUFFERHEADERTYPE **bufferHdr,
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_U32              port,
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_PTR              appData,
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_U32              bytes,
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             OMX_U8               *buffer);
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE  use_input_heap_buffers(
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_HANDLETYPE            hComp,
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_BUFFERHEADERTYPE** bufferHdr,
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_U32                   port,
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_PTR                   appData,
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_U32                   bytes,
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_U8*                   buffer);
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE  use_input_buffers(
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_HANDLETYPE            hComp,
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_BUFFERHEADERTYPE** bufferHdr,
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_U32                   port,
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_PTR                   appData,
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_U32                   bytes,
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          OMX_U8*                   buffer);
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_BUFFERHEADERTYPE **bufferHdr,
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_U32              port,
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                OMX_PTR              appData,
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                void *               eglImage);
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void complete_pending_buffer_done_cbs();
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct video_vpu_context drv_ctx;
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int update_resolution(uint32_t width, uint32_t height, uint32_t stride, uint32_t scan_lines);
55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int  m_pipe_in;
55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int  m_pipe_out;
56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int  m_ctrl_in;
56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int  m_ctrl_out;
56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_t msg_thread_id;
56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_t async_thread_id;
56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue m_index_q_ftb;
56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue m_index_q_etb;
56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool m_ar_callback_setup;
56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelprivate:
56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Bit Positions
57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum flags_bit_positions
57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Defer transition to IDLE
57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_IDLE_PENDING            =0x1,
57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Defer transition to LOADING
57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_LOADING_PENDING         =0x2,
57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // First  Buffer Pending
57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Second Buffer Pending
57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Defer transition to Enable
58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Defer transition to Enable
58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Defer transition to Disable
58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Defer transition to Disable
58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //defer flush notification
58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_PAUSE_PENDING          =0xB,
59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_EXECUTE_PENDING        =0xC,
59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Deferred callback identifiers
59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum
59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Event Callbacks from the vidpp component thread context
60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_EVENT       = 0x1,
60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Buffer Done callbacks from the vidpp component thread context
60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Frame Done callbacks from the vidpp component thread context
60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Buffer Done callbacks from the vidpp component thread context
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_FTB         = 0x4,
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Frame Done callbacks from the vidpp component thread context
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_ETB         = 0x5,
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Command
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Push-Pending Buffers
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Empty Buffer Done callbacks
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_EBD         = 0x8,
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Flush Event Callbacks from the vidpp component thread context
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_FBD = 0xc,
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_START_DONE = 0xD,
62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // extensions
63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS = 0x18,
63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_ports
63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        CAPTURE_PORT,
64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OUTPUT_PORT,
64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        MAX_PORT
64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ts_entry
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_TICKS timestamp;
64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool valid;
64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ts_arr_list
65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts_arr_list();
65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ~ts_arr_list();
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool insert_ts(OMX_TICKS ts);
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool pop_min_ts(OMX_TICKS &ts);
66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool reset_ts_list();
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool allocate_done(void);
66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool allocate_input_done(void);
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool allocate_output_done(void);
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void free_output_buffer_header();
67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void free_input_buffer_header();
67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             OMX_BUFFERHEADERTYPE **bufferHdr,
67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             OMX_U32              port,
67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             OMX_PTR              appData,
67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                             OMX_U32              bytes);
67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_BUFFERHEADERTYPE **bufferHdr,
68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_U32              port,
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_PTR              appData,
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_U32              bytes);
68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         OMX_BUFFERHEADERTYPE **bufferHdr,
68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         OMX_U32 port,OMX_PTR appData,
68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                         OMX_U32              bytes);
68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_BUFFERHEADERTYPE   **bufferHdr,
69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_U32                port,
69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_PTR                appData,
69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_U32                bytes,
69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                   OMX_U8                 *buffer);
69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE allocate_output_headers();
69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool execute_omx_flush(OMX_U32);
69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool execute_output_flush();
69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool execute_input_flush();
70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_BUFFERHEADERTYPE * buffer);
70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_BUFFERHEADERTYPE * buffer);
70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        OMX_BUFFERHEADERTYPE *buffer);
70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                       OMX_BUFFERHEADERTYPE *buffer);
71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool release_done();
71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool release_output_done();
71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool release_input_done();
71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE get_buffer_req(vdpp_allocatorproperty *buffer_prop);
71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE set_buffer_req(vdpp_allocatorproperty *buffer_prop);
71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE start_port_reconfig();
71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int stream_off(OMX_U32 port);
71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void adjust_timestamp(OMX_S64 &act_timestamp);
72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void set_frame_rate(OMX_S64 act_timestamp);
72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            OMX_U32 alignment);
72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int alloc_map_ion_memory(OMX_U32 buffer_size,
72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              struct ion_fd_data *fd_data,int flag);
72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void free_ion_memory(struct vdpp_ion *buf_ion_info);
73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_COMMANDTYPE cmd,
73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_U32         param1,
73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                     OMX_PTR         cmdData);
73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool post_event( unsigned int p1,
73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     unsigned int p2,
73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     unsigned int id
74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    );
74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void setFormatParams(int pixelFormat, double bytesperpixel[], unsigned char *planesCount);
74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int openInput(const char* inputName);
74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /**
74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * int clip2 - return an integer value in 2 to the nth power
74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * legacy code from video decoder  (rounded up till 256)
74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *
75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      */
75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    inline int clip2(int x)
75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        x = x -1;
75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        x = x | x >> 1;
75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        x = x | x >> 2;
75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        x = x | x >> 4;
75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        x = x | x >> 16;
75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        x = x + 1;
75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return x;
76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /**
76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * int paddedFrameWidth - return frame width in a multiple of 128 (rounded up).
76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *
76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * @width - the original frame width.
76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      */
76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    inline int paddedFrameWidth128(int width)
76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return  (((width + 127) / 128 )* 128);
76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /**
77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * int paddedFrameWidth32 - return frame width in a multiple of 32 (rounded up).
77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *
77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * @width - the original frame width.
77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      */
77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    inline int paddedFrameWidth32(int width)
77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return  (((width + 31) / 32 )* 32);
77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /**
78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * int roundToNearestInt - round to nearest integer value.
78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *
78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      * @value - the decimal value to be rounded to nearest integer.
78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      */
78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    inline int roundToNearestInt(double value)
78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	    if((ceil(value) - value) > 0.5)
78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel		    return floor(value);
79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	    else
79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel		    return ceil(value);
79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    inline void omx_report_error ()
79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_cb.EventHandler && !m_error_propogated)
79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ALOGE("\nERROR: Sending OMX_EventError to Client");
79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_error_propogated = true;
80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EventHandler(&m_cmp,m_app_data,
80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  OMX_EventError,OMX_ErrorHardware,0,NULL);
80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    inline void omx_report_unsupported_setting ()
80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_cb.EventHandler && !m_error_propogated)
80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR(
81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               "\nERROR: Sending OMX_ErrorUnsupportedSetting to Client");
81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_error_propogated = true;
81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_cb.EventHandler(&m_cmp,m_app_data,
81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_ICS_)
82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct nativebuffer{
82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        native_handle_t *nativehandle;
82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	private_handle_t *privatehandle;
82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int inuse;
82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    };
82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //*************************************************************
83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //*******************MEMBER VARIABLES *************************
83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //*************************************************************
83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_t       m_lock;
83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //sem to handle the minimum procesing of commands
83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sem_t                 m_cmd_lock;
83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool              m_error_propogated;
83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // OMX State
83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STATETYPE m_state;
84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Application data
84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PTR m_app_data;
84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Application callbacks
84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CALLBACKTYPE m_cb;
84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PRIORITYMGMTTYPE m_priority_mgm ;
84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // fill this buffer queue
84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue         m_ftb_q;
84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Command Q for rest of the events
84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue         m_cmd_q;
85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue         m_etb_q;
85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Input memory pointer
85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Output memory pointer
85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // number of input bitstream error frame count
85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int m_inp_err_count;
85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Timestamp list
85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ts_arr_list           m_timestamp_list;
86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool input_flush_progress;
86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool output_flush_progress;
86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool input_use_buffer;
86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool output_use_buffer;
86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ouput_egl_buffers;
86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_use_output_pmem;
86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_out_mem_region_smi;
86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_out_pvt_entry_pmem;
87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int pending_input_buffers;
87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int pending_output_buffers;
87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int input_qbuf_count;
87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int input_dqbuf_count;
87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int output_qbuf_count;
87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int output_dqbuf_count;
87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef OUTPUT_BUFFER_LOG
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int output_buffer_write_counter;
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int input_buffer_write_counter;
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // bitmask array size for output side
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int m_out_bm_count;
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // bitmask array size for input side
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int m_inp_bm_count;
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //Input port Populated
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_inp_bPopulated;
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //Output port Populated
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_out_bPopulated;
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // encapsulate the waiting states.
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int m_flags;
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // store I/P PORT state
89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_inp_bEnabled;
89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // store O/P PORT state
89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL m_out_bEnabled;
89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 m_in_alloc_cnt;
89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Platform specific details
90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*Variables for arbitrary Byte parsing support*/
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue m_input_pending_q;
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_cmd_queue m_input_free_q;
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE  *psource_frame;
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE  *pdest_frame;
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int m_heap_inp_bm_count;
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_S64 prev_ts;
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool rst_prev_ts;
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 frm_int;
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdpp_allocatorproperty op_buf_rcnfg;
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool in_reconfig;
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 client_extradata;
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool m_debug_timestamp;
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool perf_flag;
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 proc_frms, latency;
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool m_enable_android_native_buffers;
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool m_use_android_native_buffers;
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool m_debug_extradata;
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool m_debug_concealedmb;
93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int capture_capability;
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int output_capability;
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool streaming[MAX_PORT];
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CONFIG_RECTTYPE rectangle;
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	int prev_n_filled_len;
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool msg_thread_created;
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool async_thread_created;
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int m_fill_output_msg;
94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool client_set_fps;
94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool interlace_user_flag;
94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // OMX extensions
94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    VdppExtensionData_t mExtensionData;
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // __OMX_VDPP_H__
950