111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2010 - 2016, 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_VDEC_H__
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define __OMX_VDEC_H__
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*============================================================================
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            O p e n M A X   Component
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                Video Decoder
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//** @file comx_vdec.h
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel  This module contains the class definition for openMAX decoder 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 <cutils/atomic.h>
51fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#include <qdMetaData.h>
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic ptrdiff_t x;
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_720P
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define LOG_TAG "OMX-VDEC-720P"
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#elif MAX_RES_1080P
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define LOG_TAG "OMX-VDEC-1080P"
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define LOG_TAG "OMX-VDEC"
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/msm_ion.h>
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//#include <binder/MemoryHeapIon.h>
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//#else
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <binder/MemoryHeapBase.h>
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <ui/ANativeObjectBase.h>
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C" {
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <utils/Log.h>
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/videodev2.h>
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <poll.h>
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "hevc_utils.h"
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define TIMEOUT 5000
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h>
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_ICS_)
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <pthread.h>
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef PC_DEBUG
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <semaphore.h>
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_Core.h"
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_QCOMExtns.h"
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_Skype_VideoExtensions.h"
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_VideoExt.h"
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_IndexExt.h"
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "qc_omx_component.h"
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/msm_vidc_dec.h>
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_vidc.h>
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "frameparser.h"
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_1080P
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "mp4_utils.h"
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "extra_data_handler.h"
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "ts_parser.h"
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "vidc_color_converter.h"
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "vidc_debug.h"
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h>
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define PROPERTY_VALUE_MAX 92
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern "C" {
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_API void * get_omx_component_factory_fn(void);
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelusing namespace android;
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelclass VideoHeap : public MemoryHeapBase
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    public:
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        VideoHeap(int devicefd, size_t size, void* base,ion_user_handle_t handle,int mapfd);
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        virtual ~VideoHeap() {}
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private:
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int m_ion_device_fd;
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ion_user_handle_t m_ion_handle;
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// local pmem heap object
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelclass VideoHeap : public MemoryHeapBase
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    public:
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        VideoHeap(int fd, size_t size, void* base);
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        virtual ~VideoHeap() {}
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _ANDROID_
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//                       Module specific globals
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_SPEC_VERSION  0x00000101
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//               Macros
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//////////////////////////////////////////////////////////////////////////////
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned) bufHdr,\
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// BitMask Management logic
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITS_PER_INDEX        64
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX)
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX)
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX))
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    &=  ~(BITMASK_FLAG(mIndex))
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    |=  BITMASK_FLAG(mIndex)
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        & BITMASK_FLAG(mIndex))
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            & BITMASK_FLAG(mIndex)) == 0x0)
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        & BITMASK_FLAG(mIndex))
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            & BITMASK_FLAG(mIndex)) == 0x0)
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_CONTROL_CMDQ_SIZE   100
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_QCIF_HEIGHT         144
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_QCIF_WIDTH          176
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_VGA_HEIGHT          480
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_VGA_WIDTH           640
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_WVGA_HEIGHT         480
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_CORE_WVGA_WIDTH          800
181fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_CORE_FWVGA_HEIGHT        480
182fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_CORE_FWVGA_WIDTH         864
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DESC_BUFFER_SIZE (8192 * 16)
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_NUM_INPUT_OUTPUT_BUFFERS 64
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEINFO_EXTRADATA 0x00010000
19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_INTERLACE_EXTRADATA 0x00020000
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_TIMEINFO_EXTRADATA  0x00040000
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_PORTDEF_EXTRADATA   0x00080000
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_EXTNUSER_EXTRADATA  0x00100000
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEDIMENSION_EXTRADATA  0x00200000
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEPACK_EXTRADATA 0x00400000
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_QP_EXTRADATA        0x00800000
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_BITSINFO_EXTRADATA  0x01000000
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_VQZIPSEI_EXTRADATA  0x02000000
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_OUTPUTCROP_EXTRADATA 0x04000000
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_VUI_DISPLAY_INFO_EXTRADATA  0x08000000
203fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_MPEG2_SEQDISP_INFO_EXTRADATA 0x10000000
204fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_VPX_COLORSPACE_INFO_EXTRADATA  0x20000000
205fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_VC1_SEQDISP_INFO_EXTRADATA  0x40000000
206fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define OMX_DISPLAY_INFO_EXTRADATA  0x80000000
207fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#define OMX_HDR_COLOR_INFO_EXTRADATA  0x100000000
208fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define DRIVER_EXTRADATA_MASK   0x0000FFFF
209fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEDIMENSION_EXTRADATA_SIZE (sizeof(OMX_OTHER_EXTRADATATYPE) +\
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION) + 3)&(~3)
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_FRAMEPACK_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT) + 3)&(~3))
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_QP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_EXTRADATA_QP) + 3)&(~3))
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_BITSINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_EXTRADATA_BITS_INFO) + 3)&(~3))
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_VQZIPSEI_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + 3)&(~3))
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_USERDATA_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            + 3)&(~3))
22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//  Define next macro with required values to enable default extradata,
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//    VDEC_EXTRADATA_MB_ERROR_MAP
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//    OMX_INTERLACE_EXTRADATA
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//    OMX_FRAMEINFO_EXTRADATA
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//    OMX_TIMEINFO_EXTRADATA
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum port_indexes {
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CORE_INPUT_PORT_INDEX        =0,
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CORE_OUTPUT_PORT_INDEX       =1
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum vidc_perf_level {
24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    VIDC_SVS = 0,
24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    VIDC_NOMINAL = 1,
24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    VIDC_TURBO = 2
24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct vdec_ion {
24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ion_device_fd;
24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_fd_data fd_ion_data;
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ion_allocation_data ion_alloc_data;
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct extradata_buffer_info {
25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long buffer_size;
25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char* uaddr;
25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int count;
25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int size;
26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion ion;
26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct video_driver_context {
26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int video_driver_fd;
26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum vdec_codec decoder_format;
26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum vdec_output_fromat output_format;
27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum vdec_interlaced_format interlace;
27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum vdec_output_order picture_order;
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_framesize frame_size;
27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_picsize video_resolution;
27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_allocatorproperty ip_buf;
27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_allocatorproperty op_buf;
27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload *ptr_inputbuffer;
27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_bufferpayload *ptr_outputbuffer;
27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_output_frameinfo *ptr_respbuffer;
27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion *ip_buf_ion_info;
28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion *op_buf_ion_info;
28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion h264_mv;
28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion meta_buffer;
28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_ion meta_buffer_iommu;
28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct vdec_framerate frame_rate;
28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned extradata;
28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool timestamp_adjust;
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char kind[128];
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool idr_only_decoding;
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned disable_dmx;
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct extradata_buffer_info extradata_info;
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int num_planes;
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct video_decoder_capability {
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int min_width;
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int max_width;
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int min_height;
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int max_height;
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct debug_cap {
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool in_buffer_log;
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool out_buffer_log;
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool out_meta_buffer_log;
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char infile_name[PROPERTY_VALUE_MAX + 36];
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char outfile_name[PROPERTY_VALUE_MAX + 36];
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char out_ymetafile_name[PROPERTY_VALUE_MAX + 36];
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char out_uvmetafile_name[PROPERTY_VALUE_MAX + 36];
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char log_loc[PROPERTY_VALUE_MAX];
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *infile;
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *outfile;
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *out_ymeta_file;
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *out_uvmeta_file;
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct dynamic_buf_list {
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    long fd;
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    long dup_fd;
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 offset;
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 ref_count;
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void *buffaddr;
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    long mapped_size;
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstruct extradata_info {
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BOOL output_crop_updated;
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_CONFIG_RECTTYPE output_crop_rect;
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 output_width;
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 output_height;
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// OMX video decoder class
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelclass omx_vdec: public qc_omx_component
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    public:
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_vdec();  // constructor
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        virtual ~omx_vdec();  // destructor
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        static int async_message_process (void *context, void* message);
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        static void process_event_cb(void *ctxt,unsigned char id);
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_buffer(
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE **bufferHdr,
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 port,
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR appData,
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 bytes
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE component_init(OMX_STRING role);
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE component_role_enum(
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8 *role,
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 index
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE component_tunnel_request(
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 port,
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE  peerComponent,
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 peerPort,
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_TUNNELSETUPTYPE *tunnelSetup
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE empty_this_buffer(
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *buffer
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE fill_this_buffer(
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *buffer
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE free_buffer(
38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 port,
39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *buffer
39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_component_version(
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_STRING componentName,
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VERSIONTYPE *componentVersion,
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VERSIONTYPE *specVersion,
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_UUIDTYPE *componentUUID
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_config(
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_INDEXTYPE configIndex,
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR configData
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_extension_index(
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE hComp,
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_STRING paramName,
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_INDEXTYPE *indexType
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_INDEXTYPE  paramIndex,
41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR        paramData);
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_STATETYPE *state);
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMMANDTYPE cmd,
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32         param1,
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR         cmdData);
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_CALLBACKTYPE *callbacks,
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR          appData);
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_INDEXTYPE  configIndex,
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR        configData);
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_INDEXTYPE  paramIndex,
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR        paramData);
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE **bufferHdr,
44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              port,
44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR              appData,
44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              bytes,
44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8               *buffer);
44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE  use_input_heap_buffers(
44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_HANDLETYPE            hComp,
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE** bufferHdr,
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32                   port,
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR                   appData,
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32                   bytes,
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8*                   buffer);
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE **bufferHdr,
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              port,
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR              appData,
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void *               eglImage);
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void complete_pending_buffer_done_cbs();
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct video_driver_context drv_ctx;
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int m_poll_efd;
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_extradata();
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void free_extradata();
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int update_resolution(int width, int height, int stride, int scan_lines);
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE is_video_session_supported();
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int  m_pipe_in;
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int  m_pipe_out;
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_t msg_thread_id;
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_t async_thread_id;
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_component_secure();
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void buf_ref_add(int nPortIndex);
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void buf_ref_remove();
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE* get_omx_output_buffer_header(int index);
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE set_dpb(bool is_split_mode, int dpb_color_format);
478b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        OMX_ERRORTYPE decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt);
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void request_perf_level(enum vidc_perf_level perf_level);
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int dpb_bit_depth;
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool async_thread_force_stop;
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        volatile bool message_thread_stop;
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct extradata_info m_extradata_info;
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int m_progressive;
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
486b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        enum dither_type {
487b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DITHER_DISABLE = 0,
488b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DITHER_COLORSPACE_EXCEPTBT2020,
489b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DITHER_ALL_COLORSPACE
490b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        };
491b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        enum dither_type m_dither_config;
492b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
493b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        enum color_space_type {
494b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            BT2020 = 0,
495b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            EXCEPT_BT2020,
496b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            UNKNOWN
497b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        };
498b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        enum color_space_type m_color_space;
499b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private:
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Bit Positions
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum flags_bit_positions {
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Defer transition to IDLE
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_IDLE_PENDING            =0x1,
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Defer transition to LOADING
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_LOADING_PENDING         =0x2,
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // First  Buffer Pending
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Second Buffer Pending
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Defer transition to Enable
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Defer transition to Enable
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Defer transition to Disable
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Defer transition to Disable
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //defer flush notification
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_PAUSE_PENDING          =0xB,
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_EXECUTE_PENDING        =0xC,
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE,
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_FLUSH_DEFERRED = 0xF
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Deferred callback identifiers
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum {
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Event Callbacks from the vdec component thread context
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_EVENT       = 0x1,
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Buffer Done callbacks from the vdec component thread context
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Frame Done callbacks from the vdec component thread context
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Buffer Done callbacks from the vdec component thread context
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_FTB         = 0x4,
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Frame Done callbacks from the vdec component thread context
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_ETB         = 0x5,
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Command
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Push-Pending Buffers
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // Empty Buffer Done callbacks
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_EBD         = 0x8,
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //Flush Event Callbacks from the vdec component thread context
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_FBD = 0xc,
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_START_DONE = 0xD,
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x18,
56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COMPONENT_CLOSE_MSG = 0x19
56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum vc1_profile_type {
56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VC1_SP_MP_RCV = 1,
56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            VC1_AP = 2
57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_ports {
57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            CAPTURE_PORT,
57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OUTPUT_PORT,
57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            MAX_PORT
57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct omx_event {
58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned long param1;
58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned long param2;
58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned long id;
58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct omx_cmd_queue {
58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned long m_read;
58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned long m_write;
59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned long m_size;
59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx_cmd_queue();
59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ~omx_cmd_queue();
59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // get msgtype of the first ele from the queue
59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned get_q_msg_type();
59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_capability cap;
60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ts_entry {
60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_TICKS timestamp;
60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bool valid;
60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct ts_arr_list {
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ts_arr_list();
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ~ts_arr_list();
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bool insert_ts(OMX_TICKS ts);
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bool pop_min_ts(OMX_TICKS &ts);
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bool reset_ts_list();
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct desc_buffer_hdr {
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U8 *buf_addr;
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 desc_data_size;
62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool allocate_done(void);
62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool allocate_input_done(void);
62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool allocate_output_done(void);
62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void free_output_buffer_header();
63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void free_input_buffer_header();
63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE **bufferHdr,
63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              port,
63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR              appData,
63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              bytes);
63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE **bufferHdr,
64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              port,
64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR              appData,
64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              bytes);
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE **bufferHdr,
64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 port,OMX_PTR appData,
65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32              bytes);
65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE   **bufferHdr,
65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32                port,
65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR                appData,
65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32                bytes,
65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U8                 *buffer);
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE allocate_output_headers();
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool execute_omx_flush(OMX_U32);
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool execute_output_flush();
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool execute_input_flush();
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE * buffer);
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE * buffer);
66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *buffer);
67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *buffer
67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                );
67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE push_input_hevc (OMX_HANDLETYPE hComp);
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE *buffer);
68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool release_done();
68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool release_output_done();
68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool release_input_done();
68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE start_port_reconfig();
69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE update_picture_resolution();
69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stream_off(OMX_U32 port);
69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void adjust_timestamp(OMX_S64 &act_timestamp);
69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void set_frame_rate(OMX_S64 act_timestamp);
69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
696fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
697fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        void convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space,
699fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            ColorAspects *aspects);
700fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        bool handle_color_space_info(void *data, unsigned int buf_index);
701fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        void set_colorspace_in_handle(ColorSpace_t color, unsigned int buf_index);
702fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
703fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        void print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix);
704fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        bool handle_content_light_level_info(void* data);
705fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        bool handle_mastering_display_color_info(void* data);
70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 interlaced_format_type);
710fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        OMX_ERRORTYPE enable_extradata(OMX_U64 requested_extradata, bool is_internal,
71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool enable = true);
71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 num_conceal_mb,
71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 picture_type,
71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 frame_rate,
71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_TICKS time_stamp,
71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct msm_vidc_panscan_window_payload *panscan_payload,
71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_aspectratioinfo *aspect_ratio_info);
71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 interlaced_format_type, OMX_U32 buf_index);
72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 num_conceal_mb,
72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 picture_type,
72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_S64 timestamp,
72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 frame_rate,
72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_aspectratioinfo *aspect_ratio_info);
73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra);
73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra,
73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data);
74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload);
74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct msm_vidc_frame_qp_payload *qp_payload);
74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct msm_vidc_frame_bits_info_payload *bits_payload);
74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra,
74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct msm_vidc_vqzip_sei_payload *vqzip_payload);
74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void insert_demux_addr_offset(OMX_U32 address_offset);
74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 alignment);
75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int alloc_map_ion_memory(OMX_U32 buffer_size,
75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 alignment, struct ion_allocation_data *alloc_data,
75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct ion_fd_data *fd_data,int flag);
75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void free_ion_memory(struct vdec_ion *buf_ion_info);
76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COMMANDTYPE cmd,
76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32         param1,
76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PTR         cmdData);
76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool post_event( unsigned long p1,
76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned long p2,
76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned long id
77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   );
77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        inline int clip2(int x) {
77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            x = x -1;
77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            x = x | x >> 1;
77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            x = x | x >> 2;
77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            x = x | x >> 4;
77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            x = x | x >> 16;
77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            x = x + 1;
77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return x;
77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_1080P
78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE vdec_alloc_h264_mv();
78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void vdec_dealloc_h264_mv();
78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE vdec_alloc_meta_buffers();
78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void vdec_dealloc_meta_buffers();
78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        inline void omx_report_error () {
78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Sending OMX_ErrorHardware to Client");
79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_error_propogated = true;
79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_cb.EventHandler(&m_cmp,m_app_data,
79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_EventError,OMX_ErrorHardware,0,NULL);
79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        inline void omx_report_unsupported_setting () {
79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR(
80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "ERROR: Sending OMX_ErrorUnsupportedSetting to Client");
80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_error_propogated = true;
80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_cb.EventHandler(&m_cmp, m_app_data,
80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        inline void omx_report_hw_overload () {
80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR(
80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "ERROR: Sending OMX_ErrorInsufficientResources to Client");
81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_error_propogated = true;
81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_cb.EventHandler(&m_cmp, m_app_data,
81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined (_ANDROID_ICS_)
82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct nativebuffer {
82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            native_handle_t *nativehandle;
82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private_handle_t *privatehandle;
82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int inuse;
82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //*************************************************************
82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //*******************MEMBER VARIABLES *************************
83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //*************************************************************
83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_t       m_lock;
83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_t       c_lock;
83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_t       buf_lock;
83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //sem to handle the minimum procesing of commands
83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sem_t                 m_cmd_lock;
83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sem_t                 m_safe_flush;
83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool              m_error_propogated;
83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // compression format
83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_VIDEO_CODINGTYPE eCompressionFormat;
84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // OMX State
84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_STATETYPE m_state;
84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Application data
84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PTR m_app_data;
84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Application callbacks
84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_CALLBACKTYPE m_cb;
84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PRIORITYMGMTTYPE m_priority_mgm ;
84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // fill this buffer queue
84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_cmd_queue         m_ftb_q;
85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Command Q for rest of the events
85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_cmd_queue         m_cmd_q;
85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_cmd_queue         m_etb_q;
85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Input memory pointer
85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Output memory pointer
85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // number of input bitstream error frame count
85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int m_inp_err_count;
85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Timestamp list
86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ts_arr_list           m_timestamp_list;
86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool input_flush_progress;
86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool output_flush_progress;
86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool input_use_buffer;
86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool output_use_buffer;
86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool ouput_egl_buffers;
86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BOOL m_use_output_pmem;
87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BOOL m_out_mem_region_smi;
87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BOOL m_out_pvt_entry_pmem;
87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pending_input_buffers;
87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int pending_output_buffers;
87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // bitmask array size for output side
87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        uint64_t m_out_bm_count;
87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // bitmask array size for input side
87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        uint64_t m_inp_bm_count;
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Input port Populated
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BOOL m_inp_bPopulated;
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Output port Populated
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BOOL m_out_bPopulated;
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // encapsulate the waiting states.
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        uint64_t m_flags;
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Heap pointer to frame buffers
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vidc_heap {
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sp<MemoryHeapBase>    video_heap_ptr;
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vidc_heap *m_heap_ptr;
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int m_heap_count;
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif //_ANDROID_
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        // SPS+PPS sent as part of set_config
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*Variables for arbitrary Byte parsing support*/
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        frame_parse m_frame_parser;
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_stream_parser *h264_parser;
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        MP4_Utils mp4_headerparser;
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        HEVC_Utils m_hevc_utils;
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_cmd_queue m_input_pending_q;
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_cmd_queue m_input_free_q;
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool arbitrary_bytes;
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  h264_scratch;
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  *psource_frame;
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  *pdest_frame;
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int m_heap_inp_bm_count;
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type codec_type_parse;
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool first_frame_meta;
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned frame_count;
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned nal_count;
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned nal_length;
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool look_ahead_nal;
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int first_frame;
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned char *first_buffer;
93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int first_frame_size;
93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned char m_hwdevice_name[80];
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        FILE *m_device_file_ptr;
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum vc1_profile_type m_vc1_profile;
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_S64 h264_last_au_ts;
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 h264_last_au_flags;
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_demux_offsets[8192];
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_demux_entries;
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_disp_hor_size;
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_disp_vert_size;
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_S64 prev_ts;
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_S64 prev_ts_actual;
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool rst_prev_ts;
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 frm_int;
944fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        OMX_U32 m_fps_received;
945fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        float   m_fps_prev;
946fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        bool m_drc_enable;
94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct vdec_allocatorproperty op_buf_rcnfg;
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool in_reconfig;
95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_NATIVE_WINDOWTYPE m_display_id;
95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 client_extradata;
95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_debug_timestamp;
95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool perf_flag;
95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 proc_frms, latency;
95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        perf_metrics fps_metrics;
95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        perf_metrics dec_time;
95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_reject_avc_1080p_mp;
95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_enable_android_native_buffers;
96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_use_android_native_buffers;
96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_debug_extradata;
96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_debug_concealedmb;
96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_disable_dynamic_buf_mode;
96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_conceal_color;
96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct h264_mv_buffer {
96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned char* buffer;
97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int size;
97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int count;
97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int pmem_fd;
97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int offset;
97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        h264_mv_buffer h264_mv_buff;
97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct meta_buffer {
97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            unsigned char* buffer;
97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int size;
98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int count;
98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int pmem_fd;
98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int pmem_fd_iommu;
98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int offset;
98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        meta_buffer meta_buff;
98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_data_handler extra_data_handle;
98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_FRAME_PACK_ARRANGEMENT m_frame_pack_arrangement;
98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_time_stamp_reorder time_stamp_dts;
99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        desc_buffer_hdr *m_desc_buffer_ptr;
99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool secure_mode;
99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool allocate_native_handle;
99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool external_meta_buffer;
99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool external_meta_buffer_iommu;
99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OTHER_EXTRADATATYPE *m_other_extradata;
99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool codec_config_flag;
99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int capture_capability;
100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int output_capability;
100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool streaming[MAX_PORT];
100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_FRAMESIZETYPE framesize;
100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_CONFIG_RECTTYPE rectangle;
100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 prev_n_filled_len;
100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_down_scalar_enabled;
100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_force_down_scalar;
100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct custom_buffersize {
100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 input_buffersize;
101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } m_custom_buffersize;
101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_power_hinted;
101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_q6_platform;
101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE power_module_register();
101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE power_module_deregister();
101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool msg_thread_created;
101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool async_thread_created;
101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl;
101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_profile;
102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //variables to handle dynamic buffer mode
102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool dynamic_buf_mode;
102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct dynamic_buf_list *out_dynamic_list;
102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_reconfig_width;
102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_reconfig_height;
102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_smoothstreaming_mode;
102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_input_pass_buffer_fd;
1029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DescribeColorAspectsParams m_client_color_space;
1030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DescribeColorAspectsParams m_internal_color_space;
103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1032fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        // HDRStaticInfo defined in HardwareAPI.h
1033fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DescribeHDRStaticInfoParams m_client_hdr_info;
1034fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        DescribeHDRStaticInfoParams m_internal_hdr_info;
1035fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        bool m_change_client_hdr_info;
1036fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        pthread_mutex_t m_hdr_info_client_lock;
1037fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel
103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 operating_frame_rate;
103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool high_fps;
104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_smoothstreaming_width;
104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_smoothstreaming_height;
104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE enable_smoothstreaming();
104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_ERRORTYPE enable_adaptive_playback(unsigned long width, unsigned long height);
104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool is_thulium_v1;
104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_disable_ubwc_mode;
104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_disable_split_mode;
104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_downscalar_width;
104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 m_downscalar_height;
105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int decide_downscalar();
105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int enable_downscalar();
105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int disable_downscalar();
105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int m_fill_output_msg;
105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool client_set_fps;
105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int stereo_output_mode;
105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        class allocate_color_convert_buf
105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            public:
106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                allocate_color_convert_buf();
106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ~allocate_color_convert_buf();
106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void set_vdec_client(void *);
106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void update_client();
106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool update_buffer_req();
106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool get_buffer_req(unsigned int &buffer_size);
106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ERRORTYPE set_buffer_req(OMX_U32 buffer_size, OMX_U32 actual_count);
106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_U32 bytes);
107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool is_color_conversion_enabled() {return enabled;}
107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private:
108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_COUNT MAX_NUM_INPUT_OUTPUT_BUFFERS
108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx_vdec *omx;
108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool enabled;
108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COLOR_FORMATTYPE ColorFormat;
108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void init_members();
108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool color_convert_mode;
108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ColorConvertFormat dest_format;
108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                class omx_c2d_conv c2d;
108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int allocated_count;
108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int buffer_size_req;
109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned int buffer_alignment_req;
109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 m_c2d_width;
109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 m_c2d_height;
109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vdec_ion op_buf_ion_info[MAX_COUNT];
109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                unsigned char *pmem_baseaddress[MAX_COUNT];
110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                int pmem_fd[MAX_COUNT];
110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vidc_heap {
110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    sp<MemoryHeapBase>    video_heap_ptr;
110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                };
110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct vidc_heap m_heap_ptr[MAX_COUNT];
110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ERRORTYPE cache_ops(unsigned int index, unsigned int cmd);
110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                inline OMX_ERRORTYPE cache_clean_buffer(unsigned int index) {
110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return cache_ops(index, ION_IOC_CLEAN_CACHES);
111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_ERRORTYPE cache_clean_invalidate_buffer(unsigned int index) {
111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return cache_ops(index, ION_IOC_CLEAN_INV_CACHES);
111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if  defined (_MSM8960_) || defined (_MSM8974_)
111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        allocate_color_convert_buf client_buffers;
111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct video_decoder_capability m_decoder_capability;
111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct debug_cap m_debug;
112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int log_input_buffers(const char *, int);
112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int log_output_buffers(OMX_BUFFERHEADERTYPE *);
112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void send_codec_config();
112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_TICKS m_last_rendered_TS;
112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        volatile int32_t m_queued_codec_config_count;
112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 current_perf_level;
112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool secure_scaling_to_non_secure_opb;
112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	bool m_force_compressed_for_dpb;
113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bool m_is_display_session;
113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        class perf_lock {
113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private:
113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_t mlock;
113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            public:
113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                perf_lock() {
113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pthread_mutex_init(&mlock, NULL);
113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ~perf_lock() {
114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pthread_mutex_destroy(&mlock);
114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void lock() {
114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pthread_mutex_lock(&mlock);
114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void unlock() {
114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    pthread_mutex_unlock(&mlock);
115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        class perf_control {
115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // 2 cores will be requested if framerate is beyond 45 fps
115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            static const int MIN_FRAME_DURATION_FOR_PERF_REQUEST_US = (1e6 / 45);
115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            typedef int (*perf_lock_acquire_t)(int, int, int*, int);
115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            typedef int (*perf_lock_release_t)(int);
115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            private:
116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void *m_perf_lib;
116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                int m_perf_handle;
116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                perf_lock_acquire_t m_perf_lock_acquire;
116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                perf_lock_release_t m_perf_lock_release;
116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bool load_lib();
116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct mpctl_stats {
116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  int vid_inst_count;
116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  bool vid_acquired;
116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  int vid_disp_handle;
116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                };
117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                static struct mpctl_stats mpctl_obj;
117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                static perf_lock m_perf_lock;
117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            public:
117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                perf_control();
117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ~perf_control();
117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void request_cores(int frame_duration_us);
117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                void send_hint_to_mpctl(bool state);
117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        };
117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        perf_control m_perf_control;
118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        static OMX_COLOR_FORMATTYPE getPreferredColorFormatNonSurfaceMode(OMX_U32 index) {
118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //On Android, we default to standard YUV formats for non-surface use-cases
118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //where apps prefer known color formats.
118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COLOR_FORMATTYPE formatsNonSurfaceMode[] = {
118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                [0] = OMX_COLOR_FormatYUV420SemiPlanar,
118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                [1] = OMX_COLOR_FormatYUV420Planar,
118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                [2] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed,
119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            };
119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return (index < sizeof(formatsNonSurfaceMode) / sizeof(OMX_COLOR_FORMATTYPE)) ?
119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                formatsNonSurfaceMode[index] : OMX_COLOR_FormatMax;
119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COLOR_FORMATTYPE getPreferredColorFormatDefaultMode(OMX_U32 index) {
119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //for surface mode (normal playback), advertise native/accelerated formats first
119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_COLOR_FORMATTYPE format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_disable_ubwc_mode) {
120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COLOR_FORMATTYPE formatsDefault[] = {
120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed,
120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    [1] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
120342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                    [2] = OMX_COLOR_FormatYUV420SemiPlanar,
120442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                    [3] = OMX_COLOR_FormatYUV420Planar,
120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                };
120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    formatsDefault[index] : OMX_COLOR_FormatMax;
120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_COLOR_FORMATTYPE formatsDefault[] = {
121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
121242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                    [1] = OMX_COLOR_FormatYUV420SemiPlanar,
121342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                    [2] = OMX_COLOR_FormatYUV420Planar,
121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                };
121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    formatsDefault[index] : OMX_COLOR_FormatMax;
121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return format;
122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        static OMX_ERRORTYPE describeColorFormat(OMX_PTR params);
122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        void prefetchNewBuffers();
122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        class client_extradata_info {
12262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            private:
12272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                int fd;
12282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_U32 total_size;
12292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_U32 size;
12302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                void *vaddr;
12312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            public:
12322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                client_extradata_info() {
12332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    fd = -1;
12342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    size = 0;
12352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    total_size = 0;
12362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    vaddr = NULL;
12372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
12382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
12392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                void reset() {
12402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    if (vaddr) {
12412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        munmap(vaddr, total_size);
12422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        vaddr = NULL;
12432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    }
12442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    if (fd != -1) {
12452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        close(fd);
12462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        fd = -1;
12472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    }
12482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
12492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
12502601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                ~client_extradata_info() {
12512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    reset();
12522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
12532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
12542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                bool set_extradata_info(int fd, OMX_U32 total_size, OMX_U32 size) {
12552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    reset();
12562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    this->fd = fd;
12572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    this->size = size;
12582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    this->total_size = total_size;
12592601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    vaddr = (OMX_U8*)mmap(0, total_size,
12602601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                            PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
12612601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    if (vaddr == MAP_FAILED) {
12622601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        vaddr = NULL;
12632601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        reset();
12642601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        return false;
12652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    }
12662601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    return true;
12672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
12682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
12692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_U8 *getBase() const {
12702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    return (OMX_U8 *)vaddr;
12712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
12722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
12732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_U32 getSize() const {
12742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    return size;
12752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
12762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        };
12772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        client_extradata_info m_client_extradata_info;
127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_
128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum instance_state {
128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_CORE_INIT,
128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_CORE_INIT_DONE,
128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_OPEN,
128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_OPEN_DONE,
128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_LOAD_RESOURCES,
128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_LOAD_RESOURCES_DONE,
128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_START,
129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_START_DONE,
129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_STOP,
129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_STOP_DONE,
129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_RELEASE_RESOURCES,
129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_RELEASE_RESOURCES_DONE,
129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_CLOSE,
129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_CLOSE_DONE,
129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_CORE_UNINIT,
129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum vidc_resposes_id {
130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    MSM_VIDC_DECODER_EVENT_CHANGE,
130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // _MSM8974_
130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif // __OMX_VDEC_H__
1308