nengel@2: #ifndef AVCODEC_AVCODEC_H nengel@2: #define AVCODEC_AVCODEC_H nengel@2: nengel@2: #include nengel@2: #include nengel@2: #include "config.h" nengel@2: nengel@2: #include "libavutil/mem.h" nengel@2: nengel@2: #define MAX_SPS_COUNT 32 nengel@2: #define MAX_PPS_COUNT 256 nengel@2: nengel@2: nengel@2: #ifndef CABAC nengel@2: #define CABAC h->pps.cabac nengel@2: #endif nengel@2: nengel@2: #define EXTENDED_SAR 255 nengel@2: nengel@2: #define MB_TYPE_REF0 MB_TYPE_ACPRED //dirty but it fits in 16 bit nengel@2: #define MB_TYPE_8x8DCT 0x01000000 nengel@2: #define IS_REF0(a) ((a) & MB_TYPE_REF0) nengel@2: #define IS_8x8DCT(a) ((a) & MB_TYPE_8x8DCT) nengel@2: nengel@2: #define LIST_NOT_USED -1 nengel@2: #define PART_NOT_AVAILABLE -2 nengel@2: nengel@2: /* dct code */ nengel@2: typedef short DCTELEM; nengel@2: nengel@2: /** nengel@2: * Required number of additionally allocated bytes at the end of the input bitstream for decoding. nengel@2: * This is mainly needed because some optimized bitstream readers read nengel@2: * 32 or 64 bit at once and could read over the end.
nengel@2: * Note: If the first 23 bits of the additional bytes are not 0, then damaged nengel@2: * MPEG bitstreams could cause overread and segfault. nengel@2: */ nengel@2: #define FF_INPUT_BUFFER_PADDING_SIZE 8 nengel@2: nengel@2: enum AVColorPrimaries{ nengel@2: AVCOL_PRI_BT709 =1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B nengel@2: AVCOL_PRI_UNSPECIFIED=2, nengel@2: AVCOL_PRI_BT470M =4, nengel@2: AVCOL_PRI_BT470BG =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM nengel@2: AVCOL_PRI_SMPTE170M =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC nengel@2: AVCOL_PRI_SMPTE240M =7, ///< functionally identical to above nengel@2: AVCOL_PRI_FILM =8, nengel@2: AVCOL_PRI_NB , ///< Not part of ABI nengel@2: }; nengel@2: nengel@2: enum AVColorTransferCharacteristic{ nengel@2: AVCOL_TRC_BT709 =1, ///< also ITU-R BT1361 nengel@2: AVCOL_TRC_UNSPECIFIED=2, nengel@2: AVCOL_TRC_GAMMA22 =4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM nengel@2: AVCOL_TRC_GAMMA28 =5, ///< also ITU-R BT470BG nengel@2: AVCOL_TRC_NB , ///< Not part of ABI nengel@2: }; nengel@2: nengel@2: enum AVColorSpace{ nengel@2: AVCOL_SPC_RGB =0, nengel@2: AVCOL_SPC_BT709 =1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B nengel@2: AVCOL_SPC_UNSPECIFIED=2, nengel@2: AVCOL_SPC_FCC =4, nengel@2: AVCOL_SPC_BT470BG =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 nengel@2: AVCOL_SPC_SMPTE170M =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above nengel@2: AVCOL_SPC_SMPTE240M =7, nengel@2: AVCOL_SPC_NB , ///< Not part of ABI nengel@2: }; nengel@2: nengel@2: enum AVColorRange{ nengel@2: AVCOL_RANGE_UNSPECIFIED=0, nengel@2: AVCOL_RANGE_MPEG =1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges nengel@2: AVCOL_RANGE_JPEG =2, ///< the normal 2^n-1 "JPEG" YUV ranges nengel@2: AVCOL_RANGE_NB , ///< Not part of ABI nengel@2: }; nengel@2: nengel@2: #define MAX_MMCO_COUNT 66 nengel@2: /** nengel@2: * Memory management control operation opcode. nengel@2: */ nengel@2: typedef enum MMCOOpcode{ nengel@2: MMCO_END=0, nengel@2: MMCO_SHORT2UNUSED, nengel@2: MMCO_LONG2UNUSED, nengel@2: MMCO_SHORT2LONG, nengel@2: MMCO_SET_MAX_LONG, nengel@2: MMCO_RESET, nengel@2: MMCO_LONG, nengel@2: } MMCOOpcode; nengel@2: nengel@2: /* NAL unit types */ nengel@2: enum { nengel@2: NAL_SLICE=1, nengel@2: NAL_DPA, nengel@2: NAL_DPB, nengel@2: NAL_DPC, nengel@2: NAL_IDR_SLICE, nengel@2: NAL_SEI, nengel@2: NAL_SPS, nengel@2: NAL_PPS, nengel@2: NAL_AUD, nengel@2: NAL_END_SEQUENCE, nengel@2: NAL_END_STREAM, nengel@2: NAL_FILLER_DATA, nengel@2: NAL_SPS_EXT, nengel@2: NAL_AUXILIARY_SLICE=19 nengel@2: }; nengel@2: nengel@2: /** nengel@2: * SEI message types nengel@2: */ nengel@2: typedef enum { nengel@2: SEI_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1) nengel@2: SEI_TYPE_PIC_TIMING = 1, ///< picture timing nengel@2: SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data nengel@2: SEI_TYPE_RECOVERY_POINT = 6 ///< recovery point (frame # to decoder sync) nengel@2: } SEI_Type; nengel@2: nengel@2: /** nengel@2: * pic_struct in picture timing SEI message nengel@2: */ nengel@2: typedef enum { nengel@2: SEI_PIC_STRUCT_FRAME = 0, ///< 0: %frame nengel@2: SEI_PIC_STRUCT_TOP_FIELD = 1, ///< 1: top field nengel@2: SEI_PIC_STRUCT_BOTTOM_FIELD = 2, ///< 2: bottom field nengel@2: SEI_PIC_STRUCT_TOP_BOTTOM = 3, ///< 3: top field, bottom field, in that order nengel@2: SEI_PIC_STRUCT_BOTTOM_TOP = 4, ///< 4: bottom field, top field, in that order nengel@2: SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5, ///< 5: top field, bottom field, top field repeated, in that order nengel@2: SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6, ///< 6: bottom field, top field, bottom field repeated, in that order nengel@2: SEI_PIC_STRUCT_FRAME_DOUBLING = 7, ///< 7: %frame doubling nengel@2: SEI_PIC_STRUCT_FRAME_TRIPLING = 8 ///< 8: %frame tripling nengel@2: } SEI_PicStructType; nengel@2: nengel@2: #define FF_MAX_B_FRAMES 16 nengel@2: nengel@2: nengel@2: //The following defines may change, don't expect compatibility if you use them. nengel@2: #define MB_TYPE_INTRA4x4 0x0001 nengel@2: #define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific nengel@2: #define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific nengel@2: #define MB_TYPE_16x16 0x0008 nengel@2: #define MB_TYPE_16x8 0x0010 nengel@2: #define MB_TYPE_8x16 0x0020 nengel@2: #define MB_TYPE_8x8 0x0040 nengel@2: #define MB_TYPE_INTERLACED 0x0080 nengel@2: #define MB_TYPE_DIRECT2 0x0100 //FIXME nengel@2: #define MB_TYPE_ACPRED 0x0200 nengel@2: #define MB_TYPE_GMC 0x0400 nengel@2: #define MB_TYPE_SKIP 0x0800 nengel@2: #define MB_TYPE_P0L0 0x1000 nengel@2: #define MB_TYPE_P1L0 0x2000 nengel@2: #define MB_TYPE_P0L1 0x4000 nengel@2: #define MB_TYPE_P1L1 0x8000 nengel@2: #define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0) nengel@2: #define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1) nengel@2: #define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1) nengel@2: #define MB_TYPE_QUANT 0x00010000 nengel@2: #define MB_TYPE_CBP 0x00020000 nengel@2: //Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...) nengel@2: nengel@2: #define FF_BUFFER_TYPE_INTERNAL 1 nengel@2: #define FF_BUFFER_TYPE_USER 2 ///< direct rendering buffers (image is (de)allocated by user) nengel@2: #define FF_BUFFER_TYPE_SHARED 4 ///< Buffer from somewhere else; don't deallocate image (data/base), all other tables are not shared. nengel@2: #define FF_BUFFER_TYPE_COPY 8 ///< Just a (modified) copy of some other buffer, don't deallocate anything. nengel@2: nengel@2: nengel@2: #define FF_I_TYPE 1 ///< Intra nengel@2: #define FF_P_TYPE 2 ///< Predicted nengel@2: #define FF_B_TYPE 3 ///< Bi-dir predicted nengel@2: #define FF_S_TYPE 4 ///< S(GMC)-VOP MPEG4 nengel@2: #define FF_SI_TYPE 5 ///< Switching Intra nengel@2: #define FF_SP_TYPE 6 ///< Switching Predicted nengel@2: #define FF_BI_TYPE 7 nengel@2: nengel@2: #define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if there is just one type nengel@2: #define IS_INTRA4x4(a) ((a)&MB_TYPE_INTRA4x4) nengel@2: #define IS_INTRA16x16(a) ((a)&MB_TYPE_INTRA16x16) nengel@2: #define IS_PCM(a) ((a)&MB_TYPE_INTRA_PCM) nengel@2: #define IS_INTRA(a) ((a)&7) nengel@2: #define IS_INTER(a) ((a)&(MB_TYPE_16x16|MB_TYPE_16x8|MB_TYPE_8x16|MB_TYPE_8x8)) nengel@2: #define IS_SKIP(a) ((a)&MB_TYPE_SKIP) nengel@2: #define IS_INTRA_PCM(a) ((a)&MB_TYPE_INTRA_PCM) nengel@2: #define IS_INTERLACED(a) ((a)&MB_TYPE_INTERLACED) nengel@2: #define IS_DIRECT(a) ((a)&MB_TYPE_DIRECT2) nengel@2: #define IS_GMC(a) ((a)&MB_TYPE_GMC) nengel@2: #define IS_16X16(a) ((a)&MB_TYPE_16x16) nengel@2: #define IS_16X8(a) ((a)&MB_TYPE_16x8) nengel@2: #define IS_8X16(a) ((a)&MB_TYPE_8x16) nengel@2: #define IS_8X8(a) ((a)&MB_TYPE_8x8) nengel@2: #define IS_SUB_8X8(a) ((a)&MB_TYPE_16x16) //note reused nengel@2: #define IS_SUB_8X4(a) ((a)&MB_TYPE_16x8) //note reused nengel@2: #define IS_SUB_4X8(a) ((a)&MB_TYPE_8x16) //note reused nengel@2: #define IS_SUB_4X4(a) ((a)&MB_TYPE_8x8) //note reused nengel@2: #define IS_ACPRED(a) ((a)&MB_TYPE_ACPRED) nengel@2: #define IS_QUANT(a) ((a)&MB_TYPE_QUANT) nengel@2: #define IS_DIR(a, part, list) ((a) & (MB_TYPE_P0L0<<((part)+2*(list)))) nengel@2: #define USES_LIST(a, list) ((a) & ((MB_TYPE_P0L0|MB_TYPE_P1L0)<<(2*(list)))) ///< does this mb use listX, note does not work if subMBs nengel@2: #define HAS_CBP(a) ((a)&MB_TYPE_CBP) nengel@2: nengel@2: nengel@2: #define FF_MM_FORCE 0x80000000 /* Force usage of selected flags (OR) */ nengel@2: /* lower 16 bits - CPU features */ nengel@2: #define FF_MM_MMX 0x0001 ///< standard MMX nengel@2: #define FF_MM_3DNOW 0x0004 ///< AMD 3DNOW nengel@2: #define FF_MM_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext nengel@2: #define FF_MM_SSE 0x0008 ///< SSE functions nengel@2: #define FF_MM_SSE2 0x0010 ///< PIV SSE2 functions nengel@2: #define FF_MM_3DNOWEXT 0x0020 ///< AMD 3DNowExt nengel@2: #define FF_MM_SSE3 0x0040 ///< Prescott SSE3 functions nengel@2: #define FF_MM_SSSE3 0x0080 ///< Conroe SSSE3 functions nengel@2: #define FF_MM_SSE4 0x0100 ///< Penryn SSE4.1 functions nengel@2: #define FF_MM_SSE42 0x0200 ///< Nehalem SSE4.2 functions nengel@2: #define FF_MM_IWMMXT 0x0100 ///< XScale IWMMXT nengel@2: #define FF_MM_ALTIVEC 0x0001 ///< standard AltiVec nengel@2: nengel@2: nengel@2: /** nengel@2: * Sequence parameter set nengel@2: */ nengel@2: typedef struct SPS{ nengel@2: nengel@2: int profile_idc; nengel@2: int level_idc; nengel@2: int chroma_format_idc; nengel@2: int transform_bypass; ///< qpprime_y_zero_transform_bypass_flag nengel@2: int log2_max_frame_num; ///< log2_max_frame_num_minus4 + 4 nengel@2: int poc_type; ///< pic_order_cnt_type nengel@2: int log2_max_poc_lsb; ///< log2_max_pic_order_cnt_lsb_minus4 nengel@2: int delta_pic_order_always_zero_flag; nengel@2: int offset_for_non_ref_pic; nengel@2: int offset_for_top_to_bottom_field; nengel@2: int poc_cycle_length; ///< num_ref_frames_in_pic_order_cnt_cycle nengel@2: int ref_frame_count; ///< num_ref_frames nengel@2: int gaps_in_frame_num_allowed_flag; nengel@2: int mb_width; ///< pic_width_in_mbs_minus1 + 1 nengel@2: int mb_height; ///< pic_height_in_map_units_minus1 + 1 nengel@2: int frame_mbs_only_flag; nengel@2: int mb_aff; /// free, 1 -> needs to be displayed, 2 -> needed for reference, 3 -> 1 && 2 nengel@2: int key_frame; nengel@2: int mmco_reset; ///< h264 MMCO_RESET set this 1. Reordering code must not mix pictures before and after MMCO_RESET. nengel@2: nengel@2: } DecodedPicture; nengel@2: nengel@2: nengel@2: #endif /* AVCODEC_AVCODEC_H */