blob: 05c3acba738db3639fd1db217e7899d82e64de2e [file] [log] [blame]
/*
* Copyright (C) Texas Instruments - http://www.ti.com/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* =============================================================================
* Texas Instruments OMAP(TM) Platform Software
* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
*
* Use of this software is controlled by the terms and conditions found
* in the license agreement under which this software has been supplied.
* =========================================================================== */
/**
* @file OMX_VideoEnc_Utils.h
*
* This file implements OMX Component for MPEG-4 encoder that
* is fully compliant with the OMX specification 1.5.
*
* @path $(CSLPATH)\inc
*
* @rev 0.1
*/
/* -------------------------------------------------------------------------- */
/* =============================================================================
*!
*! Revision History
*! ================================================================
*!
*! 02-Feb-2006 mf: Revisions appear in reverse chronological order;
*! that is, newest first. The date format is dd-Mon-yyyy.
* =========================================================================== */
#ifndef OMX_VIDEOENC_UTILS__H
#define OMX_VIDEOENC_UTILS__H
#include "LCML_DspCodec.h"
#include "LCML_Types.h"
#include "LCML_CodecInterface.h"
#ifdef RESOURCE_MANAGER_ENABLED
#include <ResourceManagerProxyAPI.h>
#endif
#include "OMX_VideoEnc_DSP.h"
#ifdef __PERF_INSTRUMENTATION__
#include "perf.h"
#endif
#include <OMX_TI_Debug.h>
#include <OMX_Component.h>
#ifdef UNDER_CE
#include <oaf_debug.h>
#include <pthread.h>
#endif
#include "OMX_TI_Common.h"
#include <utils/Log.h>
/* this is the max of VIDENC_MAX_NUM_OF_IN_BUFFERS and VIDENC_MAX_NUM_OF_OUT_BUFFERS */
#define VIDENC_MAX_NUM_OF_BUFFERS 8
#define VIDENC_MAX_NUM_OF_IN_BUFFERS 5
#define VIDENC_MAX_NUM_OF_OUT_BUFFERS 8
#define VIDENC_NUM_OF_IN_BUFFERS 4
#define VIDENC_NUM_OF_OUT_BUFFERS 8
#define VIDENC_NUM_OF_PORTS 2
#if 1
#define GPP_PRIVATE_NODE_HEAP
#endif
#define VIDENC_NUM_CUSTOM_INDEXES 23
#if 1
#define __KHRONOS_CONF__
#endif
#if 1
#define __KHRONOS_CONF_1_1__
#endif
#define KHRONOS_1_2
#define VIDENC_MAX_COMPONENT_TIMEOUT 0xFFFFFFFF
#define OMX_NOPORT 0xFFFFFFFE
#define MAXNUMSLCGPS 8 /*< max. number of slice groups*/
/* Remove after OMX 1.1 migration */
#ifndef __KHRONOS_CONF_1_1__
#define OMX_BUFFERFLAG_SYNCFRAME 0x00000040
#endif
#define OMX_LFRAMETYPE_H264 1
#define OMX_CFRAMETYPE_MPEG4 1
/*Select Timeout */
#define VIDENC_TIMEOUT_SEC 120;
#define VIDENC_TIMEOUT_USEC 0;
/*
* Definition of capabilities index and structure
* Needed to inform OpenCore about component capabilities.
*/
#define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347
typedef struct PV_OMXComponentCapabilityFlagsType
{
/* OMX COMPONENT CAPABILITY RELATED MEMBERS*/
OMX_BOOL iIsOMXComponentMultiThreaded;
OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;
OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;
OMX_BOOL iOMXComponentSupportsMovableInputBuffers;
OMX_BOOL iOMXComponentSupportsPartialFrames;
OMX_BOOL iOMXComponentUsesNALStartCode;
OMX_BOOL iOMXComponentCanHandleIncompleteFrames;
OMX_BOOL iOMXComponentUsesFullAVCFrames;
} PV_OMXComponentCapabilityFlagsType;
/*
* Redirects control flow in an error situation.
* The OMX_CONF_CMD_BAIL label is defined inside the calling function.
*/
#define OMX_CONF_BAIL_IF_ERROR(_eError) \
do { \
if(_eError != OMX_ErrorNone) { \
goto OMX_CONF_CMD_BAIL; \
} \
} while(0)
#define OMX_VIDENC_BAIL_IF_ERROR(_eError, _hComp) \
do { \
if(_eError != OMX_ErrorNone) { \
_eError = OMX_VIDENC_HandleError(_hComp, _eError); \
if(_eError != OMX_ErrorNone) { \
OMX_ERROR5(_hComp->dbg, "*Fatal Error : %x\n", _eError); \
goto OMX_CONF_CMD_BAIL; \
} \
} \
} while(0)
/*
* Sets error type and redirects control flow to error handling and cleanup section
*/
#define OMX_CONF_SET_ERROR_BAIL(_eError, _eCode)\
do { \
_eError = _eCode; \
goto OMX_CONF_CMD_BAIL; \
} while(0)
#define OMX_VIDENC_SET_ERROR_BAIL(_eError, _eCode, _hComp)\
do { \
_eError = _eCode; \
OMX_ERROR5(_hComp->dbg, "*Fatal Error : %x\n", eError); \
OMX_VIDENC_HandleError(_hComp, _eError); \
goto OMX_CONF_CMD_BAIL; \
} while(0)
/*
* Checking paramaters for non-NULL values.
* The macro takes three parameters because inside the code the highest
* number of parameters passed for checking in a single instance is three.
* In case one or two parameters are passed, the ramaining parameters
* are set to 1 (or a nonzero value).
*/
#define OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3) \
do { \
if(!_ptr1 || !_ptr2 || !_ptr3){ \
eError = OMX_ErrorBadParameter; \
goto OMX_CONF_CMD_BAIL; \
} \
} while(0)
/*
* Initialize the Circular Buffer data. The Tail and Head pointers are NULL.
*The number of nodes inside the circular buffer is equal to zero.
*Also the number of nodes that contains BufferData is iqual zero.
*It should be in the ComponentInit call of the Component.
*/
#define OMX_CONF_CIRCULAR_BUFFER_INIT(_pPrivateData_) \
do { \
(_pPrivateData_)->sCircularBuffer.pHead = NULL; \
(_pPrivateData_)->sCircularBuffer.pTail = NULL; \
(_pPrivateData_)->sCircularBuffer.nElements = 0; \
(_pPrivateData_)->sCircularBuffer.nFillElements = 0; \
} while(0)
/*
*Restart the Circular Buffer. The tail points to the same node as the head. The
*number of fill elements is set to zero. It should be put in the Idle->Execution
*transition.
*/
#define OMX_CONF_CIRCULAR_BUFFER_RESTART(_sCircular_) \
do { \
(_sCircular_).pTail = (_sCircular_).pHead; \
(_sCircular_).nFillElements = 0; \
} while(0)
/*
*Add node to the Circular Buffer. Should be use when UseBuffer or AllocateBuffer
*is call. The new node is insert in the head of the list. The it will go the last node
*and rewrite pNext with the new address of the Head.
*/
#define OMX_CONF_CIRCULAR_BUFFER_ADD_NODE(_pPrivateData_, _sCircular_)\
do { \
if((_sCircular_).nElements < VIDENC_MAX_NUM_OF_BUFFERS) \
{ \
OMX_U8 _i_ = 0; \
OMX_CONF_CIRCULAR_BUFFER_NODE* pTmp = (_sCircular_).pHead;\
VIDENC_MALLOC( (_sCircular_).pHead, \
sizeof(OMX_CONF_CIRCULAR_BUFFER_NODE),\
OMX_CONF_CIRCULAR_BUFFER_NODE, \
(_pPrivateData_)->pMemoryListHead, \
(_pPrivateData_)->dbg); \
(_sCircular_).nElements++; \
if(!pTmp){ \
(_sCircular_).pHead->pNext = (_sCircular_).pHead;\
(_sCircular_).pTail = (_sCircular_).pHead; \
} \
else{ \
(_sCircular_).pHead->pNext = pTmp; \
for(_i_=2 ; _i_ < (_sCircular_).nElements; _i_++) \
pTmp = pTmp->pNext; \
pTmp->pNext = (_sCircular_).pHead; \
} \
} \
} while(0)
/*
* Will move the Tail of the Cirular Buffer to the next element. In the tail resides the last buffer to enter
*the component from the Application layer. It will get all the Data to be propageted from
* the pBufferHeader and write it in the node. Then it will move the Tail to the next element.
*It should be put in the function that handles the filled buffer from the application.
*/
#define OMX_CONF_CIRCULAR_BUFFER_MOVE_TAIL(_pBufHead_, _sCircular_, _pPrivateData_)\
do { \
if((_pPrivateData_)->pMarkBuf){ \
(_sCircular_).pTail->pMarkData = (_pPrivateData_)->pMarkBuf->pMarkData;\
(_sCircular_).pTail->hMarkTargetComponent = (_pPrivateData_)->pMarkBuf->hMarkTargetComponent;\
(_pPrivateData_)->pMarkBuf = NULL; \
} \
else{ \
(_sCircular_).pTail->pMarkData = (_pBufHead_)->pMarkData; \
(_sCircular_).pTail->hMarkTargetComponent = (_pBufHead_)->hMarkTargetComponent;\
} \
(_sCircular_).pTail->nTickCount = (_pBufHead_)->nTickCount;\
(_sCircular_).pTail->nTimeStamp = (_pBufHead_)->nTimeStamp;\
(_sCircular_).pTail->nFlags = (_pBufHead_)->nFlags; \
(_sCircular_).pTail = (_sCircular_).pTail->pNext; \
(_sCircular_).nFillElements++; \
if(((_sCircular_).pTail == (_sCircular_).pHead) && \
((_sCircular_).nFillElements != 0)){ \
OMX_TRACE2((_pPrivateData_)->dbg, "**Warning:Circular Buffer Full.\n"); \
} \
} while(0)
/*
*Will move the Head of the Circular Buffer to the next element. In the head is the Data of the first Buffer
*to enter to the Application layer. It will propagate the Data and put it in the pBufferHeader
*that goes to the Application layer. Then it will move the Head to the Next element.
*It should be put in the function that handles the filled buffers that comes from the DSP.
*/
#define OMX_CONF_CIRCULAR_BUFFER_MOVE_HEAD(_pBufHead_, _sCircular_, _pPrivateData_) \
do { \
(_pBufHead_)->pMarkData = (_sCircular_).pHead->pMarkData;\
(_pBufHead_)->hMarkTargetComponent = (_sCircular_).pHead->hMarkTargetComponent;\
(_pBufHead_)->nTickCount = (_sCircular_).pHead->nTickCount;\
(_pBufHead_)->nTimeStamp = (_sCircular_).pHead->nTimeStamp;\
(_pBufHead_)->nFlags = (_sCircular_).pHead->nFlags; \
(_sCircular_).pHead = (_sCircular_).pHead->pNext; \
(_sCircular_).nFillElements--; \
if(((_sCircular_).pTail == (_sCircular_).pHead) && \
((_sCircular_).nFillElements == 0)){ \
OMX_TRACE1((_pPrivateData_)->dbg, "**Note:Circular Buffer Empty.\n"); \
} \
} while(0)
/*
*This Macro will delete a node from the Circular Buffer. It will rearrenge the conections
*between the nodes, and restart the CircularBuffer. The Tail and Head will point to the same
*location and the nFillElement will be set to 0. It should be in the FreeBuffer call.
*/
#define OMX_CONF_CIRCULAR_BUFFER_DELETE_NODE(_pPrivateData_, _sCircular_)\
do { \
OMX_CONF_CIRCULAR_BUFFER_NODE* pTmp1 = (_sCircular_).pHead;\
OMX_CONF_CIRCULAR_BUFFER_NODE* pTmp2 = NULL; \
if(((_sCircular_).pHead != NULL) && \
((_sCircular_).pTail != NULL)){ \
while(pTmp1->pNext != (_sCircular_).pHead){ \
pTmp2 = pTmp1; \
pTmp1 = pTmp1->pNext; \
} \
VIDENC_FREE(pTmp1,(_pPrivateData_)->pMemoryListHead, (_pPrivateData_)->dbg); \
(_sCircular_).nElements--; \
(_sCircular_).nFillElements = 0; \
if(pTmp2 != NULL){ \
pTmp2->pNext = (_sCircular_).pHead; \
(_sCircular_).pTail = (_sCircular_).pHead; \
} \
else { \
(_sCircular_).pHead = NULL; \
(_sCircular_).pTail = NULL; \
} \
} \
} while(0)
/*
* Checking for version compliance.
* If the nSize of the OMX structure is not set, raises bad parameter error.
* In case of version mismatch, raises a version mismatch error.
*/
#define OMX_CONF_CHK_VERSION(_s_, _name_, _e_) \
do { \
if((_s_)->nSize != sizeof(_name_)) _e_ = OMX_ErrorBadParameter; \
if(((_s_)->nVersion.s.nVersionMajor != 0x1)|| \
((_s_)->nVersion.s.nVersionMinor != 0x0)|| \
((_s_)->nVersion.s.nRevision != 0x0)|| \
((_s_)->nVersion.s.nStep != 0x0)) _e_ = OMX_ErrorVersionMismatch;\
if(_e_ != OMX_ErrorNone) goto OMX_CONF_CMD_BAIL; \
} while(0)
/*
* Initializes a data structure using a pointer to the structure.
* The initialization of OMX structures always sets up the nSize and nVersion fields
* of the structure.
*/
#define OMX_CONF_INIT_STRUCT(_s_, _name_) \
do { \
(_s_)->nSize = sizeof(_name_); \
(_s_)->nVersion.s.nVersionMajor = 0x1; \
(_s_)->nVersion.s.nVersionMinor = 0x0; \
(_s_)->nVersion.s.nRevision = 0x0; \
(_s_)->nVersion.s.nStep = 0x0; \
} while(0)
/* Event Handler Macro*/
#define OMX_VIDENC_EVENT_HANDLER(_hComponent_, _eEvent_, _nData1_, _nData2_, _pEventData_) \
do { \
if((_hComponent_)->bHideEvents != OMX_TRUE ) \
(_hComponent_)->sCbData.EventHandler((_hComponent_)->pHandle, \
(_hComponent_)->pHandle->pApplicationPrivate, \
_eEvent_, \
_nData1_, \
_nData2_, \
_pEventData_); \
\
OMX_PRINT1((_hComponent_)->dbg, "EventHandler : %lx : %lx : %lx \n", (OMX_U32) (_eEvent_), (OMX_U32) (_nData1_), (OMX_U32) (_nData2_)); \
\
} while(0)
#define VIDENC_MALLOC(_p_, _s_, _c_, _h_, dbg) \
do { \
_p_ = (_c_*)malloc(_s_); \
if (_p_ == NULL) { \
OMX_TRACE4(dbg, "malloc() error.\n"); \
eError = OMX_ErrorInsufficientResources; \
goto OMX_CONF_CMD_BAIL; \
} \
else { \
OMX_TRACE1(dbg, "malloc() -> %p\n", _p_); \
} \
memset((_p_), 0x0, _s_); \
if ((_p_) == NULL) { \
OMX_TRACE4(dbg, "memset() error.\n"); \
eError = OMX_ErrorUndefined; \
goto OMX_CONF_CMD_BAIL; \
} \
eError = OMX_VIDENC_ListAdd(&(dbg), _h_, _p_); \
if (eError == OMX_ErrorInsufficientResources) { \
OMX_TRACE4(dbg, "malloc() error.\n"); \
goto OMX_CONF_CMD_BAIL; \
} \
} while(0)
#define VIDENC_FREE(_p_, _h_, dbg) \
do { \
OMX_VIDENC_ListRemove((&dbg), _h_, _p_); \
_p_ = NULL; \
} while(0)
typedef struct VIDENC_NODE
{
OMX_PTR pData;
struct VIDENC_NODE* pNext;
}VIDENC_NODE;
typedef enum VIDEOENC_PORT_INDEX
{
VIDENC_INPUT_PORT = 0x0,
VIDENC_OUTPUT_PORT
} VIDEOENC_PORT_INDEX;
/* Custom set/get param */
typedef struct VIDENC_CUSTOM_DEFINITION
{
OMX_U8 cCustomName[128];
OMX_INDEXTYPE nCustomIndex;
} VIDENC_CUSTOM_DEFINITION;
typedef struct OMX_CONF_CIRCULAR_BUFFER_NODE
{
OMX_HANDLETYPE hMarkTargetComponent;
OMX_PTR pMarkData;
OMX_U32 nTickCount;
OMX_TICKS nTimeStamp;
OMX_U32 nFlags;
struct OMX_CONF_CIRCULAR_BUFFER_NODE* pNext;
} OMX_CONF_CIRCULAR_BUFFER_NODE;
typedef struct OMX_CONF_CIRCULAR_BUFFER
{
struct OMX_CONF_CIRCULAR_BUFFER_NODE* pHead;
struct OMX_CONF_CIRCULAR_BUFFER_NODE* pTail;
OMX_U8 nElements;
OMX_U8 nFillElements;
} OMX_CONF_CIRCULAR_BUFFER;
typedef enum VIDENC_CUSTOM_INDEX
{
#ifdef KHRONOS_1_2
VideoEncodeCustomParamIndexVBVSize = OMX_IndexVendorStartUnused,
#else
VideoEncodeCustomParamIndexVBVSize = OMX_IndexIndexVendorStartUnused,
#endif
VideoEncodeCustomParamIndexDeblockFilter,
VideoEncodeCustomConfigIndexForceIFrame,
VideoEncodeCustomConfigIndexIntraFrameInterval,
VideoEncodeCustomConfigIndexTargetFrameRate,
VideoEncodeCustomConfigIndexQPI,
VideoEncodeCustomConfigIndexAIRRate,
VideoEncodeCustomConfigIndexTargetBitRate,
/*Segment mode Metadata*/
VideoEncodeCustomConfigIndexMVDataEnable,
VideoEncodeCustomConfigIndexResyncDataEnable,
/*ASO*/
VideoEncodeCustomConfigIndexNumSliceASO,
VideoEncodeCustomConfigIndexAsoSliceOrder,
/*FMO*/
VideoEncodeCustomConfigIndexNumSliceGroups,
VideoEncodeCustomConfigIndexSliceGroupMapType,
VideoEncodeCustomConfigIndexSliceGroupChangeDirectionFlag,
VideoEncodeCustomConfigIndexSliceGroupChangeRate,
VideoEncodeCustomConfigIndexSliceGroupChangeCycle,
VideoEncodeCustomConfigIndexSliceGroupParams,
/*others*/
VideoEncodeCustomConfigIndexMIRRate,
VideoEncodeCustomConfigIndexMaxMVperMB,
VideoEncodeCustomConfigIndexIntra4x4EnableIdc,
/*only for H264*/
VideoEncodeCustomParamIndexEncodingPreset,
VideoEncodeCustomParamIndexNALFormat,
/* debug config */
VideoEncodeCustomConfigIndexDebug
} VIDENC_CUSTOM_INDEX;
typedef enum VIDENC_BUFFER_OWNER
{
VIDENC_BUFFER_WITH_CLIENT = 0x0,
VIDENC_BUFFER_WITH_COMPONENT,
VIDENC_BUFFER_WITH_DSP,
VIDENC_BUFFER_WITH_TUNNELEDCOMP
} VIDENC_BUFFER_OWNER;
typedef enum VIDENC_AVC_NAL_FORMAT
{
VIDENC_AVC_NAL_UNIT = 0, /*Default, one buffer per frame, no NAL mode*/
VIDENC_AVC_NAL_SLICE, /*One NAL unit per buffer, one or more NAL units conforms a Frame*/
VIDENC_AVC_NAL_FRAME /*One frame per buffer, one or more NAL units inside the buffer*/
}VIDENC_AVC_NAL_FORMAT;
typedef struct VIDENC_BUFFER_PRIVATE
{
OMX_PTR pMetaData;/*pointer to metadata structure, this structure is used when MPEG4 segment mode is enabled */
OMX_BUFFERHEADERTYPE* pBufferHdr;
OMX_PTR pUalgParam;
VIDENC_BUFFER_OWNER eBufferOwner;
OMX_BOOL bAllocByComponent;
OMX_BOOL bReadFromPipe;
} VIDENC_BUFFER_PRIVATE;
typedef struct VIDENC_MPEG4_SEGMENTMODE_METADATA
{
unsigned int mvDataSize;/*unsigned int*/
unsigned int numPackets;/*unsigned int*/
OMX_PTR pMVData;/*pointer to unsigned char MVData[3264]*/
OMX_PTR pResyncData;/*pointer to unsigned char ResyncData[5408]*/
}VIDENC_MPEG4_SEGMENTMODE_METADATA;
typedef struct VIDEOENC_PORT_TYPE
{
OMX_U32 nBufferCnt;
OMX_U32 nTunnelPort;
OMX_HANDLETYPE hTunnelComponent;
OMX_BUFFERSUPPLIERTYPE eSupplierSetting;
OMX_PARAM_PORTDEFINITIONTYPE* pPortDef;
OMX_VIDEO_PARAM_PORTFORMATTYPE* pPortFormat;
#ifdef __KHRONOS_CONF_1_1__
OMX_VIDEO_PARAM_PROFILELEVELTYPE* pProfileType;
OMX_CONFIG_FRAMERATETYPE* pFrameRateConfig;
OMX_VIDEO_CONFIG_BITRATETYPE* pBitRateTypeConfig;
OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pErrorCorrectionType;
OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pIntraRefreshType;
#endif
OMX_VIDEO_PARAM_BITRATETYPE* pBitRateType;
VIDENC_BUFFER_PRIVATE* pBufferPrivate[VIDENC_MAX_NUM_OF_BUFFERS];
} VIDEOENC_PORT_TYPE;
#ifndef KHRONOS_1_2
typedef enum OMX_EXTRADATATYPE
{
OMX_ExtraDataNone = 0,
OMX_ExtraDataQuantization
} OMX_EXTRADATATYPE;
#endif
typedef struct OMX_OTHER_EXTRADATATYPE_1_1_2
{
OMX_U32 nSize;
OMX_VERSIONTYPE nVersion;
OMX_U32 nPortIndex;
OMX_EXTRADATATYPE eType;
OMX_U32 nDataSize;
OMX_U8 data[1];
} OMX_OTHER_EXTRADATATYPE_1_1_2;
typedef struct VIDEO_PROFILE_LEVEL
{
OMX_S32 nProfile;
OMX_S32 nLevel;
} VIDEO_PROFILE_LEVEL_TYPE;
/**
* The VIDENC_COMPONENT_PRIVATE data structure is used to store component's
* private data.
*/
typedef struct VIDENC_COMPONENT_PRIVATE
{
OMX_PORT_PARAM_TYPE* pPortParamType;
VIDEOENC_PORT_TYPE* pCompPort[VIDENC_NUM_OF_PORTS];
#ifdef __KHRONOS_CONF_1_1__
OMX_PORT_PARAM_TYPE* pPortAudioType;
OMX_PORT_PARAM_TYPE* pPortImageType;
OMX_PORT_PARAM_TYPE* pPortOtherType;
#endif
OMX_PRIORITYMGMTTYPE* pPriorityMgmt;
OMX_VIDEO_PARAM_AVCTYPE* pH264;
OMX_VIDEO_CONFIG_AVCINTRAPERIOD* pH264IntraPeriod; /* for intraFrameInterval */
OMX_VIDEO_PARAM_MOTIONVECTORTYPE* pMotionVector; /* for searchRange, maxMVperMB, qpi */
OMX_VIDEO_PARAM_MPEG4TYPE* pMpeg4;
OMX_VIDEO_PARAM_H263TYPE* pH263;
OMX_VIDEO_PARAM_BITRATETYPE* pVidParamBitrate;
OMX_VIDEO_PARAM_QUANTIZATIONTYPE* pQuantization;
OMX_CALLBACKTYPE sCbData;
OMX_COMPONENTTYPE* pHandle;
OMX_STATETYPE eState;
OMX_VERSIONTYPE ComponentVersion;
OMX_VERSIONTYPE SpecVersion;
OMX_STRING cComponentName;
int nFree_oPipe[2];
int nFilled_iPipe[2];
int nCmdPipe[2];
int nCmdDataPipe[2];
void* pModLcml;
void* pLcmlHandle;
LCML_DSP_INTERFACE* pLCML;
int nFrameCnt;
#ifdef __PERF_INSTRUMENTATION__
PERF_OBJHANDLE pPERF, pPERFcomp;
OMX_U32 nLcml_nCntIp;
OMX_U32 nLcml_nCntOpReceived;
#endif
unsigned int nVBVSize;
OMX_MARKTYPE* pMarkBuf;
OMX_PTR pMarkData;
OMX_HANDLETYPE hMarkTargetComponent;
OMX_U32 nFlags;
OMX_U32 nCounter;
/* these are duplicates */
unsigned int nIntraFrameInterval; /* should be OMX_VIDEO_CONFIG_AVCINTRAPERIOD */
unsigned int nTargetFrameRate; /* should be OMX_CONFIG_FRAMERATETYPE */
unsigned int nQPI; /* same as OMX_VIDEO_PARAM_QUANTIZATIONTYPE */
unsigned int nAIRRate; /* same as OMX_VIDEO_PARAM_INTRAREFRESHTYPE */
unsigned int nTargetBitRate; /* should be OMX_VIDEO_CONFIG_BITRATETYPE */
OMX_U32 nMIRRate;
OMX_U32 nInBufferSize;
OMX_U32 nOutBufferSize;
#ifndef UNDER_CE
pthread_mutex_t mVideoEncodeBufferMutex;
#endif
OMX_BOOL bDeblockFilter;
OMX_BOOL bCodecStarted;
OMX_BOOL bCodecLoaded;
OMX_BOOL bDSPStopAck;
OMX_BOOL bForceIFrame;
OMX_BOOL bFlushComplete;
OMX_BOOL bEmptyPipes;
OMX_BOOL bHideEvents;
OMX_BOOL bHandlingFatalError;
OMX_BOOL bUnresponsiveDsp;
VIDENC_NODE* pMemoryListHead;
OMX_CONF_CIRCULAR_BUFFER sCircularBuffer;
#ifdef __KHRONOS_CONF__
#ifdef __KHRONOS_CONF_1_1__
OMX_PARAM_COMPONENTROLETYPE componentRole;
#endif
OMX_BOOL bPassingIdleToLoaded;
OMX_BOOL bErrorLcmlHandle;
pthread_t ComponentThread;
#endif
/*ASO*/
OMX_U32 numSliceASO;
OMX_U32 asoSliceOrder[MAXNUMSLCGPS];
/*FMO*/
OMX_U32 numSliceGroups;
OMX_U32 sliceGroupMapType;
OMX_U32 sliceGroupChangeDirectionFlag;
OMX_U32 sliceGroupChangeRate;
OMX_U32 sliceGroupChangeCycle;
OMX_U32 sliceGroupParams[MAXNUMSLCGPS];
#ifndef UNDER_CE
pthread_mutex_t videoe_mutex; /* pthread_cond_t control_cond; */
pthread_mutex_t videoe_mutex_app;
pthread_cond_t populate_cond;
pthread_cond_t unpopulate_cond;
pthread_cond_t stop_cond;
pthread_cond_t flush_cond;
#else
OMX_Event AlloBuf_event;
OMX_U8 AlloBuf_waitingsignal;
OMX_Event InLoaded_event;
OMX_U8 InLoaded_readytoidle;
OMX_Event InIdle_event;
OMX_U8 InIdle_goingtoloaded;
#endif
unsigned int nEncodingPreset;
VIDENC_AVC_NAL_FORMAT AVCNALFormat;
OMX_BOOL bMVDataEnable;
OMX_BOOL bResyncDataEnable;
IH264VENC_Intra4x4Params intra4x4EnableIdc;
OMX_U32 maxMVperMB;
#ifdef RESOURCE_MANAGER_ENABLED
RMPROXY_CALLBACKTYPE cRMCallBack;
#endif
OMX_BOOL bPreempted;
OMX_VIDEO_CODINGTYPE compressionFormats[3];
OMX_COLOR_FORMATTYPE colorFormats[3];
struct OMX_TI_Debug dbg;
PV_OMXComponentCapabilityFlagsType* pCapabilityFlags;
/* Reference count for pending state change requests */
OMX_U32 nPendingStateChangeRequests;
pthread_mutex_t mutexStateChangeRequest;
pthread_cond_t StateChangeCondition;
} VIDENC_COMPONENT_PRIVATE;
typedef OMX_ERRORTYPE (*fpo)(OMX_HANDLETYPE);
/*--------function prototypes ---------------------------------*/
#ifndef UNDER_CE
OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComp);
#endif
OMX_ERRORTYPE OMX_VIDENC_HandleLcmlEvent(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, TUsnCodecEvent eEvent, void* argsCb []);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandStateSet(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandStateSet (VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandStateSetIdle(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandStateSetLoaded (VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandStateSetExecuting(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandStateSetPause (VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandFlush(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1, OMX_BOOL bInternalFlush);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandDisablePort(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
OMX_ERRORTYPE OMX_VIDENC_HandleCommandEnablePort(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
OMX_ERRORTYPE OMX_VIDENC_Process_FilledInBuf(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_Process_FilledOutBuf(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BUFFERHEADERTYPE* pBufHead);
OMX_ERRORTYPE OMX_VIDENC_Process_FreeInBuf(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BUFFERHEADERTYPE* pBufHead);
OMX_ERRORTYPE OMX_VIDENC_Process_FreeOutBuf(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_InitLCML(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_InitDSP_H264Enc(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_InitDSP_Mpeg4Enc(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE OMX_VIDENC_LCML_Callback(TUsnCodecEvent event, void* argsCb [10]);
OMX_ERRORTYPE OMX_VIDENC_Allocate_DSPResources (OMX_IN VIDENC_COMPONENT_PRIVATE* pComponentPrivate,
OMX_IN OMX_U32 nPortIndex);
OMX_ERRORTYPE OMX_VIDENC_EmptyDataPipes (void* pThreadData);
OMX_ERRORTYPE OMX_VIDENC_ListCreate(struct OMX_TI_Debug *dbg, struct VIDENC_NODE** pListHead);
OMX_ERRORTYPE OMX_VIDENC_ListAdd(struct OMX_TI_Debug *dbg, struct VIDENC_NODE* pListHead, OMX_PTR pData);
OMX_ERRORTYPE OMX_VIDENC_ListRemove(struct OMX_TI_Debug *dbg, struct VIDENC_NODE* pListHead, OMX_PTR pData);
OMX_ERRORTYPE OMX_VIDENC_ListDestroy(struct OMX_TI_Debug *dbg, struct VIDENC_NODE* pListHead);
OMX_ERRORTYPE OMX_VIDENC_HandleError(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_ERRORTYPE eError);
#ifdef RESOURCE_MANAGER_ENABLED
void OMX_VIDENC_ResourceManagerCallBack(RMPROXY_COMMANDDATATYPE cbData);
#endif
OMX_U32 GetMaxAVCBufferSize(OMX_U32 width, OMX_U32 height);
OMX_ERRORTYPE AddStateTransition(VIDENC_COMPONENT_PRIVATE* pComponentPrivate);
OMX_ERRORTYPE RemoveStateTransition(VIDENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BOOL bEnableSignal);
#endif