1 /* 2 * Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 #ifndef OMX_VIDEO_ENCODER_AVC_H_ 19 #define OMX_VIDEO_ENCODER_AVC_H_ 20 21 22 #include "OMXVideoEncoderBase.h" 23 #include <utils/List.h> 24 #include <IntelMetadataBuffer.h> 25 #include <OMX_VideoExt.h> 26 enum { 27 F_UNKNOWN = 0x00, // Unknown 28 F_I = 0x01, // General I-frame type 29 F_P = 0x02, // General P-frame type 30 F_B = 0x03, // General B-frame type 31 F_SI = 0x04, // H.263 SI-frame type 32 F_SP = 0x05, // H.263 SP-frame type 33 F_EI = 0x06, // H.264 EI-frame type 34 F_EP = 0x07, // H.264 EP-frame type 35 F_S = 0x08, // MPEG-4 S-frame type 36 F_IDR = 0x09, // IDR-frame type 37 }; 38 39 enum { 40 CACHE_NONE = 0x00, //nothing to be done 41 CACHE_PUSH = 0x01, //push this frame into cache 42 CACHE_POP = 0x02, //pop all from cache into queue head by STACK rule 43 CACHE_RESET = 0x03, //reset cache, clear all cached frames 44 }; 45 46 #define ENC_NSTOP 0x02000000 47 48 #define GET_FT(x) ( (x & 0xF0000000 ) >> 28 ) //get frame type 49 #define GET_CO(x) ( (x & 0x0C000000 ) >> 26 ) //get cache operation 50 #define GET_FC(x) ( (x & 0x01FFFFFF ) ) //get frame count 51 52 #define SET_FT(x, y) { x = ((x & ~0xF0000000) | (y << 28)); } 53 #define SET_CO(x, y) { x = ((x & ~0x0C000000) | (y << 26 )); } 54 #define SET_FC(x, y) { x = ((x & ~0x01FFFFFF) | (y & 0x01FFFFFF )); } 55 56 const char* FrameTypeStr[10] = {"UNKNOWN", "I", "P", "B", "SI", "SP", "EI", "EP", "S", "IDR"}; 57 const char* CacheOperationStr[4]= {"NONE", "PUSH", "POP", "RESET"}; 58 59 typedef struct { 60 uint32_t FrameType; 61 uint32_t CacheOperation; 62 bool NotStopFrame; 63 uint32_t FrameCount; 64 }Encode_Info; 65 66 #define MAX_H264_PROFILE 3 67 68 class OMXVideoEncoderAVC : public OMXVideoEncoderBase { 69 public: 70 OMXVideoEncoderAVC(); 71 virtual ~OMXVideoEncoderAVC(); 72 73 protected: 74 virtual OMX_ERRORTYPE InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput); 75 virtual OMX_ERRORTYPE ProcessorInit(void); 76 virtual OMX_ERRORTYPE ProcessorDeinit(void); 77 virtual OMX_ERRORTYPE ProcessorStop(void); 78 virtual OMX_ERRORTYPE ProcessorProcess( 79 OMX_BUFFERHEADERTYPE **buffers, 80 buffer_retain_t *retains, 81 OMX_U32 numberBuffers); 82 virtual OMX_ERRORTYPE ProcessorPreEmptyBuffer(OMX_BUFFERHEADERTYPE* buffer); 83 84 virtual OMX_ERRORTYPE BuildHandlerList(void); 85 virtual OMX_ERRORTYPE SetVideoEncoderParam(); 86 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamVideoAvc); 87 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamNalStreamFormat); 88 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamNalStreamFormatSupported); 89 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamNalStreamFormatSelect); 90 DECLARE_HANDLER(OMXVideoEncoderAVC, ConfigVideoAVCIntraPeriod); 91 DECLARE_HANDLER(OMXVideoEncoderAVC, ConfigVideoNalSize); 92 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamIntelAVCVUI); 93 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamVideoBytestream); 94 DECLARE_HANDLER(OMXVideoEncoderAVC, ConfigIntelSliceNumbers); 95 DECLARE_HANDLER(OMXVideoEncoderAVC, ParamVideoProfileLevelQuerySupported); 96 97 98 private: 99 enum { 100 // OMX_PARAM_PORTDEFINITIONTYPE 101 OUTPORT_MIN_BUFFER_COUNT = 1, 102 OUTPORT_ACTUAL_BUFFER_COUNT = 6, 103 OUTPORT_BUFFER_SIZE = 2000000, 104 NUM_REFERENCE_FRAME = 4, 105 }; 106 107 OMX_VIDEO_PARAM_AVCTYPE mParamAvc; 108 OMX_NALSTREAMFORMATTYPE mNalStreamFormat; 109 OMX_VIDEO_CONFIG_AVCINTRAPERIOD mConfigAvcIntraPeriod; 110 OMX_VIDEO_CONFIG_NALSIZE mConfigNalSize; 111 OMX_VIDEO_PARAM_INTEL_AVCVUI mParamIntelAvcVui; 112 OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS mConfigIntelSliceNumbers; 113 VideoParamsAVC *mAVCParams; 114 115 OMX_U32 mInputPictureCount; 116 OMX_U32 mFrameEncodedCount; 117 118 List<OMX_BUFFERHEADERTYPE*> mBFrameList; 119 120 OMX_BOOL ProcessCacheOperation(OMX_BUFFERHEADERTYPE **buffers); 121 OMX_ERRORTYPE ProcessDataRetrieve( 122 OMX_BUFFERHEADERTYPE **buffers, 123 OMX_BOOL *outBufReturned); 124 125 struct ProfileLevelTable { 126 OMX_U32 profile; 127 OMX_U32 level; 128 }; 129 130 ProfileLevelTable mPLTable[MAX_H264_PROFILE]; 131 OMX_U32 mPLTableCount; 132 133 OMX_BOOL mEmptyEOSBuf; 134 OMX_BOOL mCSDOutputted; 135 }; 136 137 #endif /* OMX_VIDEO_ENCODER_AVC_H_ */ 138