| /* ------------------------------------------------------------------ |
| * 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 |
| |