SoftAVCEnc.h revision 1ad56353aec03b0255d5cd5b67f9e6df780d9b65
1/* 2 * Copyright 2012 The Android Open Source Project 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#ifndef __SOFT_AVC_ENC_H__ 18#define __SOFT_AVC_ENC_H__ 19 20 21#include <media/stagefright/foundation/ABase.h> 22#include <utils/Vector.h> 23 24#include "SoftVideoEncoderOMXComponent.h" 25 26namespace android { 27 28#define MAX_INPUT_BUFFER_HEADERS 4 29#define MAX_CONVERSION_BUFFERS 4 30#define CODEC_MAX_CORES 4 31#define LEN_STATUS_BUFFER (10 * 1024) 32#define MAX_VBV_BUFF_SIZE (120 * 16384) 33#define MAX_NUM_IO_BUFS 3 34 35#define DEFAULT_MAX_REF_FRM 2 36#define DEFAULT_MAX_REORDER_FRM 0 37#define DEFAULT_QP_MIN 10 38#define DEFAULT_QP_MAX 40 39#define DEFAULT_MAX_BITRATE 20000000 40#define DEFAULT_MAX_SRCH_RANGE_X 256 41#define DEFAULT_MAX_SRCH_RANGE_Y 256 42#define DEFAULT_MAX_FRAMERATE 120000 43#define DEFAULT_NUM_CORES 1 44#define DEFAULT_NUM_CORES_PRE_ENC 0 45#define DEFAULT_FPS 30 46#define DEFAULT_ENC_SPEED IVE_NORMAL 47 48#define DEFAULT_MEM_REC_CNT 0 49#define DEFAULT_RECON_ENABLE 0 50#define DEFAULT_CHKSUM_ENABLE 0 51#define DEFAULT_START_FRM 0 52#define DEFAULT_NUM_FRMS 0xFFFFFFFF 53#define DEFAULT_INP_COLOR_FORMAT IV_YUV_420SP_VU 54#define DEFAULT_RECON_COLOR_FORMAT IV_YUV_420P 55#define DEFAULT_LOOPBACK 0 56#define DEFAULT_SRC_FRAME_RATE 30 57#define DEFAULT_TGT_FRAME_RATE 30 58#define DEFAULT_MAX_WD 1920 59#define DEFAULT_MAX_HT 1920 60#define DEFAULT_MAX_LEVEL 41 61#define DEFAULT_STRIDE 0 62#define DEFAULT_WD 1280 63#define DEFAULT_HT 720 64#define DEFAULT_PSNR_ENABLE 0 65#define DEFAULT_ME_SPEED 100 66#define DEFAULT_ENABLE_FAST_SAD 0 67#define DEFAULT_ENABLE_ALT_REF 0 68#define DEFAULT_RC_MODE IVE_RC_STORAGE 69#define DEFAULT_BITRATE 6000000 70#define DEFAULT_I_QP 22 71#define DEFAULT_I_QP_MAX DEFAULT_QP_MAX 72#define DEFAULT_I_QP_MIN DEFAULT_QP_MIN 73#define DEFAULT_P_QP 28 74#define DEFAULT_P_QP_MAX DEFAULT_QP_MAX 75#define DEFAULT_P_QP_MIN DEFAULT_QP_MIN 76#define DEFAULT_B_QP 22 77#define DEFAULT_B_QP_MAX DEFAULT_QP_MAX 78#define DEFAULT_B_QP_MIN DEFAULT_QP_MIN 79#define DEFAULT_AIR IVE_AIR_MODE_NONE 80#define DEFAULT_AIR_REFRESH_PERIOD 30 81#define DEFAULT_SRCH_RNG_X 64 82#define DEFAULT_SRCH_RNG_Y 48 83#define DEFAULT_I_INTERVAL 30 84#define DEFAULT_IDR_INTERVAL 1000 85#define DEFAULT_B_FRAMES 0 86#define DEFAULT_DISABLE_DEBLK_LEVEL 0 87#define DEFAULT_HPEL 1 88#define DEFAULT_QPEL 1 89#define DEFAULT_I4 1 90#define DEFAULT_EPROFILE IV_PROFILE_BASE 91#define DEFAULT_ENTROPY_MODE 0 92#define DEFAULT_SLICE_MODE IVE_SLICE_MODE_NONE 93#define DEFAULT_SLICE_PARAM 256 94#define DEFAULT_ARCH ARCH_ARM_A9Q 95#define DEFAULT_SOC SOC_GENERIC 96#define DEFAULT_INTRA4x4 0 97#define STRLENGTH 500 98 99 100 101#define MIN(a, b) ((a) < (b))? (a) : (b) 102#define MAX(a, b) ((a) > (b))? (a) : (b) 103#define ALIGN16(x) ((((x) + 15) >> 4) << 4) 104#define ALIGN128(x) ((((x) + 127) >> 7) << 7) 105#define ALIGN4096(x) ((((x) + 4095) >> 12) << 12) 106 107/** Used to remove warnings about unused parameters */ 108#define UNUSED(x) ((void)(x)) 109 110/** Get time */ 111#define GETTIME(a, b) gettimeofday(a, b); 112 113/** Compute difference between start and end */ 114#define TIME_DIFF(start, end, diff) \ 115 diff = ((end.tv_sec - start.tv_sec) * 1000000) + \ 116 (end.tv_usec - start.tv_usec); 117 118#define ive_aligned_malloc(alignment, size) memalign(alignment, size) 119#define ive_aligned_free(buf) free(buf) 120 121struct SoftAVC : public SoftVideoEncoderOMXComponent { 122 SoftAVC( 123 const char *name, 124 const OMX_CALLBACKTYPE *callbacks, 125 OMX_PTR appData, 126 OMX_COMPONENTTYPE **component); 127 128 // Override SimpleSoftOMXComponent methods 129 virtual OMX_ERRORTYPE internalGetParameter( 130 OMX_INDEXTYPE index, OMX_PTR params); 131 132 virtual OMX_ERRORTYPE internalSetParameter( 133 OMX_INDEXTYPE index, const OMX_PTR params); 134 135 virtual void onQueueFilled(OMX_U32 portIndex); 136 137protected: 138 virtual ~SoftAVC(); 139 140private: 141 enum { 142 kNumBuffers = 2, 143 }; 144 145 // OMX input buffer's timestamp and flags 146 typedef struct { 147 int64_t mTimeUs; 148 int32_t mFlags; 149 } InputBufferInfo; 150 151 int32_t mStride; 152 153 struct timeval mTimeStart; // Time at the start of decode() 154 struct timeval mTimeEnd; // Time at the end of decode() 155 156 157 // If a request for a change it bitrate has been received. 158 bool mBitrateUpdated; 159 160 bool mKeyFrameRequested; 161 162#ifdef FILE_DUMP_ENABLE 163 char mInFile[200]; 164 char mOutFile[200]; 165#endif /* FILE_DUMP_ENABLE */ 166 167 IV_COLOR_FORMAT_T mIvVideoColorFormat; 168 169 IV_PROFILE_T mAVCEncProfile; 170 WORD32 mAVCEncLevel; 171 bool mStarted; 172 bool mSpsPpsHeaderReceived; 173 174 bool mSawInputEOS; 175 bool mSawOutputEOS; 176 bool mSignalledError; 177 bool mIntra4x4; 178 bool mEnableFastSad; 179 bool mEnableAltRef; 180 bool mReconEnable; 181 bool mPSNREnable; 182 bool mEntropyMode; 183 IVE_SPEED_CONFIG mEncSpeed; 184 185 uint8_t *mConversionBuffers[MAX_CONVERSION_BUFFERS]; 186 bool mConversionBuffersFree[MAX_CONVERSION_BUFFERS]; 187 BufferInfo *mInputBufferInfo[MAX_INPUT_BUFFER_HEADERS]; 188 iv_obj_t *mCodecCtx; // Codec context 189 iv_mem_rec_t *mMemRecords; // Memory records requested by the codec 190 size_t mNumMemRecords; // Number of memory records requested by codec 191 size_t mNumCores; // Number of cores used by the codec 192 193 UWORD32 mHeaderGenerated; 194 UWORD32 mBframes; 195 IV_ARCH_T mArch; 196 IVE_SLICE_MODE_T mSliceMode; 197 UWORD32 mSliceParam; 198 bool mHalfPelEnable; 199 UWORD32 mIInterval; 200 UWORD32 mIDRInterval; 201 UWORD32 mDisableDeblkLevel; 202 IVE_AIR_MODE_T mAIRMode; 203 UWORD32 mAIRRefreshPeriod; 204 205 void initEncParams(); 206 OMX_ERRORTYPE initEncoder(); 207 OMX_ERRORTYPE releaseEncoder(); 208 209 // Verifies the component role tried to be set to this OMX component is 210 // strictly video_encoder.avc 211 OMX_ERRORTYPE internalSetRoleParams( 212 const OMX_PARAM_COMPONENTROLETYPE *role); 213 214 // Updates bitrate to reflect port settings. 215 OMX_ERRORTYPE internalSetBitrateParams( 216 const OMX_VIDEO_PARAM_BITRATETYPE *bitrate); 217 218 OMX_ERRORTYPE setConfig( 219 OMX_INDEXTYPE index, const OMX_PTR _params); 220 221 // Handles port definition changes. 222 OMX_ERRORTYPE internalSetPortParams( 223 const OMX_PARAM_PORTDEFINITIONTYPE *port); 224 225 OMX_ERRORTYPE internalSetFormatParams( 226 const OMX_VIDEO_PARAM_PORTFORMATTYPE *format); 227 228 OMX_ERRORTYPE setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type); 229 OMX_ERRORTYPE setQp(); 230 OMX_ERRORTYPE setEncMode(IVE_ENC_MODE_T e_enc_mode); 231 OMX_ERRORTYPE setDimensions(); 232 OMX_ERRORTYPE setNumCores(); 233 OMX_ERRORTYPE setFrameRate(); 234 OMX_ERRORTYPE setIpeParams(); 235 OMX_ERRORTYPE setBitRate(); 236 OMX_ERRORTYPE setAirParams(); 237 OMX_ERRORTYPE setMeParams(); 238 OMX_ERRORTYPE setGopParams(); 239 OMX_ERRORTYPE setProfileParams(); 240 OMX_ERRORTYPE setDeblockParams(); 241 OMX_ERRORTYPE setVbvParams(); 242 void logVersion(); 243 OMX_ERRORTYPE setEncodeArgs( 244 ive_video_encode_ip_t *ps_encode_ip, 245 ive_video_encode_op_t *ps_encode_op, 246 OMX_BUFFERHEADERTYPE *inputBufferHeader, 247 OMX_BUFFERHEADERTYPE *outputBufferHeader); 248 249 DISALLOW_EVIL_CONSTRUCTORS(SoftAVC); 250}; 251 252#ifdef FILE_DUMP_ENABLE 253 254#define INPUT_DUMP_PATH "/sdcard/media/avce_input" 255#define INPUT_DUMP_EXT "yuv" 256#define OUTPUT_DUMP_PATH "/sdcard/media/avce_output" 257#define OUTPUT_DUMP_EXT "h264" 258 259#define GENERATE_FILE_NAMES() { \ 260 GETTIME(&mTimeStart, NULL); \ 261 strcpy(mInFile, ""); \ 262 sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH, \ 263 mTimeStart.tv_sec, mTimeStart.tv_usec, \ 264 INPUT_DUMP_EXT); \ 265 strcpy(mOutFile, ""); \ 266 sprintf(mOutFile, "%s_%ld.%ld.%s", OUTPUT_DUMP_PATH,\ 267 mTimeStart.tv_sec, mTimeStart.tv_usec, \ 268 OUTPUT_DUMP_EXT); \ 269} 270 271#define CREATE_DUMP_FILE(m_filename) { \ 272 FILE *fp = fopen(m_filename, "wb"); \ 273 if (fp != NULL) { \ 274 ALOGD("Opened file %s", m_filename); \ 275 fclose(fp); \ 276 } else { \ 277 ALOGD("Could not open file %s", m_filename); \ 278 } \ 279} 280#define DUMP_TO_FILE(m_filename, m_buf, m_size) \ 281{ \ 282 FILE *fp = fopen(m_filename, "ab"); \ 283 if (fp != NULL && m_buf != NULL) { \ 284 int i; \ 285 i = fwrite(m_buf, 1, m_size, fp); \ 286 ALOGD("fwrite ret %d to write %d", i, m_size); \ 287 if (i != (int)m_size) { \ 288 ALOGD("Error in fwrite, returned %d", i); \ 289 perror("Error in write to file"); \ 290 } \ 291 fclose(fp); \ 292 } else { \ 293 ALOGD("Could not write to file %s", m_filename);\ 294 if (fp != NULL) \ 295 fclose(fp); \ 296 } \ 297} 298#else /* FILE_DUMP_ENABLE */ 299#define INPUT_DUMP_PATH 300#define INPUT_DUMP_EXT 301#define OUTPUT_DUMP_PATH 302#define OUTPUT_DUMP_EXT 303#define GENERATE_FILE_NAMES() 304#define CREATE_DUMP_FILE(m_filename) 305#define DUMP_TO_FILE(m_filename, m_buf, m_size) 306#endif /* FILE_DUMP_ENABLE */ 307 308} // namespace android 309 310#endif // __SOFT_AVC_ENC_H__ 311