blob: 31026d4a1b343a9f31f4369b77bdb4289219c6ee [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef PVMF_OMX_ENC_NODE_H_INCLUDED
#define PVMF_OMX_ENC_NODE_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef PVMF_FORMAT_TYPE_H_INCLUDED
#include "pvmf_format_type.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef OSCL_PRIQUEUE_H_INCLUDED
#include "oscl_priqueue.h"
#endif
#ifndef PVMF_MEDIA_DATA_H_INCLUDED
#include "pvmf_media_data.h"
#endif
#ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
#include "oscl_mem_mempool.h"
#endif
#ifndef PVMF_MEMPOOL_H_INCLUDED
#include "pvmf_mempool.h"
#endif
#ifndef PVMF_FIXEDSIZE_BUFFER_ALLOC_H_INCLUDED
#include "pvmf_fixedsize_buffer_alloc.h"
#endif
#ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
#include "pvmf_simple_media_buffer.h"
#endif
#ifndef PVMF_MEDIA_FRAG_GROUP_H_INCLUDED
#include "pvmf_media_frag_group.h"
#endif
#ifndef PVMF_POOL_BUFFER_ALLOCATOR_H_INCLUDED
#include "pvmf_pool_buffer_allocator.h"
#endif
#ifndef PVMF_VIDEO_H_INCLUDED
#include "pvmf_video.h"
#endif
#ifndef PVMF_POOL_BUFFER_ALLOCATOR_H_INCLUDED
#include "pvmf_pool_buffer_allocator.h"
#endif
#ifndef PVMF_NODE_UTILS_H_INCLUDED
#include "pvmf_node_utils.h"
#endif
#ifndef PVMF_OMX_ENC_PORT_H_INCLUDED
#include "pvmf_omx_enc_port.h"
#endif
#ifndef PVMF_OMX_ENC_NODE_EXTENSION_INTERFACE_H_INCLUDED
#include "pvmf_omx_enc_node_extension_interface.h"
#endif
#ifndef PV_MP4_H263_ENC_EXTENSION_H_INCLUDED
#include "pvmp4h263encextension.h"
#endif
#ifndef PVMF_AUDIO_ENCNODE_EXTENSION_H_INCLUDED
#include "pvmf_audio_encnode_extension.h"
#endif
// DV: NOTE - this needs to be fixed
//#ifndef __PVM4VENCODER_H
//#include "pvm4vencoder.h"
//#endif
#ifndef PVMF_META_DATA_EXTENSION_H_INCLUDED
#include "pvmf_meta_data_extension.h"
#endif
#ifndef PV_MIME_STRING_UTILS_H_INCLUDED
#include "pv_mime_string_utils.h"
#endif
#ifndef OMX_Core_h
#include "OMX_Core.h"
#endif
#ifndef OMX_Component_h
#include "OMX_Component.h"
#endif
#ifndef PVMF_OMX_ENC_CALLBACKS_H_INCLUDED
#include "pvmf_omx_enc_callbacks.h"
#endif
#ifndef PV_OMXDEFS_H_INCLUDED
#include "pv_omxdefs.h"
#endif
#ifndef OSCLCONFIG_IO_H_INCLUDED
#include "osclconfig_io.h"
#endif
#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif
#if (PVLOGGER_INST_LEVEL >= PVLOGMSG_INST_REL)
#ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
#include "pvmf_media_clock.h"
#endif
#endif
#ifndef __MEDIA_CLOCK_CONVERTER_H
#include "media_clock_converter.h"
#endif
#define PVMFOMXENCNODE_NUM_CMD_IN_POOL 8
#define PVOMXENCMAXNUMDPBFRAMESPLUS1 17
typedef struct OutputBufCtrlStruct
{
OMX_BUFFERHEADERTYPE *pBufHdr;
} OutputBufCtrlStruct;
typedef struct InputBufCtrlStruct
{
OMX_BUFFERHEADERTYPE *pBufHdr;
PVMFSharedMediaDataPtr pMediaData;
} InputBufCtrlStruct;
// fwd class declaration
class PVLogger;
//memory allocator type for this node.
typedef OsclMemAllocator PVMFOMXEncNodeAllocator;
typedef OsclMemAllocDestructDealloc<uint8> PVMFOMXEncNodeAllocDestructDealloc;
// CALLBACK PROTOTYPES
OMX_ERRORTYPE CallbackEventHandlerEnc(OMX_OUT OMX_HANDLETYPE aComponent,
OMX_OUT OMX_PTR aAppData,
OMX_OUT OMX_EVENTTYPE aEvent,
OMX_OUT OMX_U32 aData1,
OMX_OUT OMX_U32 aData2,
OMX_OUT OMX_PTR aEventData);
OMX_ERRORTYPE CallbackEmptyBufferDoneEnc(OMX_OUT OMX_HANDLETYPE aComponent,
OMX_OUT OMX_PTR aAppData,
OMX_OUT OMX_BUFFERHEADERTYPE* aBuffer);
OMX_ERRORTYPE CallbackFillBufferDoneEnc(OMX_OUT OMX_HANDLETYPE aComponent,
OMX_OUT OMX_PTR aAppData,
OMX_OUT OMX_BUFFERHEADERTYPE* aBuffer);
//Default values for number of Input/Output buffers. If the component needs more than this, it will be
// negotiated. If the component does not need more than this number, the default is used
#define NUMBER_INPUT_BUFFER 5
#define NUMBER_OUTPUT_BUFFER 9
// for AMR encoder
#define MAX_NUM_AMR_FRAMES_PER_BUFFER 25
#define PVMF_AMRENC_DEFAULT_SAMPLING_RATE 8000
#define PVMF_AMRENC_DEFAULT_NUM_CHANNELS 1
#define PVMF_AMRENC_DEFAULT_BITSPERSAMPLE 16
// in milliseconds
#define PVMF_AMRENC_DEFAULT_FRAME_DURATION 20
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////
/////////////////////////
/////////////////////////
// CUSTOM DEALLOCATOR FOR MEDIA DATA SHARED PTR WRAPPER:
// 1) Deallocates the underlying output buffer
// 2) Deallocates the pvci buffer wrapper and the rest of accompanying structures
// Deallocator is created as part of the wrapper, and travels with the buffer wrapper
class PVOMXEncBufferSharedPtrWrapperCombinedCleanupDA : public OsclDestructDealloc
{
public:
PVOMXEncBufferSharedPtrWrapperCombinedCleanupDA(Oscl_DefAlloc* allocator, void *pMempoolData) :
buf_alloc(allocator), ptr_to_data_to_dealloc(pMempoolData) {};
virtual ~PVOMXEncBufferSharedPtrWrapperCombinedCleanupDA() {};
virtual void destruct_and_dealloc(OsclAny* ptr)
{
// call buffer deallocator
if (buf_alloc != NULL)
{
buf_alloc->deallocate(ptr_to_data_to_dealloc);
}
// this is needed to completely free PVMFMediaDataImpl, since it allocates memory for the frag list
((PVMFMediaDataImpl*)ptr)->~PVMFMediaDataImpl();
oscl_free(ptr);
}
private:
Oscl_DefAlloc* buf_alloc;
void *ptr_to_data_to_dealloc;
};
#define PVMFOMXEncNodeCommandBase PVMFGenericNodeCommand<PVMFOMXEncNodeAllocator>
class PVMFOMXEncNodeCommand: public PVMFOMXEncNodeCommandBase
{
public:
//constructor for Custom2 command
void Construct(PVMFSessionId s, int32 cmd, int32 arg1, int32 arg2, int32& arg3, const OsclAny*aContext)
{
PVMFOMXEncNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)arg1;
iParam2 = (OsclAny*)arg2;
iParam3 = (OsclAny*) & arg3;
}
void Parse(int32&arg1, int32&arg2, int32*&arg3)
{
arg1 = (int32)iParam1;
arg2 = (int32)iParam2;
arg3 = (int32*)iParam3;
}
void Construct(PVMFSessionId s, int32 cmd, PVMFMetadataList* aKeyList, uint32 aStartIndex, int32 aMaxEntries, char* aQueryKey, const OsclAny* aContext)
{
PVMFOMXEncNodeCommandBase::Construct(s, cmd, aContext);
iStartIndex = aStartIndex;
iMaxEntries = aMaxEntries;
if (aQueryKey == NULL)
{
query_key[0] = 0;
}
else
{
if (aQueryKey != NULL)
oscl_strncpy(query_key, aQueryKey, oscl_strlen(aQueryKey) + 1);
}
iParam1 = (OsclAny*)aKeyList;
iParam2 = NULL;
iParam3 = NULL;
iParam4 = NULL;
iParam5 = NULL;
}
void Parse(PVMFMetadataList*& MetaDataListPtr, uint32 &aStartingIndex, int32 &aMaxEntries, char*&aQueryKey)
{
MetaDataListPtr = (PVMFMetadataList*)iParam1;
aStartingIndex = iStartIndex;
aMaxEntries = iMaxEntries;
if (query_key[0] == 0)
{
aQueryKey = NULL;
}
else
{
aQueryKey = query_key;
}
}
// Constructor and parser for GetNodeMetadataValue
void Construct(PVMFSessionId s, int32 cmd, PVMFMetadataList* aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>* aValueList, uint32 aStartIndex, int32 aMaxEntries, const OsclAny* aContext)
{
PVMFOMXEncNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)aKeyList;
iParam2 = (OsclAny*)aValueList;
iStartIndex = aStartIndex;
iMaxEntries = aMaxEntries;
iParam3 = NULL;
iParam4 = NULL;
iParam5 = NULL;
}
void Parse(PVMFMetadataList* &aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>* &aValueList, uint32 &aStartingIndex, int32 &aMaxEntries)
{
aKeyList = (PVMFMetadataList*)iParam1;
aValueList = (Oscl_Vector<PvmiKvp, OsclMemAllocator>*)iParam2;
aStartingIndex = iStartIndex;
aMaxEntries = iMaxEntries;
}
virtual bool hipri()
{
//this routine identifies commands that need to
//go at the front of the queue. derived command
//classes can override it if needed.
return (iCmd == PVOMXENC_NODE_CMD_CANCELALL
|| iCmd == PVOMXENC_NODE_CMD_CANCELCMD);
}
enum PVOMXEncNodeCmdType
{
PVOMXENC_NODE_CMD_QUERYUUID,
PVOMXENC_NODE_CMD_QUERYINTERFACE,
PVOMXENC_NODE_CMD_REQUESTPORT,
PVOMXENC_NODE_CMD_RELEASEPORT,
PVOMXENC_NODE_CMD_INIT,
PVOMXENC_NODE_CMD_PREPARE,
PVOMXENC_NODE_CMD_START,
PVOMXENC_NODE_CMD_STOP,
PVOMXENC_NODE_CMD_FLUSH,
PVOMXENC_NODE_CMD_PAUSE,
PVOMXENC_NODE_CMD_RESET,
PVOMXENC_NODE_CMD_CANCELALL,
PVOMXENC_NODE_CMD_CANCELCMD,
PVOMXENC_NODE_CMD_GETNODEMETADATAKEY,
PVOMXENC_NODE_CMD_GETNODEMETADATAVALUE,
PVOMXENC_NODE_CMD_INVALID
};
private:
uint32 iStartIndex;
uint32 iMaxEntries;
char query_key[256];
};
//Default vector reserve size
#define PVMF_OMXENC_NODE_COMMAND_VECTOR_RESERVE 10
//Starting value for command IDs
#define PVMF_OMXENC_NODE_COMMAND_ID_START 6000
////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////// STRUCTURES FOR ENCODING PARAMETERS ////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
#define MAX_LAYER 1
/** Contains supported input format */
enum EncVideoInputFormat
{
EI_RGB24,
EI_RGB12,
EI_YUV420,
EI_UYVY
};
/** Type of contents for optimal encoding mode. */
enum EncContentType
{
/** Content is to be streamed in real-time. */
EI_M4V_STREAMING,
/** Content is to be downloaded and playbacked later.*/
EI_M4V_DOWNLOAD,
/** Content is to be 3gpp baseline compliant. */
EI_H263,
EI_H264
};
/** Targeted profile and level to encode. */
enum EncM4VProfileLevel
{
/* Non-scalable profile */
EI_SIMPLE_LEVEL0 = 0,
EI_SIMPLE_LEVEL1,
EI_SIMPLE_LEVEL2,
EI_SIMPLE_LEVEL3,
EI_CORE_LEVEL1,
EI_CORE_LEVEL2,
/* Scalable profile */
EI_SIMPLE_SCALABLE_LEVEL0 = 6,
EI_SIMPLE_SCALABLE_LEVEL1,
EI_SIMPLE_SCALABLE_LEVEL2,
EI_CORE_SCALABLE_LEVEL1 = 10,
EI_CORE_SCALABLE_LEVEL2,
EI_CORE_SCALABLE_LEVEL3
};
/** Targeted profile to encode. */
enum EncAVCProfile
{
/* Non-scalable profile */
EI_PROFILE_DEFAULT,
EI_PROFILE_BASELINE,
EI_PROFILE_MAIN,
EI_PROFILE_EXTENDED,
EI_PROFILE_HIGH,
EI_PROFILE_HIGH10,
EI_PROFILE_HIGH422,
EI_PROFILE_HIGH444
};
/** Targeted level to encode. */
enum EncAVCLevel
{
EI_LEVEL_AUTODETECT,
EI_LEVEL_1,
EI_LEVEL_1B,
EI_LEVEL_11,
EI_LEVEL_12,
EI_LEVEL_13,
EI_LEVEL_2,
EI_LEVEL_21,
EI_LEVEL_22,
EI_LEVEL_3,
EI_LEVEL_31,
EI_LEVEL_32,
EI_LEVEL_4,
EI_LEVEL_41,
EI_LEVEL_42,
EI_LEVEL_5,
EI_LEVEL_51,
};
/** Output format */
enum TAVCEIOutputFormat
{
/** output in byte stream format according to Annex B */
EAVCEI_OUTPUT_ANNEXB,
/** output for MP4 file format */
EAVCEI_OUTPUT_MP4,
/** output in RTP format according to RFC 3984 */
EAVCEI_OUTPUT_RTP
};
/** Type of contents for optimal encoding mode. */
enum EncEncodingMode
{
/** Content is encoded as fast as possible with error protection */
EI_ENCMODE_TWOWAY,
/** Content is encoded as fast as possible without error protection */
EI_ENCMODE_RECORDER,
/** Content is encoded with better quality (slow) with error protection */
EI_ENCMODE_STREAMING,
/** Content is encoded with better quality (slow) without error protection */
EI_ENCMODE_DOWNLOAD
};
/** This structure contains encoder settings. */
typedef struct PV_VideoEncodeParam
{
////////////////////////////////////////////////////////////////////////////////////
////////////////////////// COMMON PARAMETERS ///////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
/** Specifies an ID that will be used to specify this encoder while returning
the bitstream in asynchronous mode. */
uint32 iEncodeID;
/** Specifies whether base only (iNumLayer = 1) or base + enhancement layer
(iNumLayer =2 ) is to be used. */
int32 iNumLayer;
/** Specifies the width in pixels of the encoded frames. IFrameWidth[0] is for
base layer and iFrameWidth[1] is for enhanced layer. */
int iFrameWidth[MAX_LAYER];
/** Specifies the height in pixels of the encoded frames. IFrameHeight[0] is for
base layer and iFrameHeight[1] is for enhanced layer. */
int iFrameHeight[MAX_LAYER];
/** Specifies the cumulative bit rate in bit per second. IBitRate[0] is for base
layer and iBitRate[1] is for base+enhanced layer.*/
int iBitRate[MAX_LAYER];
/** Specifies the cumulative frame rate in frame per second. IFrameRate[0] is for
base layer and iFrameRate[1] is for base+enhanced layer. */
float iFrameRate[MAX_LAYER];
/** Specifies the rate control algorithm among one of the following constant Q,
CBR and VBR. The structure EncRateControlType is defined above.*/
PVMFVENRateControlType iRateControlType;
/** Specifies the initial quantization parameter for the first I-frame. If constant Q
rate control is used, this QP will be used for all the I-frames. This number must be
set between 1 and 31, otherwise, Initialize() will fail. */
int iIquant[2];
/** Specifies the initial quantization parameter for the first P-frame. If constant Q
rate control is used, this QP will be used for all the P-frames. This number must be
set between 1 and 31, otherwise, Initialize() will fail. */
int iPquant[2];
/** Specifies the initial quantization parameter for the first B-frame. If constant Q
rate control is used, this QP will be used for all the B-frames. This number must be
set between 1 and 31, otherwise, Initialize() will fail. */
int iBquant[2];
/** Specifies the maximum number of P-frames between 2 INTRA frames. An INTRA mode is
forced to a frame once this interval is reached. When there is only one I-frame is present
at the beginning of the clip, iIFrameInterval should be set to -1. */
int32 iIFrameInterval;
/** According to iIFrameInterval setting, the minimum number of intra MB per frame is
optimally calculated for error resiliency. However, when iIFrameInterval is set to -1,
iNumIntraMBRefresh must be specified to guarantee the minimum number of intra
macroblocks per frame.*/
uint32 iNumIntraMBRefresh;
/** Specifies automatic scene detection where I-frame will be used the the first frame
in a new scene. */
bool iSceneDetection;
/** Specifies the packet size in bytes which represents the number of bytes between two resync markers.
For EI_M4V_DOWNLOAD and EI_H263, if iPacketSize is set to 0, there will be no resync markers in the bitstream.
For EI_M4V_STREAMING is parameter must be set to a value greater than 0. For AVC, this value specifies
the packet size in bytes which represents the desired number of bytes per NAL.
If this number is set to 0, the AVC encoder will encode the entire slice group as one NAL. */
uint32 iPacketSize;
/** Specifies the VBV buffer size which determines the end-to-end delay between the
encoder and the decoder. The size is in unit of seconds. For download application,
the buffer size can be larger than the streaming application. For 2-way application,
this buffer shall be kept minimal. For a special case, in VBR mode, iBufferDelay will
be set to -1 to allow buffer underflow. */
float iBufferDelay;
/** Specifies the duration of the clip in millisecond.*/
int32 iClipDuration;
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////// H263/M4V specific parameters ///////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
/** Specifies the profile and level used to encode the bitstream. When present,
other settings will be checked against the range allowable by this target profile
and level. Fail may be returned from the Initialize call. */
EncM4VProfileLevel iProfileLevel;
/** Specifies the picture quality factor on the scale of 1 to 10. It trades off
the picture quality with the frame rate. Higher frame quality means lower frame rate.
Lower frame quality for higher frame rate.*/
int32 iFrameQuality;
/** Enable the use of iFrameQuality to determine the frame rate. If it is false,
the encoder will try to meet the specified frame rate regardless of the frame quality.*/
bool iEnableFrameQuality;
/** Specifies high quality but also high complexity mode for rate control. */
bool iRDOptimal;
/** Specifies the search range in pixel unit for motion vector. The range of the
motion vector will be of dimension [-iSearchRange.5, +iSearchRange.0]. */
int32 iSearchRange;
/** Specifies the use of 8x8 motion vectors. */
bool iMV8x8;
/** Specifies the use of half-pel motion vectors. */
bool iMVHalfPel;
/** Specifies whether the current frame skipping decision is allowed after encoding
the current frame. If there is no memory of what has been coded for the current frame,
iNoCurrentSkip has to be on. */
bool iNoCurrentSkip;
/** Specifies that no frame skipping is allowed. Frame skipping is a tool used to
control the average number of bits spent to meet the target bit rate. */
bool iNoFrameSkip;
/** Specify short header mode in MPEG4 */
bool iShortHeader;
/** Specifies whether data partitioning mode is used or not. Has no meaning if encoding H.263 or short header */
bool iDataPartitioning;
/** Specifies whether Resync markers are used or not Has no meaning if iDataPartitioning is on */
bool iResyncMarker;
/** Specifies whether RVLC (reversible VLC) is to be used or not.
*/
bool iRVLCEnable;
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////// H264 specific parameters ///////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
/** Specifies the targeted profile, and will also specifies available tools for iEncMode.
If default is used, encoder will choose its own preferred profile. If autodetect is used, encoder
will check other settings and choose the right profile that doesn't have any conflicts. */
EncAVCProfile iAVCProfile;
/** Specifies the target level When present,
other settings will be checked against the range allowable by this target level.
Fail will returned upon Initialize call. If not known, users must set it to autodetect. Encoder will
calculate the right level that doesn't conflict with other settings. */
EncAVCLevel iAVCLevel;
/** Specifies the encoding mode. This translates to the complexity of encoding modes and
error resilient tools. This is for future use - enc mode will be used to set other parameters to appropriate
values.
*/
EncEncodingMode iEncMode;
/** Specifies that SPS and PPS are retrieved first and sent out-of-band */
//bool iOutOfBandParamSet;
} PV_VideoEncodeParam;
/** Structure for input format information */
typedef struct PV_VideoInputFormat
{
/** Contains the width in pixels of the input frame. */
int32 iFrameWidth;
/** Contains the height in pixels of the input frame. */
int32 iFrameHeight;
/** Contains the input frame rate in the unit of frame per second. */
float iFrameRate;
/** Contains Frame Orientation. Used for RGB input. 1 means Bottom_UP RGB, 0 means Top_Down RGB, -1 for video formats other than RGB*/
int iFrameOrientation;
/** Contains the format of the input video, e.g., YUV 4:2:0, UYVY, RGB24, etc. */
EncVideoInputFormat iVideoFormat;
} PV_VideoInputFormat;
/** Structure for audio encode information */
typedef struct PV_AudioEncodeParam
{
// DESCRIPTION: Final sampling frequency used when encoding in Hz.
// For example, "44100" Hz.
// USAGE: If the input sampling rate is not appropriate (e.g.,
// the codec requires a different sampling frequency),
// the CAEI will fill this in with the final sampling
// rate. The CAEI will perform resampling if the
// input sampling frequency is not the same as the output
// sampling frequency.
uint32 iOutputSamplingRate;
// DESCRIPTION: Number of output channels:1=Mono,2=Stereo. (Mono uses 1
// channel; Stereo uses 2 channels).
// USAGE: The CAEI will fill this in if it needs to convert
// the input samples to what is required by the codec.
uint8 iOutputNumChannels;
// DESCRIPTION: Currently, output bitrate is expressed as GSM-AMR type rate
PVMF_GSMAMR_Rate iAMRBitrate;
// DESCRIPTION: output bitrate in bits per second for non-AMR codecs
uint32 iOutputBitrate;
//
uint32 iMaxNumOutputFramesPerBuffer;
} PV_AudioEncodeParam;
enum EInterleaveMode
{
EINTERLEAVE_LR, // interleaved left-right
EGROUPED_LR, // non-interleaved left-right
ENUM_INTERLEAVE_MODES // number of modes supported
};
/** Structure for input format information */
typedef struct PV_AudioInputFormat
{
// DESCRIPTION: Number of bits per sample. For example, set it to "16"
// bits for PCM.
// USAGE: The authoring application is required to fill this in.
//
int32 iInputBitsPerSample;
// DESCRIPTION: Sampling rate of the input samples in Hz.
// For example, set it to "22050" Hz. AMRNB is always 8khz
// USAGE: The authoring application is required to fill this in.
// If sampling rate is not known until CAEI is initialized,
// use '0'.
uint32 iInputSamplingRate;
// DESCRIPTION: Number of input channels:1=Mono,2=Stereo.(Mono uses 1 channel;
// Stereo uses 2 channels).
// USAGE: The authoring application is required to fill this in.
//
uint8 iInputNumChannels;
// DESCRIPTION: Whether to interleave or not the multi-channel input samples:
// EINTERLEAVE_LR = LRLRLRLRLR (interleaved left-right)
// EGROUPED_LR = LLLLLL...RRRRRR (non-interleaved left-right)
// USAGE: The authoring application is required to fill this in.
//
EInterleaveMode iInputInterleaveMode;
} PV_AudioInputFormat;
///////////////////////////////////////////////////////////////////////////////////////////////////////
//CAPABILITY AND CONFIG
// Structure to hold the key string info for
// encnode's capability-and-config
struct PVOMXEncNodeKeyStringData
{
char iString[64];
PvmiKvpType iType;
PvmiKvpValueType iValueType;
};
// The number of characters to allocate for the key string
#define PVOMXENCNODECONFIG_KEYSTRING_SIZE 128
// Key string info at the base level ("x-pvmf/encoder/video")
// or ("x-pvmf/encoder/audio")
#ifdef _TEST_AE_ERROR_HANDLING
#define PVOMXENCNODECONFIG_BASE_NUMKEYS 8
#else
#define PVOMXENCNODECONFIG_BASE_NUMKEYS 3
#endif
const PVOMXEncNodeKeyStringData PVOMXEncNodeConfigBaseKeys[PVOMXENCNODECONFIG_BASE_NUMKEYS] =
{
{"sampling_rate", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"channels", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"encoding_mode", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32}
#ifdef _TEST_AE_ERROR_HANDLING
, {"error_start_init", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_BOOL}
, {"error-encode", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32}
, {"error-node-cmd", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32}
, {"error-config-header", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_BOOL}
, {"data-path-stall", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32}
#endif
};
enum BaseKeys_IndexMapType
{
SAMPLING_RATE = 0, // audio
CHANNELS, // audio
ENCODING_MODE // avc
#ifdef _TEST_AE_ERROR_HANDLING
, ERROR_START_INIT
, ERROR_ENCODE
, ERROR_NODE_CMD
, ERROR_CONFIG_HEADER
, ERROR_DATAPATH_STALL
#endif
};
// default encode parameters
#define DEFAULT_BITRATE 32000
#define DEFAULT_FRAME_WIDTH 176
#define DEFAULT_FRAME_HEIGHT 144
#define DEFAULT_FRAME_RATE 5
#define DEFAULT_I_FRAME_INTERVAL 10 // encode one I frame every 10 seconds.
#define DEFAULT_OMX_MP4ENC_QPI 15
#define DEFAULT_OMX_MP4ENC_QPP 12
#define DEFAULT_OMX_MP4ENC_QPB 12
#define DEFAULT_OMX_AVCENC_QPI 25
#define DEFAULT_OMX_AVCENC_QPP 30
#define DEFAULT_OMX_AVCENC_QPB 33
#define PVMF_AVCENC_NODE_SPS_VECTOR_RESERVE 16 // max allowed by standard
#define PVMF_AVCENC_NODE_PPS_VECTOR_RESERVE 256 // max allowed by standard
#define DEFAULT_PARAMS_SET_LENGTH 256
typedef enum
{
PV_MPEG_VIDEO_SIMPLE_PROFILE = 0,
PV_MPEG_VIDEO_SIMPLE_SCALABLE_PROFILE,
PV_MPEG_VIDEO_CORE_PROFILE,
PV_MPEG_VIDEO_MAIN_PROFILE,
PV_MPEG_VIDEO_N_BIT_PROFILE,
PV_MPEG_VIDEO_SCALABLE_TEXTURE_PROFILE,
PV_MPEG_VIDEO_SIMPLE_FACE_ANIMATION_PROFILE,
PV_MPEG_VIDEO_SIMPLE_FBA_PROFILE,
PV_MPEG_VIDEO_BASIC_ANIMATED_TEXTURE_PROFILE,
PV_MPEG_VIDEO_HYBRID_PROFILE,
PV_MPEG_VIDEO_ADVANCE_REAL_TIME_SIMPLE_PROFILE,
PV_MPEG_VIDEO_CORE_SCALABLE_PROFILE,
PV_MPEG_VIDEO_ADVANCE_CODING_EFFICIENCY_PROFILE,
PV_MPEG_VIDEO_ADVANCE_CORE_PROFILE,
PV_MPEG_VIDEO_ADVANCE_SCALABLE_TEXTURE_PROFILE,
PV_MPEG_VIDEO_SIMPLE_STUDIO_PROFILE,
PV_MPEG_VIDEO_CORE_STUDIO_PROFILE,
PV_MPEG_VIDEO_ADVANCE_SIMPLE_PROFILE,
PV_MPEG_VIDEO_FINE_GRANUALITY_SCALABLE_PROFILE,
PV_MPEG_VIDEO_RESERVED_PROFILE
} PVMF_MPEGVideoProfileType;
typedef enum
{
PV_MPEG_VIDEO_LEVEL0 = 0,
PV_MPEG_VIDEO_LEVEL1,
PV_MPEG_VIDEO_LEVEL2,
PV_MPEG_VIDEO_LEVEL3,
PV_MPEG_VIDEO_LEVEL4,
PV_MPEG_VIDEO_LEVEL5,
PV_MPEG_VIDEO_LEVEL_UNKNOWN
} PVMF_MPEGVideoLevelType;
/////////////////////////////////////////////////////////////////////////////////////////
//Mimetypes for the custom interface
#define PVMF_OMX_ENC_NODE_MIMETYPE "pvxxx/OMXEncNode"
#define PVMF_BASEMIMETYPE "pvxxx"
//Command queue type
typedef PVMFNodeCommandQueue<PVMFOMXEncNodeCommand, PVMFOMXEncNodeAllocator> PVMFOMXEncNodeCmdQ;
class PVMFOMXEncNode
: public OsclActiveObject
, public PVMFNodeInterface
, public OsclMemPoolFixedChunkAllocatorObserver
, public PVMFOMXEncNodeExtensionInterface
, public PVMFMetadataExtensionInterface
, public PvmiCapabilityAndConfig
, public PVMp4H263EncExtensionInterface
, public PVAudioEncExtensionInterface
{
public:
PVMFOMXEncNode(int32 aPriority);
~PVMFOMXEncNode();
// From PVMFNodeInterface
PVMFStatus ThreadLogon();
PVMFStatus ThreadLogoff();
PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability);
PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL);
PVMFCommandId QueryUUID(PVMFSessionId, const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, PVMFOMXEncNodeAllocator>& aUuids,
bool aExactUuidsOnly = false,
const OsclAny* aContext = NULL);
PVMFCommandId QueryInterface(PVMFSessionId, const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
const OsclAny* aContext = NULL);
PVMFCommandId RequestPort(PVMFSessionId
, int32 aPortTag, const PvmfMimeString* aPortConfig = NULL, const OsclAny* aContext = NULL);
PVMFCommandId ReleasePort(PVMFSessionId, PVMFPortInterface& aPort, const OsclAny* aContext = NULL);
PVMFCommandId Init(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Prepare(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Start(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Stop(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Flush(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Pause(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId Reset(PVMFSessionId, const OsclAny* aContext = NULL);
PVMFCommandId CancelAllCommands(PVMFSessionId, const OsclAny* aContextData = NULL);
PVMFCommandId CancelCommand(PVMFSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL);
// From PVMFPortActivityHandler
void HandlePortActivity(const PVMFPortActivity& aActivity);
// From PVInterface
virtual void addRef();
virtual void removeRef();
virtual bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
//**********begin PVMFMetadataExtensionInterface
uint32 GetNumMetadataKeys(char* query_key = NULL);
uint32 GetNumMetadataValues(PVMFMetadataList& aKeyList);
PVMFCommandId GetNodeMetadataKeys(PVMFSessionId aSessionId, PVMFMetadataList& aKeyList, uint32 starting_index, int32 max_entries,
char* query_key = NULL, const OsclAny* aContextData = NULL);
PVMFCommandId GetNodeMetadataValues(PVMFSessionId aSessionId, PVMFMetadataList& aKeyList,
Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 starting_index, int32 max_entries, const OsclAny* aContextData = NULL);
PVMFStatus ReleaseNodeMetadataKeys(PVMFMetadataList& aKeyList, uint32 starting_index, uint32 end_index);
PVMFStatus ReleaseNodeMetadataValues(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 starting_index, uint32 end_index);
//**********End PVMFMetadataExtensionInterface
bool VerifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);
//********** CB Functions to serve OpenMAX Encoder
//Process callback functions. They will be executed in testapp thread context
// These callbacks are used only in the Multithreaded component case
OsclReturnCode ProcessCallbackEventHandler_MultiThreaded(OsclAny* P);
OsclReturnCode ProcessCallbackEmptyBufferDone_MultiThreaded(OsclAny* P);
OsclReturnCode ProcessCallbackFillBufferDone_MultiThreaded(OsclAny* P);
//Callback objects - again, these are used only in the case of Multithreaded component
EventHandlerThreadSafeCallbackAOEnc* iThreadSafeHandlerEventHandler;
EmptyBufferDoneThreadSafeCallbackAOEnc* iThreadSafeHandlerEmptyBufferDone;
FillBufferDoneThreadSafeCallbackAOEnc* iThreadSafeHandlerFillBufferDone;
OMX_CALLBACKTYPE iCallbacks; // structure that contains callback ptrs.
// OMX CALLBACKS
// 1) AO OMX component running in the same thread as the OMX node
// In this case, the callbacks can be called directly from the component
// The callback: OMX Component->CallbackEventHandler->EventHandlerProcessing
// The callback can perform do RunIfNotReady
// 2) Multithreaded component
// In this case, the callback is made using the threadsafe callback (TSCB) AO
// Component thread : OMX Component->CallbackEventHandler->TSCB(ReceiveEvent)
// Node thread : TSCB(ProcessEvent)->ProcessCallbackEventHandler_MultiThreaded->EventHandlerProcessing
//==============================================================================
OMX_ERRORTYPE EventHandlerProcessing(OMX_OUT OMX_HANDLETYPE aComponent,
OMX_OUT OMX_PTR aAppData,
OMX_OUT OMX_EVENTTYPE aEvent,
OMX_OUT OMX_U32 aData1,
OMX_OUT OMX_U32 aData2,
OMX_OUT OMX_PTR aEventData);
OMX_ERRORTYPE EmptyBufferDoneProcessing(OMX_OUT OMX_HANDLETYPE aComponent,
OMX_OUT OMX_PTR aAppData,
OMX_OUT OMX_BUFFERHEADERTYPE* aBuffer);
OMX_ERRORTYPE FillBufferDoneProcessing(OMX_OUT OMX_HANDLETYPE aComponent,
OMX_OUT OMX_PTR aAppData,
OMX_OUT OMX_BUFFERHEADERTYPE* aBuffer);
bool IsComponentMultiThreaded()
{
return iIsOMXComponentMultiThreaded;
};
// From PvmiCapabilityAndConfig
void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver);
PVMFStatus getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier, PvmiKvp*& aParameters, int& aNumParamElements, PvmiCapabilityContext aContext);
PVMFStatus releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements);
void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext, PvmiKvp* aParameters, int aNumParamElements);
void DeleteContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements, PvmiKvp* &aRetKVP);
PVMFCommandId setParametersAsync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements, PvmiKvp*& aRetKVP, OsclAny* aContext = NULL);
uint32 getCapabilityMetric(PvmiMIOSession aSession);
PVMFStatus verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements);
// Virtual functions of PVMp4H263EncExtensionInterface
// OSCL_IMPORT_REF void addRef();
// OSCL_IMPORT_REF void removeRef();
// OSCL_IMPORT_REF bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
OSCL_IMPORT_REF bool SetNumLayers(uint32 aNumLayers);
OSCL_IMPORT_REF bool SetOutputBitRate(uint32 aLayer, uint32 aBitRate);
OSCL_IMPORT_REF bool SetOutputFrameSize(uint32 aLayer, uint32 aWidth, uint32 aHeight);
OSCL_IMPORT_REF bool SetOutputFrameRate(uint32 aLayer, OsclFloat aFrameRate);
OSCL_IMPORT_REF bool SetSegmentTargetSize(uint32 aLayer, uint32 aSizeBytes);
OSCL_IMPORT_REF bool SetRateControlType(uint32 aLayer, PVMFVENRateControlType aRateControl);
OSCL_IMPORT_REF bool SetDataPartitioning(bool aDataPartitioning);
OSCL_IMPORT_REF bool SetRVLC(bool aRVLC);
OSCL_IMPORT_REF bool SetIFrameInterval(uint32 aIFrameInterval);
OSCL_IMPORT_REF bool GetVolHeader(OsclRefCounterMemFrag& aVolHeader);
OSCL_IMPORT_REF bool RequestIFrame();
OSCL_IMPORT_REF bool SetSceneDetection(bool aSCD);
OSCL_IMPORT_REF bool SetCodec(PVMFFormatType aCodec);
PVMFStatus SetCodecType(PVMFFormatType aCodec);
OSCL_IMPORT_REF virtual bool SetFSIParam(uint8* aFSIBuff, int aFSIBuffLength);
// from AudioEncExtensionInterface
OSCL_IMPORT_REF PVMFStatus SetOutputBitRate(PVMF_GSMAMR_Rate aBitRate);
OSCL_IMPORT_REF PVMFStatus SetMaxNumOutputFramesPerBuffer(uint32 aNumOutputFrames);
OSCL_IMPORT_REF PVMFStatus SetOutputBitRate(uint32 aBitRate);
OSCL_IMPORT_REF PVMFStatus SetOutputNumChannel(uint32 aNumChannel);
OSCL_IMPORT_REF PVMFStatus SetOutputSamplingRate(uint32 aSamplingRate);
PVMFStatus SetInputSamplingRate(uint32 aSamplingRate);
PVMFStatus SetInputBitsPerSample(uint32 aBitsPerSample);
PVMFStatus SetInputNumChannels(uint32 aNumChannels);
uint32 GetOutputBitRate(); // for audio - void
// encoder input format setting
/////////////////////////////////////////////////////
// Encoder settings routine
/////////////////////////////////////////////////////
PVMFStatus SetInputFormat(PVMFFormatType aFormat);
PVMFStatus SetInputFrameSize(uint32 aWidth, uint32 aHeight, uint8 aFrmOrient = 0);
PVMFStatus SetInputFrameRate(OsclFloat aFrameRate);
PVMFFormatType GetCodecType();
uint32 GetOutputBitRate(uint32 aLayer);
OsclFloat GetOutputFrameRate(uint32 aLayer);
PVMFStatus GetOutputFrameSize(uint32 aLayer, uint32& aWidth, uint32& aHeight);
uint32 GetIFrameInterval();
uint32 GetOutputSamplingRate();
uint32 GetOutputNumChannels();
// Capability exchange
PVMFNodeCapability iCapability;
private:
void CommandComplete(PVMFOMXEncNodeCmdQ& aCmdQ, PVMFOMXEncNodeCommand& aCmd, PVMFStatus aStatus, OsclAny* aEventData = NULL);
void DoQueryUuid(PVMFOMXEncNodeCommand&);
void DoQueryInterface(PVMFOMXEncNodeCommand&);
void DoRequestPort(PVMFOMXEncNodeCommand&);
void DoReleasePort(PVMFOMXEncNodeCommand&);
void DoInit(PVMFOMXEncNodeCommand&);
void DoPrepare(PVMFOMXEncNodeCommand&);
void DoStart(PVMFOMXEncNodeCommand&);
void DoStop(PVMFOMXEncNodeCommand&);
void DoPause(PVMFOMXEncNodeCommand&);
void DoReset(PVMFOMXEncNodeCommand&);
void DoFlush(PVMFOMXEncNodeCommand&);
PVMFStatus DoGetNodeMetadataKey(PVMFOMXEncNodeCommand&);
PVMFStatus DoGetNodeMetadataValue(PVMFOMXEncNodeCommand&);
void DoCancelAllCommands(PVMFOMXEncNodeCommand&);
void DoCancelCommand(PVMFOMXEncNodeCommand&);
void Run();
bool ProcessCommand(PVMFOMXEncNodeCommand& aCmd);
bool ProcessIncomingMsg(PVMFPortInterface* aPort);
bool ProcessOutgoingMsg(PVMFPortInterface* aPort);
PVMFStatus HandleProcessingState();
// DV:
bool NegotiateVideoComponentParameters();
bool SetMP4EncoderParameters();
bool SetH263EncoderParameters();
bool SetH264EncoderParameters();
bool NegotiateAudioComponentParameters();
bool SetAMREncoderParameters();
bool SetAACEncoderParameters();
bool SetDefaultCapabilityFlags();
bool CreateOutMemPool(uint32 num);
bool CreateInputMemPool(uint32 num);
bool ProvideBuffersToComponent(OsclMemPoolFixedChunkAllocator *aMemPool, // allocator
uint32 aAllocSize, // size to allocate from pool (hdr only or hdr+ buffer)
uint32 aNumBuffers, // number of buffers
uint32 aActualBufferSize, // aactual buffer size
uint32 aPortIndex, // port idx
bool aUseBufferOK, // can component use OMX_UseBuffer?
bool aIsThisInputBuffer // is this input or output
);
bool FreeBuffersFromComponent(OsclMemPoolFixedChunkAllocator *aMemPool, // allocator
uint32 aAllocSize, // size to allocate from pool (hdr only or hdr+ buffer)
uint32 aNumBuffers, // number of buffers
uint32 aPortIndex, // port idx
bool aIsThisInputBuffer // is this input or output
);
OsclSharedPtr<class PVMFMediaDataImpl> WrapOutputBuffer(uint8 *pData, uint32 aDataLen, OsclAny *pContext);
bool QueueOutputBuffer(OsclSharedPtr<PVMFMediaDataImpl> &mediadataimplout, uint32 aDataLen);
bool SendOutputBufferToOMXComponent();
bool SendInputBufferToOMXComponent();
bool SendEOSBufferToOMXComponent();
bool SendBeginOfMediaStreamCommand(void);
bool SendEndOfTrackCommand(void);
bool ReleaseAllPorts();
bool DeleteOMXEncoder();
void ChangeNodeState(TPVMFNodeInterfaceState aNewState);
void HandleComponentStateChange(OMX_U32 encoder_state);
// Capability And Config Helper Methods
PVMFStatus DoCapConfigGetParametersSync(PvmiKeyType aIdentifier, PvmiKvp*& aParameters, int& aNumParamElements, PvmiCapabilityContext aContext);
PVMFStatus DoCapConfigReleaseParameters(PvmiKvp* aParameters, int aNumElements);
void DoCapConfigSetParameters(PvmiKvp* aParameters, int aNumElements, PvmiKvp* &aRetKVP);
PVMFStatus DoCapConfigVerifyParameters(PvmiKvp* aParameters, int aNumElements);
PVMFStatus GetConfigParameter(PvmiKvp*& aParameters, int& aNumParamElements, int32 aIndex, PvmiKvpAttr aReqattr);
PVMFStatus VerifyAndSetConfigParameter(PvmiKvp& aParameter, bool aSetParam);
PVMFStatus GetProfileAndLevel(PVMF_MPEGVideoProfileType& aProfile, PVMF_MPEGVideoLevelType& aLevel);
void freechunkavailable(OsclAny*);
PVMFCommandId QueueCommandL(PVMFOMXEncNodeCommand& aCmd);
int32 PushBackKeyVal(Oscl_Vector<PvmiKvp, OsclMemAllocator>*&, PvmiKvp&);
int32 Push_Back_MetadataKeys(const char*);
int32 Push_Back_MetadataKeys(PVMFMetadataList*&, uint32);
int32 CreateNewArray(char*&, int32);
int32 MemAllocate(OsclAny*& , OsclMemPoolFixedChunkAllocator*, uint32);
bool ParseFullAVCFramesIntoNALs(OMX_BUFFERHEADERTYPE* aOutputBuffer);
bool AVCAnnexBGetNALUnit(uint8 *bitstream, uint8 **nal_unit, int32 *size, bool getPtrOnly);
bool CheckM4vVopStartCode(uint8* data, int* len);
friend class PVMFOMXEncPort;
// Ports pointers
PVMFPortInterface* iInPort;
PVMFPortInterface* iOutPort;
// Commands
PVMFOMXEncNodeCmdQ iInputCommands;
PVMFOMXEncNodeCmdQ iCurrentCommand;
// Shared pointer for Media Msg.Input buffer
PVMFSharedMediaDataPtr iDataIn;
// OUTPUT BUFFER RELATED MEMBERS
// Output buffer memory pool
OsclMemPoolFixedChunkAllocator *iOutBufMemoryPool;
// Memory pool for simple media data
OsclMemPoolFixedChunkAllocator *iMediaDataMemPool;
// Size of output buffer (negotiated with component)
uint32 iOMXComponentOutputBufferSize;
// size of output to allocate (OMX_ALLOCATE_BUFFER = size of buf header )
// (OMX_USE_BUFFER = size of buf header + iOMXCoponentOutputBufferSize)
uint32 iOutputAllocSize;
// Number of output buffers (negotiated with component)
uint32 iNumOutputBuffers;
// Number of output buffers in possession of the component or downstream,
// namely, number of unavailable buffers
uint32 iNumOutstandingOutputBuffers;
// flag to prevent sending output buffers downstream during flushing etc.
bool iDoNotSendOutputBuffersDownstreamFlag;
// flag to prevent freeing the buffers twice
bool iOutputBuffersFreed;
// INPUT BUFFER RELATED MEMBERS
OsclMemPoolFixedChunkAllocator *iInBufMemoryPool;
uint32 iOMXComponentInputBufferSize; // size of input buffer that the component sees (negotiated with the component)
uint32 iInputAllocSize; // size of input buffer to allocate (OMX_ALLOCATE_BUFFER = size of buf header )
// (OMX_USE_BUFFER = size of buf header + iOMXCoponentInputBufferSize)
uint32 iNumInputBuffers; // total num of input buffers (negotiated with component)
uint32 iNumOutstandingInputBuffers; // number of input buffers in use (i.e. unavailable)
bool iDoNotSaveInputBuffersFlag;
// flag to prevent freeing buffers twice
bool iInputBuffersFreed;
// input buffer fragmentation etc.
uint32 iCopyPosition; // for copying memfrag data into a buffer
uint32 iFragmentSizeRemainingToCopy;
bool iIsNewDataFragment;
// input data info
uint32 iCurrFragNum;
uint32 iCodecSeqNum; // sequence number tracking
uint32 iInPacketSeqNum;
uint32 iInTimestamp;
uint32 iInDuration;
uint32 iInNumFrags;
uint32 iCurrentMsgMarkerBit;
// DYNAMIC PORT RE-CONFIGURATION
uint32 iInputPortIndex;
uint32 iOutputPortIndex;
OMX_PARAM_PORTDEFINITIONTYPE iParamPort;
uint32 iPortIndexForDynamicReconfig;
bool iSecondPortReportedChange;
bool iDynamicReconfigInProgress;
uint32 iSecondPortToReconfig;
OMX_BUFFERHEADERTYPE *iInputBufferToResendToComponent; // ptr to input buffer that is not empty, but that the OMX component returned
// we need to resend this same buffer back to the component
////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS
bool iOMXComponentSupportsExternalOutputBufferAlloc;
bool iOMXComponentSupportsExternalInputBufferAlloc;
bool iOMXComponentSupportsMovableInputBuffers;
bool iOMXComponentUsesNALStartCodes;
bool iOMXComponentSupportsPartialFrames;
bool iOMXComponentCanHandleIncompleteFrames;
bool iOMXComponentUsesFullAVCFrames;
bool iSetMarkerBitForEveryFrag;
bool iIsOMXComponentMultiThreaded;
// State definitions for HandleProcessingState() state machine
typedef enum
{
EPVMFOMXEncNodeProcessingState_Idle, //default state after constraction/reset
EPVMFOMXEncNodeProcessingState_ReadyToEncode, //nornal operation state of the encoder
EPVMFOMXEncNodeProcessingState_WaitForOutputBuffer, //wait state for avalible media output buffer
EPVMFOMXEncNodeProcessingState_WaitForOutputPort, //wait state, output port is busy
EPVMFOMXEncNodeProcessingState_WaitForOutgoingQueue, //wait state, outgoing queue
EPVMFOMXEncNodeProcessingState_PortReconfig, // Dynamic Port Reconfiguration - step 1
EPVMFOMXEncNodeProcessingState_WaitForBufferReturn, // step 2
EPVMFOMXEncNodeProcessingState_WaitForPortDisable, // Dynamic Port Reconfiguration - step 3
EPVMFOMXEncNodeProcessingState_PortReEnable, // Dynamic Port Reconfiguration - step 4
EPVMFOMXEncNodeProcessingState_WaitForPortEnable, // step 5
EPVMFOMXEncNodeProcessingState_Stopping // when STOP command is issued, the node has to wait for component to transition into
// idle state. The buffers keep coming back , the node is rescheduled
// to run. Prevent the node from sending buffers back
} PVMFOMXEncNode_ProcessingState;
// State of HandleProcessingState() state machine
PVMFOMXEncNode_ProcessingState iProcessingState;
// Handle of OMX Component
OMX_HANDLETYPE iOMXEncoder;
// Current State of the component
OMX_STATETYPE iCurrentEncoderState;
// BOS
bool iSendBOS;
uint32 iStreamID;
uint32 iBOSTimestamp;
//EOS control flags
bool iIsEOSSentToComponent;
bool iIsEOSReceivedFromComponent;
// Send Fsi configuration flag
bool sendYuvFsi;
// Width of encoded frame
int32 iYUVWidth;
// Height of encoded frame
int32 iYUVHeight;
// Pointer to input data fragment
uint8* iBitstreamBuffer;
// Size of input data fragment
int32 iBitstreamSize;
// Output frame sequence counter
uint32 iSeqNum;
// Input frame sequence counter
uint32 iSeqNum_In;
// Added to Scheduler Flag
bool iIsAdded;
// Log related
PVLogger* iLogger;
PVLogger* iDataPathLogger;
PVLogger* iClockLogger;
PVLogger *iRunlLogger;
const char *iNodeTypeId;
// Counter of fragment read from current Media Msg.Input buffer
uint fragnum;
// Number of fragments in the Media Msg.Input buffer
uint numfrags;
// Node configuration update
//PVMFOMXEncNodeConfig iNodeConfig;
// Reference counter for extension
uint32 iExtensionRefCount;
// Vector for KVP
Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> iAvailableMetadataKeys;
// EOS flag
bool iEndOfDataReached;
// Time stame upon EOS
PVMFTimestamp iEndOfDataTimestamp;
/* Diagnostic log related */
PVLogger* iDiagnosticsLogger;
bool iDiagnosticsLogged;
void LogDiagnostics();
uint32 iFrameCounter;
bool CheckComponentForMultRoles(OMX_STRING aCompName, OMX_STRING aRole);
bool CheckComponentCapabilities(PVMFFormatType* aOutFormat);
uint32 iAvgBitrateValue;
bool iResetInProgress;
bool iResetMsgSent;
bool iStopInResetMsgSent;
PV_VideoEncodeParam iVideoEncodeParam;
PV_VideoInputFormat iVideoInputFormat;
PV_AudioEncodeParam iAudioEncodeParam;
PV_AudioInputFormat iAudioInputFormat;
PVMFFormatType iInFormat;
PVMFFormatType iOutFormat;
PVMFOMXEncNodeAllocDestructDealloc iAlloc;
OsclRefCounterMemFrag iVolHeader; /** Vol header */
OsclRefCounterMemFrag iConfigHeader;
OsclRefCounterMemFrag iParamSet; /* place holder for sps,pps values */
OsclMemoryFragment iSPSs[PVMF_AVCENC_NODE_SPS_VECTOR_RESERVE]; // just ptrs
OsclMemoryFragment iPPSs[PVMF_AVCENC_NODE_PPS_VECTOR_RESERVE]; // just ptrs
int iNumSPSs;
int iNumPPSs;
bool iSpsPpsSequenceOver;
OsclSharedPtr<PVMFMediaDataImpl> iPreviousMediaData;
bool iFirstNAL;
uint32* iNALSizeArray;
uint8** iNALPtrArray;
uint32 iNALSizeArrayMaxElems;
uint32 iNumNALs;
uint32 iFirstNALStartCodeSize;
uint32 iEndOfFrameFlagPrevious;
uint32 iKeyFrameFlagPrevious;
uint32 iEndOfNALFlagPrevious;
OMX_TICKS iTimeStampPrevious;
uint32 iBufferLenPrevious;
uint32 iEndOfFrameFlagOut;
uint32 iKeyFrameFlagOut;
uint32 iEndOfNALFlagOut;
OMX_TICKS iTimeStampOut;
uint32 iBufferLenOut;
OsclAny **out_ctrl_struct_ptr ;
OsclAny **out_buff_hdr_ptr ;
OsclAny **in_ctrl_struct_ptr ;
OsclAny **in_buff_hdr_ptr ;
// timescale, timestamp conversions
uint32 iTimeScale;
uint32 iInTimeScale;
uint32 iOutTimeScale;
MediaClockConverter iInputTimestampClock;
OMX_TICKS iOMXTicksTimestamp;
OMX_TICKS ConvertTimestampIntoOMXTicks(const MediaClockConverter &src);
uint32 ConvertOMXTicksIntoTimestamp(const OMX_TICKS &src);
PVInterface* ipExternalInputBufferAllocatorInterface;
PVMFFixedSizeBufferAlloc* ipFixedSizeBufferAlloc;
#ifdef _TEST_AE_ERROR_HANDLING
bool iErrorHandlingInit;
uint32 iErrorHandlingEncodeCount;
int iCountFrames;
uint32 iErrorNodeCmd;
bool iErrorConfigHeader;
uint32 iErrorEncodeFlag;
uint32 iErrorDataPathStall;
#endif
};
#endif // PVMF_OMXENC_NODE_H_INCLUDED