00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #ifndef AVCODEC_H264_H
00029 #define AVCODEC_H264_H
00030
00031 #include "libavutil/intreadwrite.h"
00032 #include "dsputil.h"
00033 #include "cabac.h"
00034 #include "mpegvideo.h"
00035 #include "h264dsp.h"
00036 #include "h264pred.h"
00037 #include "rectangle.h"
00038
00039 #define interlaced_dct interlaced_dct_is_a_bad_name
00040 #define mb_intra mb_intra_is_not_initialized_see_mb_type
00041
00042 #define MAX_SPS_COUNT 32
00043 #define MAX_PPS_COUNT 256
00044
00045 #define MAX_MMCO_COUNT 66
00046
00047 #define MAX_DELAYED_PIC_COUNT 16
00048
00049 #define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
00050
00051
00052
00053 #define ALLOW_INTERLACE
00054
00055 #define FMO 0
00056
00061 #define MAX_SLICES 16
00062
00063 #ifdef ALLOW_INTERLACE
00064 #define MB_MBAFF h->mb_mbaff
00065 #define MB_FIELD h->mb_field_decoding_flag
00066 #define FRAME_MBAFF h->mb_aff_frame
00067 #define FIELD_PICTURE (s->picture_structure != PICT_FRAME)
00068 #define LEFT_MBS 2
00069 #define LTOP 0
00070 #define LBOT 1
00071 #define LEFT(i) (i)
00072 #else
00073 #define MB_MBAFF 0
00074 #define MB_FIELD 0
00075 #define FRAME_MBAFF 0
00076 #define FIELD_PICTURE 0
00077 #undef IS_INTERLACED
00078 #define IS_INTERLACED(mb_type) 0
00079 #define LEFT_MBS 1
00080 #define LTOP 0
00081 #define LBOT 0
00082 #define LEFT(i) 0
00083 #endif
00084 #define FIELD_OR_MBAFF_PICTURE (FRAME_MBAFF || FIELD_PICTURE)
00085
00086 #ifndef CABAC
00087 #define CABAC h->pps.cabac
00088 #endif
00089
00090 #define CHROMA (h->sps.chroma_format_idc)
00091 #define CHROMA422 (h->sps.chroma_format_idc == 2)
00092 #define CHROMA444 (h->sps.chroma_format_idc == 3)
00093
00094 #define EXTENDED_SAR 255
00095
00096 #define MB_TYPE_REF0 MB_TYPE_ACPRED // dirty but it fits in 16 bit
00097 #define MB_TYPE_8x8DCT 0x01000000
00098 #define IS_REF0(a) ((a) & MB_TYPE_REF0)
00099 #define IS_8x8DCT(a) ((a) & MB_TYPE_8x8DCT)
00100
00105 #define DELAYED_PIC_REF 4
00106
00107 #define QP_MAX_NUM (51 + 6*6) // The maximum supported qp
00108
00109
00110 enum {
00111 NAL_SLICE = 1,
00112 NAL_DPA,
00113 NAL_DPB,
00114 NAL_DPC,
00115 NAL_IDR_SLICE,
00116 NAL_SEI,
00117 NAL_SPS,
00118 NAL_PPS,
00119 NAL_AUD,
00120 NAL_END_SEQUENCE,
00121 NAL_END_STREAM,
00122 NAL_FILLER_DATA,
00123 NAL_SPS_EXT,
00124 NAL_AUXILIARY_SLICE = 19
00125 };
00126
00130 typedef enum {
00131 SEI_BUFFERING_PERIOD = 0,
00132 SEI_TYPE_PIC_TIMING = 1,
00133 SEI_TYPE_USER_DATA_UNREGISTERED = 5,
00134 SEI_TYPE_RECOVERY_POINT = 6
00135 } SEI_Type;
00136
00140 typedef enum {
00141 SEI_PIC_STRUCT_FRAME = 0,
00142 SEI_PIC_STRUCT_TOP_FIELD = 1,
00143 SEI_PIC_STRUCT_BOTTOM_FIELD = 2,
00144 SEI_PIC_STRUCT_TOP_BOTTOM = 3,
00145 SEI_PIC_STRUCT_BOTTOM_TOP = 4,
00146 SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5,
00147 SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6,
00148 SEI_PIC_STRUCT_FRAME_DOUBLING = 7,
00149 SEI_PIC_STRUCT_FRAME_TRIPLING = 8
00150 } SEI_PicStructType;
00151
00155 typedef struct SPS {
00156 int profile_idc;
00157 int level_idc;
00158 int chroma_format_idc;
00159 int transform_bypass;
00160 int log2_max_frame_num;
00161 int poc_type;
00162 int log2_max_poc_lsb;
00163 int delta_pic_order_always_zero_flag;
00164 int offset_for_non_ref_pic;
00165 int offset_for_top_to_bottom_field;
00166 int poc_cycle_length;
00167 int ref_frame_count;
00168 int gaps_in_frame_num_allowed_flag;
00169 int mb_width;
00170 int mb_height;
00171 int frame_mbs_only_flag;
00172 int mb_aff;
00173 int direct_8x8_inference_flag;
00174 int crop;
00175 unsigned int crop_left;
00176 unsigned int crop_right;
00177 unsigned int crop_top;
00178 unsigned int crop_bottom;
00179 int vui_parameters_present_flag;
00180 AVRational sar;
00181 int video_signal_type_present_flag;
00182 int full_range;
00183 int colour_description_present_flag;
00184 enum AVColorPrimaries color_primaries;
00185 enum AVColorTransferCharacteristic color_trc;
00186 enum AVColorSpace colorspace;
00187 int timing_info_present_flag;
00188 uint32_t num_units_in_tick;
00189 uint32_t time_scale;
00190 int fixed_frame_rate_flag;
00191 short offset_for_ref_frame[256];
00192 int bitstream_restriction_flag;
00193 int num_reorder_frames;
00194 int scaling_matrix_present;
00195 uint8_t scaling_matrix4[6][16];
00196 uint8_t scaling_matrix8[6][64];
00197 int nal_hrd_parameters_present_flag;
00198 int vcl_hrd_parameters_present_flag;
00199 int pic_struct_present_flag;
00200 int time_offset_length;
00201 int cpb_cnt;
00202 int initial_cpb_removal_delay_length;
00203 int cpb_removal_delay_length;
00204 int dpb_output_delay_length;
00205 int bit_depth_luma;
00206 int bit_depth_chroma;
00207 int residual_color_transform_flag;
00208 int constraint_set_flags;
00209 } SPS;
00210
00214 typedef struct PPS {
00215 unsigned int sps_id;
00216 int cabac;
00217 int pic_order_present;
00218 int slice_group_count;
00219 int mb_slice_group_map_type;
00220 unsigned int ref_count[2];
00221 int weighted_pred;
00222 int weighted_bipred_idc;
00223 int init_qp;
00224 int init_qs;
00225 int chroma_qp_index_offset[2];
00226 int deblocking_filter_parameters_present;
00227 int constrained_intra_pred;
00228 int redundant_pic_cnt_present;
00229 int transform_8x8_mode;
00230 uint8_t scaling_matrix4[6][16];
00231 uint8_t scaling_matrix8[6][64];
00232 uint8_t chroma_qp_table[2][QP_MAX_NUM+1];
00233 int chroma_qp_diff;
00234 } PPS;
00235
00239 typedef enum MMCOOpcode {
00240 MMCO_END = 0,
00241 MMCO_SHORT2UNUSED,
00242 MMCO_LONG2UNUSED,
00243 MMCO_SHORT2LONG,
00244 MMCO_SET_MAX_LONG,
00245 MMCO_RESET,
00246 MMCO_LONG,
00247 } MMCOOpcode;
00248
00252 typedef struct MMCO {
00253 MMCOOpcode opcode;
00254 int short_pic_num;
00255 int long_arg;
00256 } MMCO;
00257
00261 typedef struct H264Context {
00262 MpegEncContext s;
00263 H264DSPContext h264dsp;
00264 int pixel_shift;
00265 int chroma_qp[2];
00266
00267 int qp_thresh;
00268
00269 int prev_mb_skipped;
00270 int next_mb_skipped;
00271
00272
00273 int chroma_pred_mode;
00274 int intra16x16_pred_mode;
00275
00276 int topleft_mb_xy;
00277 int top_mb_xy;
00278 int topright_mb_xy;
00279 int left_mb_xy[LEFT_MBS];
00280
00281 int topleft_type;
00282 int top_type;
00283 int topright_type;
00284 int left_type[LEFT_MBS];
00285
00286 const uint8_t *left_block;
00287 int topleft_partition;
00288
00289 int8_t intra4x4_pred_mode_cache[5 * 8];
00290 int8_t(*intra4x4_pred_mode);
00291 H264PredContext hpc;
00292 unsigned int topleft_samples_available;
00293 unsigned int top_samples_available;
00294 unsigned int topright_samples_available;
00295 unsigned int left_samples_available;
00296 uint8_t (*top_borders[2])[(16 * 3) * 2];
00297
00302 DECLARE_ALIGNED(8, uint8_t, non_zero_count_cache)[15 * 8];
00303
00304 uint8_t (*non_zero_count)[48];
00305
00309 DECLARE_ALIGNED(16, int16_t, mv_cache)[2][5 * 8][2];
00310 DECLARE_ALIGNED(8, int8_t, ref_cache)[2][5 * 8];
00311 #define LIST_NOT_USED -1 // FIXME rename?
00312 #define PART_NOT_AVAILABLE -2
00313
00317 int neighbor_transform_size;
00318
00323 int block_offset[2 * (16 * 3)];
00324
00325 uint32_t *mb2b_xy;
00326 uint32_t *mb2br_xy;
00327 int b_stride;
00328
00329 int mb_linesize;
00330 int mb_uvlinesize;
00331
00332 int emu_edge_width;
00333 int emu_edge_height;
00334
00335 SPS sps;
00336
00340 PPS pps;
00341
00342 uint32_t dequant4_buffer[6][QP_MAX_NUM + 1][16];
00343 uint32_t dequant8_buffer[6][QP_MAX_NUM + 1][64];
00344 uint32_t(*dequant4_coeff[6])[16];
00345 uint32_t(*dequant8_coeff[6])[64];
00346
00347 int slice_num;
00348 uint16_t *slice_table;
00349 int slice_type;
00350 int slice_type_nos;
00351 int slice_type_fixed;
00352
00353
00354 int mb_aff_frame;
00355 int mb_field_decoding_flag;
00356 int mb_mbaff;
00357
00358 DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4];
00359
00360
00361 int use_weight;
00362 int use_weight_chroma;
00363 int luma_log2_weight_denom;
00364 int chroma_log2_weight_denom;
00365
00366 int luma_weight[48][2][2];
00367 int chroma_weight[48][2][2][2];
00368 int implicit_weight[48][48][2];
00369
00370 int direct_spatial_mv_pred;
00371 int col_parity;
00372 int col_fieldoff;
00373 int dist_scale_factor[16];
00374 int dist_scale_factor_field[2][32];
00375 int map_col_to_list0[2][16 + 32];
00376 int map_col_to_list0_field[2][2][16 + 32];
00377
00381 unsigned int ref_count[2];
00382 unsigned int list_count;
00383 uint8_t *list_counts;
00384 Picture ref_list[2][48];
00387 int ref2frm[MAX_SLICES][2][64];
00388
00389
00390 GetBitContext intra_gb;
00391 GetBitContext inter_gb;
00392 GetBitContext *intra_gb_ptr;
00393 GetBitContext *inter_gb_ptr;
00394
00395 DECLARE_ALIGNED(16, DCTELEM, mb)[16 * 48 * 2];
00396 DECLARE_ALIGNED(16, DCTELEM, mb_luma_dc)[3][16 * 2];
00397 DCTELEM mb_padding[256 * 2];
00398
00402 CABACContext cabac;
00403 uint8_t cabac_state[1024];
00404
00405
00406 uint16_t *cbp_table;
00407 int cbp;
00408 int top_cbp;
00409 int left_cbp;
00410
00411 uint8_t *chroma_pred_mode_table;
00412 int last_qscale_diff;
00413 uint8_t (*mvd_table[2])[2];
00414 DECLARE_ALIGNED(16, uint8_t, mvd_cache)[2][5 * 8][2];
00415 uint8_t *direct_table;
00416 uint8_t direct_cache[5 * 8];
00417
00418 uint8_t zigzag_scan[16];
00419 uint8_t zigzag_scan8x8[64];
00420 uint8_t zigzag_scan8x8_cavlc[64];
00421 uint8_t field_scan[16];
00422 uint8_t field_scan8x8[64];
00423 uint8_t field_scan8x8_cavlc[64];
00424 uint8_t zigzag_scan_q0[16];
00425 uint8_t zigzag_scan8x8_q0[64];
00426 uint8_t zigzag_scan8x8_cavlc_q0[64];
00427 uint8_t field_scan_q0[16];
00428 uint8_t field_scan8x8_q0[64];
00429 uint8_t field_scan8x8_cavlc_q0[64];
00430
00431 int x264_build;
00432
00433 int mb_xy;
00434
00435 int is_complex;
00436
00437
00438 int deblocking_filter;
00439 int slice_alpha_c0_offset;
00440 int slice_beta_offset;
00441
00442
00443
00444
00445 int nal_ref_idc;
00446 int nal_unit_type;
00447 uint8_t *rbsp_buffer[2];
00448 unsigned int rbsp_buffer_size[2];
00449
00453 int is_avc;
00454 int nal_length_size;
00455 int got_first;
00456
00457 SPS *sps_buffers[MAX_SPS_COUNT];
00458 PPS *pps_buffers[MAX_PPS_COUNT];
00459
00460 int dequant_coeff_pps;
00461
00462 uint16_t *slice_table_base;
00463
00464
00465 int poc_lsb;
00466 int poc_msb;
00467 int delta_poc_bottom;
00468 int delta_poc[2];
00469 int frame_num;
00470 int prev_poc_msb;
00471 int prev_poc_lsb;
00472 int frame_num_offset;
00473 int prev_frame_num_offset;
00474 int prev_frame_num;
00475
00479 int curr_pic_num;
00480
00484 int max_pic_num;
00485
00486 int redundant_pic_count;
00487
00488 Picture *short_ref[32];
00489 Picture *long_ref[32];
00490 Picture default_ref_list[2][32];
00491 Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2];
00492 int last_pocs[MAX_DELAYED_PIC_COUNT];
00493 Picture *next_output_pic;
00494 int outputed_poc;
00495 int next_outputed_poc;
00496
00500 MMCO mmco[MAX_MMCO_COUNT];
00501 int mmco_index;
00502 int mmco_reset;
00503
00504 int long_ref_count;
00505 int short_ref_count;
00506
00507 int cabac_init_idc;
00508
00513 struct H264Context *thread_context[MAX_THREADS];
00514
00518 int current_slice;
00519
00526 int max_contexts;
00527
00532 int single_decode_warning;
00533
00534 int last_slice_type;
00540 SEI_PicStructType sei_pic_struct;
00541
00548 int prev_interlaced_frame;
00549
00555 int sei_ct_type;
00556
00560 int sei_dpb_output_delay;
00561
00565 int sei_cpb_removal_delay;
00566
00574 int sei_recovery_frame_cnt;
00581 int recovery_frame;
00582
00586 int valid_recovery_point;
00587
00588 int luma_weight_flag[2];
00589 int chroma_weight_flag[2];
00590
00591
00592 int sei_buffering_period_present;
00593 int initial_cpb_removal_delay[32];
00594
00595 int cur_chroma_format_idc;
00596
00597 int16_t slice_row[MAX_SLICES];
00598
00599 int sync;
00600
00601 uint8_t parse_history[4];
00602 int parse_history_count;
00603 int parse_last_mb;
00604 } H264Context;
00605
00606 extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1];
00607 extern const uint16_t ff_h264_mb_sizes[4];
00608
00612 int ff_h264_decode_sei(H264Context *h);
00613
00617 int ff_h264_decode_seq_parameter_set(H264Context *h);
00618
00622 int ff_h264_get_profile(SPS *sps);
00623
00627 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length);
00628
00637 const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
00638 int *dst_length, int *consumed, int length);
00639
00644 av_cold void ff_h264_free_context(H264Context *h);
00645
00649 int ff_h264_get_slice_type(const H264Context *h);
00650
00655 int ff_h264_alloc_tables(H264Context *h);
00656
00660 int ff_h264_fill_default_ref_list(H264Context *h);
00661
00662 int ff_h264_decode_ref_pic_list_reordering(H264Context *h);
00663 void ff_h264_fill_mbaff_ref_list(H264Context *h);
00664 void ff_h264_remove_all_refs(H264Context *h);
00665
00669 int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count);
00670
00671 int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb);
00672
00673 void ff_generate_sliding_window_mmcos(H264Context *h);
00674
00679 int ff_h264_check_intra4x4_pred_mode(H264Context *h);
00680
00685 int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma);
00686
00687 void ff_h264_hl_decode_mb(H264Context *h);
00688 int ff_h264_frame_start(H264Context *h);
00689 int ff_h264_decode_extradata(H264Context *h, const uint8_t *buf, int size);
00690 av_cold int ff_h264_decode_init(AVCodecContext *avctx);
00691 av_cold void ff_h264_decode_init_vlc(void);
00692
00697 int ff_h264_decode_mb_cavlc(H264Context *h);
00698
00703 int ff_h264_decode_mb_cabac(H264Context *h);
00704
00705 void ff_h264_init_cabac_states(H264Context *h);
00706
00707 void ff_h264_direct_dist_scale_factor(H264Context *const h);
00708 void ff_h264_direct_ref_list_init(H264Context *const h);
00709 void ff_h264_pred_direct_motion(H264Context *const h, int *mb_type);
00710
00711 void ff_h264_filter_mb_fast(H264Context *h, int mb_x, int mb_y,
00712 uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr,
00713 unsigned int linesize, unsigned int uvlinesize);
00714 void ff_h264_filter_mb(H264Context *h, int mb_x, int mb_y,
00715 uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr,
00716 unsigned int linesize, unsigned int uvlinesize);
00717
00723 void ff_h264_reset_sei(H264Context *h);
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755 #define LUMA_DC_BLOCK_INDEX 48
00756 #define CHROMA_DC_BLOCK_INDEX 49
00757
00758
00759 static const uint8_t scan8[16 * 3 + 3] = {
00760 4 + 1 * 8, 5 + 1 * 8, 4 + 2 * 8, 5 + 2 * 8,
00761 6 + 1 * 8, 7 + 1 * 8, 6 + 2 * 8, 7 + 2 * 8,
00762 4 + 3 * 8, 5 + 3 * 8, 4 + 4 * 8, 5 + 4 * 8,
00763 6 + 3 * 8, 7 + 3 * 8, 6 + 4 * 8, 7 + 4 * 8,
00764 4 + 6 * 8, 5 + 6 * 8, 4 + 7 * 8, 5 + 7 * 8,
00765 6 + 6 * 8, 7 + 6 * 8, 6 + 7 * 8, 7 + 7 * 8,
00766 4 + 8 * 8, 5 + 8 * 8, 4 + 9 * 8, 5 + 9 * 8,
00767 6 + 8 * 8, 7 + 8 * 8, 6 + 9 * 8, 7 + 9 * 8,
00768 4 + 11 * 8, 5 + 11 * 8, 4 + 12 * 8, 5 + 12 * 8,
00769 6 + 11 * 8, 7 + 11 * 8, 6 + 12 * 8, 7 + 12 * 8,
00770 4 + 13 * 8, 5 + 13 * 8, 4 + 14 * 8, 5 + 14 * 8,
00771 6 + 13 * 8, 7 + 13 * 8, 6 + 14 * 8, 7 + 14 * 8,
00772 0 + 0 * 8, 0 + 5 * 8, 0 + 10 * 8
00773 };
00774
00775 static av_always_inline uint32_t pack16to32(int a, int b)
00776 {
00777 #if HAVE_BIGENDIAN
00778 return (b & 0xFFFF) + (a << 16);
00779 #else
00780 return (a & 0xFFFF) + (b << 16);
00781 #endif
00782 }
00783
00784 static av_always_inline uint16_t pack8to16(int a, int b)
00785 {
00786 #if HAVE_BIGENDIAN
00787 return (b & 0xFF) + (a << 8);
00788 #else
00789 return (a & 0xFF) + (b << 8);
00790 #endif
00791 }
00792
00796 static av_always_inline int get_chroma_qp(H264Context *h, int t, int qscale)
00797 {
00798 return h->pps.chroma_qp_table[t][qscale];
00799 }
00800
00804 static av_always_inline int pred_intra_mode(H264Context *h, int n)
00805 {
00806 const int index8 = scan8[n];
00807 const int left = h->intra4x4_pred_mode_cache[index8 - 1];
00808 const int top = h->intra4x4_pred_mode_cache[index8 - 8];
00809 const int min = FFMIN(left, top);
00810
00811 tprintf(h->s.avctx, "mode:%d %d min:%d\n", left, top, min);
00812
00813 if (min < 0)
00814 return DC_PRED;
00815 else
00816 return min;
00817 }
00818
00819 static av_always_inline void write_back_intra_pred_mode(H264Context *h)
00820 {
00821 int8_t *i4x4 = h->intra4x4_pred_mode + h->mb2br_xy[h->mb_xy];
00822 int8_t *i4x4_cache = h->intra4x4_pred_mode_cache;
00823
00824 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
00825 i4x4[4] = i4x4_cache[7 + 8 * 3];
00826 i4x4[5] = i4x4_cache[7 + 8 * 2];
00827 i4x4[6] = i4x4_cache[7 + 8 * 1];
00828 }
00829
00830 static av_always_inline void write_back_non_zero_count(H264Context *h)
00831 {
00832 const int mb_xy = h->mb_xy;
00833 uint8_t *nnz = h->non_zero_count[mb_xy];
00834 uint8_t *nnz_cache = h->non_zero_count_cache;
00835
00836 AV_COPY32(&nnz[ 0], &nnz_cache[4 + 8 * 1]);
00837 AV_COPY32(&nnz[ 4], &nnz_cache[4 + 8 * 2]);
00838 AV_COPY32(&nnz[ 8], &nnz_cache[4 + 8 * 3]);
00839 AV_COPY32(&nnz[12], &nnz_cache[4 + 8 * 4]);
00840 AV_COPY32(&nnz[16], &nnz_cache[4 + 8 * 6]);
00841 AV_COPY32(&nnz[20], &nnz_cache[4 + 8 * 7]);
00842 AV_COPY32(&nnz[32], &nnz_cache[4 + 8 * 11]);
00843 AV_COPY32(&nnz[36], &nnz_cache[4 + 8 * 12]);
00844
00845 if (!h->s.chroma_y_shift) {
00846 AV_COPY32(&nnz[24], &nnz_cache[4 + 8 * 8]);
00847 AV_COPY32(&nnz[28], &nnz_cache[4 + 8 * 9]);
00848 AV_COPY32(&nnz[40], &nnz_cache[4 + 8 * 13]);
00849 AV_COPY32(&nnz[44], &nnz_cache[4 + 8 * 14]);
00850 }
00851 }
00852
00853 static av_always_inline void write_back_motion_list(H264Context *h,
00854 MpegEncContext *const s,
00855 int b_stride,
00856 int b_xy, int b8_xy,
00857 int mb_type, int list)
00858 {
00859 int16_t(*mv_dst)[2] = &s->current_picture.f.motion_val[list][b_xy];
00860 int16_t(*mv_src)[2] = &h->mv_cache[list][scan8[0]];
00861 AV_COPY128(mv_dst + 0 * b_stride, mv_src + 8 * 0);
00862 AV_COPY128(mv_dst + 1 * b_stride, mv_src + 8 * 1);
00863 AV_COPY128(mv_dst + 2 * b_stride, mv_src + 8 * 2);
00864 AV_COPY128(mv_dst + 3 * b_stride, mv_src + 8 * 3);
00865 if (CABAC) {
00866 uint8_t (*mvd_dst)[2] = &h->mvd_table[list][FMO ? 8 * h->mb_xy
00867 : h->mb2br_xy[h->mb_xy]];
00868 uint8_t(*mvd_src)[2] = &h->mvd_cache[list][scan8[0]];
00869 if (IS_SKIP(mb_type)) {
00870 AV_ZERO128(mvd_dst);
00871 } else {
00872 AV_COPY64(mvd_dst, mvd_src + 8 * 3);
00873 AV_COPY16(mvd_dst + 3 + 3, mvd_src + 3 + 8 * 0);
00874 AV_COPY16(mvd_dst + 3 + 2, mvd_src + 3 + 8 * 1);
00875 AV_COPY16(mvd_dst + 3 + 1, mvd_src + 3 + 8 * 2);
00876 }
00877 }
00878
00879 {
00880 int8_t *ref_index = &s->current_picture.f.ref_index[list][b8_xy];
00881 int8_t *ref_cache = h->ref_cache[list];
00882 ref_index[0 + 0 * 2] = ref_cache[scan8[0]];
00883 ref_index[1 + 0 * 2] = ref_cache[scan8[4]];
00884 ref_index[0 + 1 * 2] = ref_cache[scan8[8]];
00885 ref_index[1 + 1 * 2] = ref_cache[scan8[12]];
00886 }
00887 }
00888
00889 static av_always_inline void write_back_motion(H264Context *h, int mb_type)
00890 {
00891 MpegEncContext *const s = &h->s;
00892 const int b_stride = h->b_stride;
00893 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * h->b_stride;
00894 const int b8_xy = 4 * h->mb_xy;
00895
00896 if (USES_LIST(mb_type, 0)) {
00897 write_back_motion_list(h, s, b_stride, b_xy, b8_xy, mb_type, 0);
00898 } else {
00899 fill_rectangle(&s->current_picture.f.ref_index[0][b8_xy],
00900 2, 2, 2, (uint8_t)LIST_NOT_USED, 1);
00901 }
00902 if (USES_LIST(mb_type, 1))
00903 write_back_motion_list(h, s, b_stride, b_xy, b8_xy, mb_type, 1);
00904
00905 if (h->slice_type_nos == AV_PICTURE_TYPE_B && CABAC) {
00906 if (IS_8X8(mb_type)) {
00907 uint8_t *direct_table = &h->direct_table[4 * h->mb_xy];
00908 direct_table[1] = h->sub_mb_type[1] >> 1;
00909 direct_table[2] = h->sub_mb_type[2] >> 1;
00910 direct_table[3] = h->sub_mb_type[3] >> 1;
00911 }
00912 }
00913 }
00914
00915 static av_always_inline int get_dct8x8_allowed(H264Context *h)
00916 {
00917 if (h->sps.direct_8x8_inference_flag)
00918 return !(AV_RN64A(h->sub_mb_type) &
00919 ((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8) *
00920 0x0001000100010001ULL));
00921 else
00922 return !(AV_RN64A(h->sub_mb_type) &
00923 ((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8 | MB_TYPE_DIRECT2) *
00924 0x0001000100010001ULL));
00925 }
00926
00927 #endif