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