00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #ifndef FFMPEG_H264_H
00029 #define FFMPEG_H264_H
00030
00031 #include "dsputil.h"
00032 #include "cabac.h"
00033 #include "mpegvideo.h"
00034 #include "h264pred.h"
00035
00036 #define interlaced_dct interlaced_dct_is_a_bad_name
00037 #define mb_intra mb_intra_is_not_initialized_see_mb_type
00038
00039 #define LUMA_DC_BLOCK_INDEX 25
00040 #define CHROMA_DC_BLOCK_INDEX 26
00041
00042 #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
00043 #define COEFF_TOKEN_VLC_BITS 8
00044 #define TOTAL_ZEROS_VLC_BITS 9
00045 #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
00046 #define RUN_VLC_BITS 3
00047 #define RUN7_VLC_BITS 6
00048
00049 #define MAX_SPS_COUNT 32
00050 #define MAX_PPS_COUNT 256
00051
00052 #define MAX_MMCO_COUNT 66
00053
00054
00055
00056 #define ALLOW_INTERLACE
00057
00058 #ifdef ALLOW_INTERLACE
00059 #define MB_MBAFF h->mb_mbaff
00060 #define MB_FIELD h->mb_field_decoding_flag
00061 #define FRAME_MBAFF h->mb_aff_frame
00062 #define FIELD_PICTURE (s->picture_structure != PICT_FRAME)
00063 #else
00064 #define MB_MBAFF 0
00065 #define MB_FIELD 0
00066 #define FRAME_MBAFF 0
00067 #define FIELD_PICTURE 0
00068 #undef IS_INTERLACED
00069 #define IS_INTERLACED(mb_type) 0
00070 #endif
00071 #define FIELD_OR_MBAFF_PICTURE (FRAME_MBAFF || FIELD_PICTURE)
00072
00076 typedef struct SPS{
00077
00078 int profile_idc;
00079 int level_idc;
00080 int transform_bypass;
00081 int log2_max_frame_num;
00082 int poc_type;
00083 int log2_max_poc_lsb;
00084 int delta_pic_order_always_zero_flag;
00085 int offset_for_non_ref_pic;
00086 int offset_for_top_to_bottom_field;
00087 int poc_cycle_length;
00088 int ref_frame_count;
00089 int gaps_in_frame_num_allowed_flag;
00090 int mb_width;
00091 int mb_height;
00092 int frame_mbs_only_flag;
00093 int mb_aff;
00094 int direct_8x8_inference_flag;
00095 int crop;
00096 int crop_left;
00097 int crop_right;
00098 int crop_top;
00099 int crop_bottom;
00100 int vui_parameters_present_flag;
00101 AVRational sar;
00102 int timing_info_present_flag;
00103 uint32_t num_units_in_tick;
00104 uint32_t time_scale;
00105 int fixed_frame_rate_flag;
00106 short offset_for_ref_frame[256];
00107 int bitstream_restriction_flag;
00108 int num_reorder_frames;
00109 int scaling_matrix_present;
00110 uint8_t scaling_matrix4[6][16];
00111 uint8_t scaling_matrix8[2][64];
00112 }SPS;
00113
00117 typedef struct PPS{
00118 unsigned int sps_id;
00119 int cabac;
00120 int pic_order_present;
00121 int slice_group_count;
00122 int mb_slice_group_map_type;
00123 unsigned int ref_count[2];
00124 int weighted_pred;
00125 int weighted_bipred_idc;
00126 int init_qp;
00127 int init_qs;
00128 int chroma_qp_index_offset[2];
00129 int deblocking_filter_parameters_present;
00130 int constrained_intra_pred;
00131 int redundant_pic_cnt_present;
00132 int transform_8x8_mode;
00133 uint8_t scaling_matrix4[6][16];
00134 uint8_t scaling_matrix8[2][64];
00135 uint8_t chroma_qp_table[2][256];
00136 int chroma_qp_diff;
00137 }PPS;
00138
00142 typedef enum MMCOOpcode{
00143 MMCO_END=0,
00144 MMCO_SHORT2UNUSED,
00145 MMCO_LONG2UNUSED,
00146 MMCO_SHORT2LONG,
00147 MMCO_SET_MAX_LONG,
00148 MMCO_RESET,
00149 MMCO_LONG,
00150 } MMCOOpcode;
00151
00155 typedef struct MMCO{
00156 MMCOOpcode opcode;
00157 int short_pic_num;
00158 int long_arg;
00159 } MMCO;
00160
00164 typedef struct H264Context{
00165 MpegEncContext s;
00166 int nal_ref_idc;
00167 int nal_unit_type;
00168 uint8_t *rbsp_buffer[2];
00169 unsigned int rbsp_buffer_size[2];
00170
00174 int is_avc;
00175 int got_avcC;
00176 int nal_length_size;
00177
00178 int chroma_qp[2];
00179
00180 int prev_mb_skipped;
00181 int next_mb_skipped;
00182
00183
00184 int chroma_pred_mode;
00185 int intra16x16_pred_mode;
00186
00187 int top_mb_xy;
00188 int left_mb_xy[2];
00189
00190 int8_t intra4x4_pred_mode_cache[5*8];
00191 int8_t (*intra4x4_pred_mode)[8];
00192 H264PredContext hpc;
00193 unsigned int topleft_samples_available;
00194 unsigned int top_samples_available;
00195 unsigned int topright_samples_available;
00196 unsigned int left_samples_available;
00197 uint8_t (*top_borders[2])[16+2*8];
00198 uint8_t left_border[2*(17+2*9)];
00199
00204 DECLARE_ALIGNED_8(uint8_t, non_zero_count_cache[6*8]);
00205 uint8_t (*non_zero_count)[16];
00206
00210 DECLARE_ALIGNED_8(int16_t, mv_cache[2][5*8][2]);
00211 DECLARE_ALIGNED_8(int8_t, ref_cache[2][5*8]);
00212 #define LIST_NOT_USED -1 //FIXME rename?
00213 #define PART_NOT_AVAILABLE -2
00214
00218 int mv_cache_clean[2];
00219
00223 int neighbor_transform_size;
00224
00229 int block_offset[2*(16+8)];
00230
00231 uint32_t *mb2b_xy;
00232 uint32_t *mb2b8_xy;
00233 int b_stride;
00234 int b8_stride;
00235
00236 int mb_linesize;
00237 int mb_uvlinesize;
00238
00239 int emu_edge_width;
00240 int emu_edge_height;
00241
00242 int halfpel_flag;
00243 int thirdpel_flag;
00244
00245 int unknown_svq3_flag;
00246 int next_slice_index;
00247
00248 SPS *sps_buffers[MAX_SPS_COUNT];
00249 SPS sps;
00250
00251 PPS *pps_buffers[MAX_PPS_COUNT];
00255 PPS pps;
00256
00257 uint32_t dequant4_buffer[6][52][16];
00258 uint32_t dequant8_buffer[2][52][64];
00259 uint32_t (*dequant4_coeff[6])[16];
00260 uint32_t (*dequant8_coeff[2])[64];
00261 int dequant_coeff_pps;
00262
00263 int slice_num;
00264 uint8_t *slice_table_base;
00265 uint8_t *slice_table;
00266 int slice_type;
00267 int slice_type_fixed;
00268
00269
00270 int mb_aff_frame;
00271 int mb_field_decoding_flag;
00272 int mb_mbaff;
00273
00274 unsigned int sub_mb_type[4];
00275
00276
00277 int poc_lsb;
00278 int poc_msb;
00279 int delta_poc_bottom;
00280 int delta_poc[2];
00281 int frame_num;
00282 int prev_poc_msb;
00283 int prev_poc_lsb;
00284 int frame_num_offset;
00285 int prev_frame_num_offset;
00286 int prev_frame_num;
00287
00291 int curr_pic_num;
00292
00296 int max_pic_num;
00297
00298
00299 int use_weight;
00300 int use_weight_chroma;
00301 int luma_log2_weight_denom;
00302 int chroma_log2_weight_denom;
00303 int luma_weight[2][48];
00304 int luma_offset[2][48];
00305 int chroma_weight[2][48][2];
00306 int chroma_offset[2][48][2];
00307 int implicit_weight[48][48];
00308
00309
00310 int deblocking_filter;
00311 int slice_alpha_c0_offset;
00312 int slice_beta_offset;
00313
00314 int redundant_pic_count;
00315
00316 int direct_spatial_mv_pred;
00317 int dist_scale_factor[16];
00318 int dist_scale_factor_field[32];
00319 int map_col_to_list0[2][16];
00320 int map_col_to_list0_field[2][32];
00321
00325 unsigned int ref_count[2];
00326 unsigned int list_count;
00327 Picture *short_ref[32];
00328 Picture *long_ref[32];
00329 Picture default_ref_list[2][32];
00330 Picture ref_list[2][48];
00333 Picture *delayed_pic[18];
00334 Picture *delayed_output_pic;
00335
00339 MMCO mmco[MAX_MMCO_COUNT];
00340 int mmco_index;
00341
00342 int long_ref_count;
00343 int short_ref_count;
00344
00345
00346 GetBitContext intra_gb;
00347 GetBitContext inter_gb;
00348 GetBitContext *intra_gb_ptr;
00349 GetBitContext *inter_gb_ptr;
00350
00351 DECLARE_ALIGNED_16(DCTELEM, mb[16*24]);
00352 DCTELEM mb_padding[256];
00353
00357 CABACContext cabac;
00358 uint8_t cabac_state[460];
00359 int cabac_init_idc;
00360
00361
00362 uint16_t *cbp_table;
00363 int cbp;
00364 int top_cbp;
00365 int left_cbp;
00366
00367 uint8_t *chroma_pred_mode_table;
00368 int last_qscale_diff;
00369 int16_t (*mvd_table[2])[2];
00370 DECLARE_ALIGNED_8(int16_t, mvd_cache[2][5*8][2]);
00371 uint8_t *direct_table;
00372 uint8_t direct_cache[5*8];
00373
00374 uint8_t zigzag_scan[16];
00375 uint8_t zigzag_scan8x8[64];
00376 uint8_t zigzag_scan8x8_cavlc[64];
00377 uint8_t field_scan[16];
00378 uint8_t field_scan8x8[64];
00379 uint8_t field_scan8x8_cavlc[64];
00380 const uint8_t *zigzag_scan_q0;
00381 const uint8_t *zigzag_scan8x8_q0;
00382 const uint8_t *zigzag_scan8x8_cavlc_q0;
00383 const uint8_t *field_scan_q0;
00384 const uint8_t *field_scan8x8_q0;
00385 const uint8_t *field_scan8x8_cavlc_q0;
00386
00387 int x264_build;
00388
00393 struct H264Context *thread_context[MAX_THREADS];
00394
00398 int current_slice;
00399
00406 int max_contexts;
00407
00412 int single_decode_warning;
00413
00414 int last_slice_type;
00417 }H264Context;
00418
00419 #endif