1 2 /* 3 * Copyright (C) Texas Instruments - http://www.ti.com/ 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 /* ============================================================================= 22 * Texas Instruments OMAP(TM) Platform Software 23 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. 24 * 25 * Use of this software is controlled by the terms and conditions found 26 * in the license agreement under which this software has been supplied. 27 * =========================================================================== */ 28 /** 29 * @file OMX_VideoEnc_DSP.h 30 * 31 * This is a header file for a TI OMX video component that is fully 32 * compliant with the OMX Video specification. 33 * This the file that the application that uses OMX would include 34 * in its code. 35 * 36 * @path $(CSLPATH)\ 37 * 38 * @rev 0.1 39 */ 40 /* -------------------------------------------------------------------------- */ 41 42 #ifndef OMX_VIDEOENC_DSP__H 43 #define OMX_VIDEOENC_DSP__H 44 45 #define OMX_H264ENC_NUM_DLLS 3 46 #define OMX_MP4ENC_NUM_DLLS 3 47 #define MAXNUMSLCGPS 8 /*< max. number of slice groups*/ 48 49 #ifndef UNDER_CE 50 #define H264_ENC_NODE_DLL "h264venc_sn.dll64P" 51 #define MP4_ENC_NODE_DLL "m4venc_sn.dll64P" 52 #define USN_DLL "usn.dll64P" 53 #else 54 #define H264_ENC_NODE_DLL "/windows/h264venc_sn.dll64P" 55 #define MP4_ENC_NODE_DLL "/windows/m4venc_sn.dll64P" 56 #define USN_DLL "/windows/usn.dll64P" 57 #endif 58 59 typedef enum { 60 USN_ERR_NONE, 61 USN_ERR_WARNING, 62 USN_ERR_PROCESS, 63 USN_ERR_PAUSE, 64 USN_ERR_STOP, 65 USN_ERR_ALGCTRL, 66 USN_ERR_STRMCTRL, 67 USN_ERR_UNKNOWN_MSG 68 } USN_ErrTypes; 69 70 typedef enum { 71 USN_STRMCMD_PLAY, 72 USN_STRMCMD_PAUSE, 73 USN_STRMCMD_STOP, 74 USN_STRMCMD_SETCODECPARAMS, 75 USN_STRMCMD_IDLE, 76 USN_STRMCMD_FLUSH 77 }USN_StrmCmd; 78 79 typedef enum 80 { 81 IH264_BYTE_STREAM = 0, 82 IH264_NALU_STREAM 83 84 }IH264VENC_StreamFormat; 85 86 /*H264 Encoder Specific Error Code bits*/ 87 typedef enum 88 { 89 IH264VENC_SEQPARAMERR=0, /* Indicates error during sequence parameter set generation*/ 90 IH264VENC_PICPARAMERR, /* Indicates error during picture parameter set generation*/ 91 IH264VENC_COMPRESSEDSIZEOVERFLOW, /* Compressed data exceeds the maximum compressed size limit*/ 92 IH264VENC_INVALIDQPPARAMETER, /* Out of Range initial Quantization parameter*/ 93 IH264VENC_INVALIDPROFILELEVEL, /* Invalid profile or Level*/ 94 IH264VENC_INVALIDRCALGO, /* Invalid RateControl Algorithm*/ 95 IH264VENC_SLICEEXCEEDSMAXBYTES, /* Slice exceeds the maximum allowed bytes*/ 96 IH264VENC_DEVICENOTREADY /* Indicates the device is not ready*/ 97 98 99 } IH264VENC_ErrorBit; 100 101 /* H.264 Encoder Slice and Picture level Loop Filter Control*/ 102 typedef enum 103 { 104 FILTER_ALL_EDGES = 0, /* Enable filtering of all the edges*/ 105 DISABLE_FILTER_ALL_EDGES, /* Disable filtering of all the edges*/ 106 DISABLE_FILTER_SLICE_EDGES /* Disable filtering of slice edges */ 107 108 } IH264VENC_LoopFilterParams ; 109 110 111 /* H.264 Encoder Slice level Control for Intra4x4 Modes */ 112 typedef enum 113 { 114 INTRA4x4_NONE = 0 , /* Disable Intra4x4 modes */ 115 INTRA4x4_ISLICES , /* Enable Intra4x4 modes only in I Slices*/ 116 INTRA4x4_IPSLICES /* Enable Intra4x4 modes only in I and P Slices*/ 117 118 } IH264VENC_Intra4x4Params ; 119 120 /* Level Identifier for H.264 Encoder*/ 121 typedef enum 122 { 123 IH264_LEVEL_10 = 10, /* Level 1.0*/ 124 IH264_LEVEL_1b = 9, /* Level 1.b*/ 125 IH264_LEVEL_11 = 11, /* Level 1.1*/ 126 IH264_LEVEL_12 = 12, /* Level 1.2*/ 127 IH264_LEVEL_13 = 13, /* Level 1.3*/ 128 IH264_LEVEL_20 = 20, /* Level 2.0*/ 129 IH264_LEVEL_21 = 21, /* Level 2.1*/ 130 IH264_LEVEL_22 = 22, /* Level 2.2*/ 131 IH264_LEVEL_30 = 30 /* Level 3.0*/ 132 133 } IH264VENC_Level ; 134 135 136 /* Picture Order Count Type Identifier for H.264 Encoder*/ 137 typedef enum 138 { 139 IH264_POC_TYPE_0 = 0, /* POC type 0*/ 140 IH264_POC_TYPE_2 = 2 /* POC type 2*/ 141 142 } IH264VENC_PicOrderCountType ; 143 144 /* Picture Order Count Type Identifier for H.264 Encoder*/ 145 typedef enum 146 { 147 IH264_INTRAREFRESH_NONE = 0 , /* Doesn't insert forcefully intra macro blocks*/ 148 IH264_INTRAREFRESH_CYCLIC_MBS , /* Insters intra macro blocks in a cyclic fashion :*/ 149 /* cyclic interval is equal to airMbPeriod*/ 150 IH264_INTRAREFRESH_CYCLIC_SLICES , /* Insters Intra Slices in a cyclic fashion: */ 151 /* no of intra slices is equal to sliceRefreshRowNumber*/ 152 IH264_INTRAREFRESH_RDOPT_MBS /* position of intra macro blocks is intelligently */ 153 /* chosen by encoder, but the number of forcely coded*/ 154 /* intra macro blocks in a frame is gaurnteed to be */ 155 /* equal to totalMbsInFrame/airMbPeriod : Not valid for DM6446*/ 156 157 } IH264VENC_IntraRefreshMethods ; 158 159 typedef enum 160 { 161 IH264_INTERLEAVED_SLICE_GRP = 0 , /* 0 : Interleaved Slices*/ 162 IH264_FOREGRND_WITH_LEFTOVER_SLICE_GRP = 2 , /* 2 : ForeGround with Left Over*/ 163 IH264_RASTER_SCAN_SLICE_GRP = 4 /* 4 : Raster Scan*/ 164 165 } IH264VENC_SliceGroupMapType ; 166 167 typedef enum 168 { 169 IH264_RASTER_SCAN = 0 , /* 0 : Raster scan order*/ 170 IH264_REVERSE_RASTER_SCAN /* 1 : Reverse Raster Scan Order*/ 171 172 } IH264VENC_SliceGroupChangeDirection ; 173 174 /* H264 Encoder DSP s/n create phase arguments */ 175 typedef struct H264VE_GPP_SN_Obj_CreatePhase { 176 unsigned short usNumStreams; 177 unsigned short usStreamId; 178 unsigned short usBuffTypeInStream; 179 unsigned short usMaxBuffsInStream; 180 unsigned short usStreamId2; 181 unsigned short usBuffTypeInStream2; 182 unsigned short usMaxBuffsInStream2; 183 184 unsigned short usReserved1; 185 186 unsigned int ulWidth; 187 unsigned int ulHeight; 188 unsigned int ulTargetBitRate; 189 unsigned int ulBitstreamBuffSize; 190 unsigned int ulIntraFramePeriod; 191 unsigned int ulFrameRate; 192 193 unsigned char ucYUVFormat; 194 unsigned char ucUnrestrictedMV; 195 unsigned char ucNumRefFrames; 196 unsigned char ucRateControlAlgorithm; 197 unsigned char ucIDREnable; 198 unsigned char ucDeblockingEnable; 199 unsigned char ucMVRange; 200 unsigned char ucQPIFrame; 201 unsigned char ucProfile; 202 unsigned char ucLevel; 203 204 unsigned short usNalCallback; 205 206 unsigned int ulEncodingPreset; 207 unsigned int ulRcAlgo; 208 unsigned short endArgs; 209 } H264VE_GPP_SN_Obj_CreatePhase; 210 211 /* H264 Encoder DSP s/n run-time dynamic parameters*/ 212 typedef struct IVIDENC_DynamicParams { 213 OMX_U32 size; /* size of this structure */ 214 OMX_U32 inputHeight; /* Input frame height */ 215 OMX_U32 inputWidth; /* Input frame width */ 216 OMX_U32 refFrameRate; /* Reference or input frame rate*1000 */ 217 OMX_U32 targetFrameRate; /* Target frame rate * 1000 */ 218 OMX_U32 targetBitRate; /* Target bit rate in bits per second */ 219 OMX_U32 intraFrameInterval;/* I frame interval e.g. 30 */ 220 OMX_U32 generateHeader; /* XDM_ENCODE_AU, XDM_GENERATE_HEADER */ 221 OMX_U32 captureWidth; /* DEFAULT(0): use imagewidth as pitch 222 * else use given capture width for 223 * pitch provided it is greater than 224 * image width. 225 */ 226 OMX_U32 forceIFrame; /* Force given frame as I or IDR (in H.264) 227 frame */ 228 } IVIDENC_DynamicParams; 229 230 typedef struct IH264VENC_DynamicParams { 231 IVIDENC_DynamicParams videncDynamicParams ; /* must be followed for all video encoders*/ 232 OMX_U32 qpIntra ; /* initial QP of I frames Range[-1,51]. -1 is for auto initialization.*/ 233 OMX_U32 qpInter ; /* initial QP of P frames Range[-1,51]. -1 is for auto initialization.*/ 234 OMX_U32 qpMax ; /* Maximum QP to be used Range[0,51]*/ 235 OMX_U32 qpMin ; /*< Minimum QP to be used Range[0,51]*/ 236 OMX_U32 lfDisableIdc ; /* Controls enable/disable loop filter, See IH264VENC_LoopFilterParams for more details*/ 237 OMX_U32 quartPelDisable ; /*< enable/disable Quarter Pel Interpolation*/ 238 OMX_U32 airMbPeriod ; /* Adaptive Intra Refesh MB Period: Period at which intra macro blocks should be insterted in a frame*/ 239 OMX_U32 maxMBsPerSlice ; /* Maximum number of macro block in a slice <minimum value is 8>*/ 240 OMX_U32 maxBytesPerSlice ; /* Maximum number of bytes in a slice */ 241 OMX_U32 sliceRefreshRowStartNumber; /* Row number from which slice needs to be intra coded*/ 242 OMX_U32 sliceRefreshRowNumber ; /* Number of rows to be coded as intra slice*/ 243 OMX_U32 filterOffsetA ; /* alpha offset for loop filter [-12, 12] even number*/ 244 OMX_U32 filterOffsetB ; /* beta offset for loop filter [-12, 12] even number*/ 245 OMX_U32 log2MaxFNumMinus4 ; /*Limits the maximum frame number in the bit-stream to (1<< (log2MaxFNumMinus4 + 4)) Range[0,12]*/ 246 OMX_U32 chromaQPIndexOffset ; /*Specifies offset to be added to luma QP for addressing QPC values table for chroma components. Valid value is between -12 and 12, (inclusive)*/ 247 OMX_U32 constrainedIntraPredEnable; /* Controls the intra macroblock coding in P slices [0,1]*/ 248 OMX_U32 picOrderCountType ; /* Picture Order count type Valid values 0, 2*/ 249 OMX_U32 maxMVperMB ; /* enable/Disable Multiple Motion vector per MB, valid values are [1, 4] [For DM6446, allowed value is only 1]*/ 250 OMX_U32 intra4x4EnableIdc ; /* See IH264VENC_Intra4x4Params for more details*/ 251 OMX_U32 mvDataEnable ; /*enable/Disable Motion vector access*/ 252 OMX_U32 hierCodingEnable ; /*Enable/Disable Hierarchical P Frame (non-reference P frame) Coding. [Not useful for DM6446]*/ 253 OMX_U32 streamFormat ; /* Signals the type of stream generated with Call-back*/ 254 OMX_U32 intraRefreshMethod ; /* Mechanism to do intra Refresh, see IH264VENC_IntraRefreshMethods for valid values*/ 255 OMX_U32 perceptualQuant ; /* Enable Perceptual Quantization a.k.a. Perceptual Rate Control*/ 256 OMX_U32 sceneChangeDet ; /* Enable Scene Change Detection*/ 257 258 void (*pfNalUnitCallBack)(OMX_U32 *pNalu, OMX_U32 *pPacketSizeInBytes, void *pContext) ; /* Function pointer of the call-back function to be used by Encoder*/ 259 void *pContext ; /*pointer to context structure used during callback*/ 260 /*Following Parameter are related to Arbitrary Slice Ordering (ASO)*/ 261 OMX_U32 numSliceASO ; /* Number of valid enteries in asoSliceOrder array valid range is [0,8], 262 where 0 and 1 doesn't have any effect*/ 263 OMX_U32 asoSliceOrder[MAXNUMSLCGPS] ; /* Array containing the order of slices in which they should 264 be present in bit-stream. vaild enteries are [0, any entry lesser than numSlicesASO]*/ 265 /* Following Parameter are related to Flexible macro block ordering (FMO)*/ 266 OMX_U32 numSliceGroups ; /* Total Number of slice groups, valid enteries are [0,8]*/ 267 OMX_U32 sliceGroupMapType ; /* Slice GroupMapType : For Valid enteries see IH264VENC_SliceGroupMapType*/ 268 OMX_U32 sliceGroupChangeDirectionFlag ; /* Slice Group Change Direction Flag: Only valid when sliceGroupMapType 269 is equal to IH264_RASTER_SCAN_SLICE_GRP. 270 For valid values refer IH264VENC_SliceGroupChangeDirection*/ 271 OMX_U32 sliceGroupChangeRate ; /* Slice Group Change Rate: Only valid when sliceGroupMapType 272 is equal to IH264_RASTER_SCAN_SLICE_GRP. 273 valid values are : [0, factor of number of Mbs in a row]*/ 274 OMX_U32 sliceGroupChangeCycle ; /* Slice Group Change Cycle: Only valid when sliceGroupMapType 275 is equal to IH264_RASTER_SCAN_SLICE_GRP. 276 Valid values can be 0 to numMbsRowsInPicture, also constrained 277 by sliceGroupChangeRate*sliceGroupChangeCycle < totalMbsInFrame*/ 278 OMX_U32 sliceGroupParams[MAXNUMSLCGPS] ; /* This field is useful in case of sliceGroupMapType equal to either 279 IH264_INTERLEAVED_SLICE_GRP or IH264_FOREGRND_WITH_LEFTOVER_SLICE_GRP 280 In both cases it has different meaning: 281 In case of IH264_INTERLEAVED_SLICE_GRP: 282 The i-th entery in this array is used to specify the number of consecutive 283 slice group macroblocks to be assigned to the i-th slice group in 284 raster scan order of slice group macroblock units. 285 Valid values are 0 to totalMbsInFrame again constrained by sum of all the elements 286 shouldn't exceed totalMbsInFrame 287 In case of IH264_FOREGRND_WITH_LEFTOVER_SLICE_GRP: 288 First entry in the array specify the start position of foreground region in terms 289 of macroblock number, valid values are [0, totalMbsInFrame-1] 290 Second entry in the array specify the end position of foreground region in terms 291 of macroblock number, valid values are [0, totalMbsInFrame-1] with following constrains: 292 endPos > startPos && endPos%mbsInOneRow > startPos%mbsInOneRow*/ 293 } IH264VENC_DynamicParams; 294 295 /* H264 Encoder DSP s/n run-time input parameters */ 296 typedef struct H264VE_GPP_SN_UALGInputParams 297 { 298 299 IH264VENC_DynamicParams H264VENC_TI_DYNAMICPARAMS; 300 OMX_U32 ulFrameIndex; 301 302 } H264VE_GPP_SN_UALGInputParams; 303 304 /* H264 Encoder DSP s/n run-time output parameters */ 305 typedef struct H264VE_GPP_SN_UALGOutputParams { 306 OMX_U32 ulBitstreamSize; 307 OMX_S32 lFrameType; 308 OMX_U32 ulNALUnitsPerFrame; /*Number of total NAL units per frame*/ 309 OMX_U32 ulNALUnitsSizes[240]; 310 OMX_U32 ulFrameIndex; /*Gives the number of the input frame wich NAL unit belongs*/ 311 OMX_U32 ulNALUnitIndex; /*Number of current NAL unit inside the frame*/ 312 } H264VE_GPP_SN_UALGOutputParams; 313 314 /* MPEG4/H263 Encoder DSP s/n create phase arguments */ 315 typedef struct MP4VE_GPP_SN_Obj_CreatePhase { 316 unsigned short usNumStreams; 317 unsigned short usStreamId; 318 unsigned short usBuffTypeInStream; 319 unsigned short usMaxBuffsInStream; 320 unsigned short usStreamId2; 321 unsigned short usBuffTypeInStream2; 322 unsigned short usMaxBuffsInStream2; 323 unsigned short usReserved1; 324 325 unsigned int ulWidth; 326 unsigned int ulHeight; 327 unsigned int ulTargetBitRate; 328 unsigned int ulVBVSize; 329 unsigned int ulGOBHeadersInterval; 330 331 unsigned char ucIsMPEG4; 332 unsigned char ucYUVFormat; 333 unsigned char ucHEC; 334 unsigned char ucResyncMarker; 335 unsigned char ucDataPartitioning; 336 unsigned char ucReversibleVLC; 337 unsigned char ucUnrestrictedMV; 338 unsigned char ucFrameRate; 339 unsigned char ucRateControlAlgorithm; 340 unsigned char ucQPFirstIFrame; 341 unsigned char ucProfile; 342 unsigned char ucLevel; 343 unsigned int ulMaxDelay; 344 345 #ifndef MODE_3410 346 unsigned int ulVbvParamEnable; 347 unsigned int ulH263SliceMode; 348 #endif 349 350 unsigned int ulUseGOV; 351 unsigned int ulUseVOS; 352 unsigned int enableH263AnnexI; 353 unsigned int enableH263AnnexJ; 354 unsigned int enableH263AnnexT; 355 356 unsigned short endArgs; 357 } MP4VE_GPP_SN_Obj_CreatePhase; 358 359 /* MPEG4/H263 Encoder DSP s/n run-time input parameters */ 360 typedef struct MP4VE_GPP_SN_UALGInputParams { 361 unsigned int ulFrameIndex; 362 unsigned int ulTargetFrameRate; 363 unsigned int ulTargetBitRate; 364 unsigned int ulIntraFrameInterval; 365 unsigned int ulGenerateHeader; 366 unsigned int ulForceIFrame; 367 368 unsigned int ulResyncInterval; 369 unsigned int ulHecInterval; 370 unsigned int ulAIRRate; 371 unsigned int ulMIRRate; 372 unsigned int ulQPIntra; 373 unsigned int ulfCode; 374 unsigned int ulHalfPel; 375 unsigned int ulACPred; 376 unsigned int ul4MV; 377 unsigned int uluseUMV; 378 unsigned int ulMVDataEnable; 379 unsigned int ulResyncDataEnable; 380 381 unsigned int ulQPInter; /* default QP for P frame, range 1 to 31 */ 382 unsigned int ulLastFrame; 383 unsigned int ulcapturewidth; 384 unsigned int ulQpMax; 385 unsigned int ulQpMin; 386 } MP4VE_GPP_SN_UALGInputParams; 387 388 /* MPEG4/H263 Encoder DSP s/n run-time output parameters */ 389 typedef struct MP4VE_GPP_SN_UALGOutputParams { 390 unsigned int ulBitstreamSize; 391 unsigned int cFrameType;/*changed from unsigned char as SN did*/ 392 unsigned int mvDataSize; 393 unsigned int numPackets; 394 #ifdef MODE_3410 395 unsigned char MVData[9600]; 396 unsigned char ResyncData[4800]; 397 #else 398 unsigned char MVData[12960]; 399 unsigned int ResyncData[1620]; 400 #endif 401 } MP4VE_GPP_SN_UALGOutputParams; 402 403 /* 404 * ======== IVIDEO_RateControlPreset ======== 405 * IVIDEO_DEFAULT => Default rate control of encoder 406 * IVIDEO_LOW_DELAY => CBR rate control for video conferencing 407 * IVIDEO_STORAGE => VBR rate control for local storage (DVD) recording 408 * IVIDEO_TWOPASS => two pass rate control for non real time applications 409 * IVIDEO_USER_DEFINED => User defined configuration using advanced parameters 410 */ 411 typedef enum { 412 IVIDEO_LOW_DELAY =1, IVIDEO_STORAGE, IVIDEO_TWOPASS, IVIDEO_NONE, IVIDEO_USER_DEFINED 413 } IVIDEO_RateControlPreset; 414 415 #endif 416