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
00101 #define QP_MAX_NUM (51 + 6*6) // The maximum supported qp
00102
00103
00104 enum {
00105 NAL_SLICE = 1,
00106 NAL_DPA,
00107 NAL_DPB,
00108 NAL_DPC,
00109 NAL_IDR_SLICE,
00110 NAL_SEI,
00111 NAL_SPS,
00112 NAL_PPS,
00113 NAL_AUD,
00114 NAL_END_SEQUENCE,
00115 NAL_END_STREAM,
00116 NAL_FILLER_DATA,
00117 NAL_SPS_EXT,
00118 NAL_AUXILIARY_SLICE = 19
00119 };
00120
00124 typedef enum {
00125 SEI_BUFFERING_PERIOD = 0,
00126 SEI_TYPE_PIC_TIMING = 1,
00127 SEI_TYPE_USER_DATA_ITU_T_T35 = 4,
00128 SEI_TYPE_USER_DATA_UNREGISTERED = 5,
00129 SEI_TYPE_RECOVERY_POINT = 6
00130 } SEI_Type;
00131
00135 typedef enum {
00136 SEI_PIC_STRUCT_FRAME = 0,
00137 SEI_PIC_STRUCT_TOP_FIELD = 1,
00138 SEI_PIC_STRUCT_BOTTOM_FIELD = 2,
00139 SEI_PIC_STRUCT_TOP_BOTTOM = 3,
00140 SEI_PIC_STRUCT_BOTTOM_TOP = 4,
00141 SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5,
00142 SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6,
00143 SEI_PIC_STRUCT_FRAME_DOUBLING = 7,
00144 SEI_PIC_STRUCT_FRAME_TRIPLING = 8
00145 } SEI_PicStructType;
00146
00150 typedef struct SPS {
00151 int profile_idc;
00152 int level_idc;
00153 int chroma_format_idc;
00154 int transform_bypass;
00155 int log2_max_frame_num;
00156 int poc_type;
00157 int log2_max_poc_lsb;
00158 int delta_pic_order_always_zero_flag;
00159 int offset_for_non_ref_pic;
00160 int offset_for_top_to_bottom_field;
00161 int poc_cycle_length;
00162 int ref_frame_count;
00163 int gaps_in_frame_num_allowed_flag;
00164 int mb_width;
00165 int mb_height;
00166 int frame_mbs_only_flag;
00167 int mb_aff;
00168 int direct_8x8_inference_flag;
00169 int crop;
00170 unsigned int crop_left;
00171 unsigned int crop_right;
00172 unsigned int crop_top;
00173 unsigned int crop_bottom;
00174 int vui_parameters_present_flag;
00175 AVRational sar;
00176 int video_signal_type_present_flag;
00177 int full_range;
00178 int colour_description_present_flag;
00179 enum AVColorPrimaries color_primaries;
00180 enum AVColorTransferCharacteristic color_trc;
00181 enum AVColorSpace colorspace;
00182 int timing_info_present_flag;
00183 uint32_t num_units_in_tick;
00184 uint32_t time_scale;
00185 int fixed_frame_rate_flag;
00186 short offset_for_ref_frame[256];
00187 int bitstream_restriction_flag;
00188 int num_reorder_frames;
00189 int scaling_matrix_present;
00190 uint8_t scaling_matrix4[6][16];
00191 uint8_t scaling_matrix8[6][64];
00192 int nal_hrd_parameters_present_flag;
00193 int vcl_hrd_parameters_present_flag;
00194 int pic_struct_present_flag;
00195 int time_offset_length;
00196 int cpb_cnt;
00197 int initial_cpb_removal_delay_length;
00198 int cpb_removal_delay_length;
00199 int dpb_output_delay_length;
00200 int bit_depth_luma;
00201 int bit_depth_chroma;
00202 int residual_color_transform_flag;
00203 int constraint_set_flags;
00204 int new;
00205 } SPS;
00206
00210 typedef struct PPS {
00211 unsigned int sps_id;
00212 int cabac;
00213 int pic_order_present;
00214 int slice_group_count;
00215 int mb_slice_group_map_type;
00216 unsigned int ref_count[2];
00217 int weighted_pred;
00218 int weighted_bipred_idc;
00219 int init_qp;
00220 int init_qs;
00221 int chroma_qp_index_offset[2];
00222 int deblocking_filter_parameters_present;
00223 int constrained_intra_pred;
00224 int redundant_pic_cnt_present;
00225 int transform_8x8_mode;
00226 uint8_t scaling_matrix4[6][16];
00227 uint8_t scaling_matrix8[6][64];
00228 uint8_t chroma_qp_table[2][QP_MAX_NUM+1];
00229 int chroma_qp_diff;
00230 } PPS;
00231
00235 typedef enum MMCOOpcode {
00236 MMCO_END = 0,
00237 MMCO_SHORT2UNUSED,
00238 MMCO_LONG2UNUSED,
00239 MMCO_SHORT2LONG,
00240 MMCO_SET_MAX_LONG,
00241 MMCO_RESET,
00242 MMCO_LONG,
00243 } MMCOOpcode;
00244
00248 typedef struct MMCO {
00249 MMCOOpcode opcode;
00250 int short_pic_num;
00251 int long_arg;
00252 } MMCO;
00253
00257 typedef struct H264Context {
00258 MpegEncContext s;
00259 H264DSPContext h264dsp;
00260 int pixel_shift;
00261 int chroma_qp[2];
00262
00263 int qp_thresh;
00264
00265 int prev_mb_skipped;
00266 int next_mb_skipped;
00267
00268
00269 int chroma_pred_mode;
00270 int intra16x16_pred_mode;
00271
00272 int topleft_mb_xy;
00273 int top_mb_xy;
00274 int topright_mb_xy;
00275 int left_mb_xy[LEFT_MBS];
00276
00277 int topleft_type;
00278 int top_type;
00279 int topright_type;
00280 int left_type[LEFT_MBS];
00281
00282 const uint8_t *left_block;
00283 int topleft_partition;
00284
00285 int8_t intra4x4_pred_mode_cache[5 * 8];
00286 int8_t(*intra4x4_pred_mode);
00287 H264PredContext hpc;
00288 unsigned int topleft_samples_available;
00289 unsigned int top_samples_available;
00290 unsigned int topright_samples_available;
00291 unsigned int left_samples_available;
00292 uint8_t (*top_borders[2])[(16 * 3) * 2];
00293
00298 DECLARE_ALIGNED(8, uint8_t, non_zero_count_cache)[15 * 8];
00299
00300 uint8_t (*non_zero_count)[48];
00301
00305 DECLARE_ALIGNED(16, int16_t, mv_cache)[2][5 * 8][2];
00306 DECLARE_ALIGNED(8, int8_t, ref_cache)[2][5 * 8];
00307 #define LIST_NOT_USED -1 // FIXME rename?
00308 #define PART_NOT_AVAILABLE -2
00309
00313 int neighbor_transform_size;
00314
00319 int block_offset[2 * (16 * 3)];
00320
00321 uint32_t *mb2b_xy;
00322 uint32_t *mb2br_xy;
00323 int b_stride;
00324
00325 int mb_linesize;
00326 int mb_uvlinesize;
00327
00328 int emu_edge_width;
00329 int emu_edge_height;
00330
00331 unsigned current_sps_id;
00332 SPS sps;
00333
00337 PPS pps;
00338
00339 uint32_t dequant4_buffer[6][QP_MAX_NUM + 1][16];
00340 uint32_t dequant8_buffer[6][QP_MAX_NUM + 1][64];
00341 uint32_t(*dequant4_coeff[6])[16];
00342 uint32_t(*dequant8_coeff[6])[64];
00343
00344 int slice_num;
00345 uint16_t *slice_table;
00346 int slice_type;
00347 int slice_type_nos;
00348 int slice_type_fixed;
00349
00350
00351 int mb_aff_frame;
00352 int mb_field_decoding_flag;
00353 int mb_mbaff;
00354
00355 DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4];
00356
00357
00358 int use_weight;
00359 int use_weight_chroma;
00360 int luma_log2_weight_denom;
00361 int chroma_log2_weight_denom;
00362
00363 int luma_weight[48][2][2];
00364 int chroma_weight[48][2][2][2];
00365 int implicit_weight[48][48][2];
00366
00367 int direct_spatial_mv_pred;
00368 int col_parity;
00369 int col_fieldoff;
00370 int dist_scale_factor[16];
00371 int dist_scale_factor_field[2][32];
00372 int map_col_to_list0[2][16 + 32];
00373 int map_col_to_list0_field[2][2][16 + 32];
00374
00378 unsigned int ref_count[2];
00379 unsigned int list_count;
00380 uint8_t *list_counts;
00381 Picture ref_list[2][48];
00384 int ref2frm[MAX_SLICES][2][64];
00385
00386
00387 GetBitContext intra_gb;
00388 GetBitContext inter_gb;
00389 GetBitContext *intra_gb_ptr;
00390 GetBitContext *inter_gb_ptr;
00391
00392 DECLARE_ALIGNED(16, DCTELEM, mb)[16 * 48 * 2];
00393 DECLARE_ALIGNED(16, DCTELEM, mb_luma_dc)[3][16 * 2];
00394 DCTELEM mb_padding[256 * 2];
00395
00399 CABACContext cabac;
00400 uint8_t cabac_state[1024];
00401
00402
00403 uint16_t *cbp_table;
00404 int cbp;
00405 int top_cbp;
00406 int left_cbp;
00407
00408 uint8_t *chroma_pred_mode_table;
00409 int last_qscale_diff;
00410 uint8_t (*mvd_table[2])[2];
00411 DECLARE_ALIGNED(16, uint8_t, mvd_cache)[2][5 * 8][2];
00412 uint8_t *direct_table;
00413 uint8_t direct_cache[5 * 8];
00414
00415 uint8_t zigzag_scan[16];
00416 uint8_t zigzag_scan8x8[64];
00417 uint8_t zigzag_scan8x8_cavlc[64];
00418 uint8_t field_scan[16];
00419 uint8_t field_scan8x8[64];
00420 uint8_t field_scan8x8_cavlc[64];
00421 uint8_t zigzag_scan_q0[16];
00422 uint8_t zigzag_scan8x8_q0[64];
00423 uint8_t zigzag_scan8x8_cavlc_q0[64];
00424 uint8_t field_scan_q0[16];
00425 uint8_t field_scan8x8_q0[64];
00426 uint8_t field_scan8x8_cavlc_q0[64];
00427
00428 int x264_build;
00429
00430 int mb_xy;
00431
00432 int is_complex;
00433
00434
00435 int deblocking_filter;
00436 int slice_alpha_c0_offset;
00437 int slice_beta_offset;
00438
00439
00440
00441
00442 int nal_ref_idc;
00443 int nal_unit_type;
00444 uint8_t *rbsp_buffer[2];
00445 unsigned int rbsp_buffer_size[2];
00446 int decoding_extradata;
00447
00451 int is_avc;
00452 int nal_length_size;
00453 int got_first;
00454
00455 SPS *sps_buffers[MAX_SPS_COUNT];
00456 PPS *pps_buffers[MAX_PPS_COUNT];
00457
00458 int dequant_coeff_pps;
00459
00460 uint16_t *slice_table_base;
00461
00462
00463 int poc_lsb;
00464 int poc_msb;
00465 int delta_poc_bottom;
00466 int delta_poc[2];
00467 int frame_num;
00468 int prev_poc_msb;
00469 int prev_poc_lsb;
00470 int frame_num_offset;
00471 int prev_frame_num_offset;
00472 int prev_frame_num;
00473
00477 int curr_pic_num;
00478
00482 int max_pic_num;
00483
00484 int redundant_pic_count;
00485
00486 Picture *short_ref[32];
00487 Picture *long_ref[32];
00488 Picture default_ref_list[2][32];
00489 Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2];
00490 int last_pocs[MAX_DELAYED_PIC_COUNT];
00491 Picture *next_output_pic;
00492 int outputed_poc;
00493 int next_outputed_poc;
00494
00498 MMCO mmco[MAX_MMCO_COUNT];
00499 int mmco_index;
00500 int mmco_reset;
00501
00502 int long_ref_count;
00503 int short_ref_count;
00504
00505 int cabac_init_idc;
00506
00511 struct H264Context *thread_context[MAX_THREADS];
00512
00516 int current_slice;
00517
00524 int max_contexts;
00525
00530 int single_decode_warning;
00531
00532 int last_slice_type;
00538 SEI_PicStructType sei_pic_struct;
00539
00546 int prev_interlaced_frame;
00547
00553 int sei_ct_type;
00554
00558 int sei_dpb_output_delay;
00559
00563 int sei_cpb_removal_delay;
00564
00572 int sei_recovery_frame_cnt;
00579 int recovery_frame;
00580
00584 int valid_recovery_point;
00585
00586 int luma_weight_flag[2];
00587 int chroma_weight_flag[2];
00588
00589
00590 int sei_buffering_period_present;
00591 int initial_cpb_removal_delay[32];
00592
00593 int cur_chroma_format_idc;
00594 uint8_t *bipred_scratchpad;
00595
00596 int16_t slice_row[MAX_SLICES];
00597
00598 int sync;
00599
00600 uint8_t parse_history[4];
00601 int parse_history_count;
00602 int parse_last_mb;
00603 } H264Context;
00604
00605 extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1];
00606 extern const uint16_t ff_h264_mb_sizes[4];
00607
00611 int ff_h264_decode_sei(H264Context *h);
00612
00616 int ff_h264_decode_seq_parameter_set(H264Context *h);
00617
00621 int ff_h264_get_profile(SPS *sps);
00622
00626 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length);
00627
00636 const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
00637 int *dst_length, int *consumed, int length);
00638
00643 av_cold void ff_h264_free_context(H264Context *h);
00644
00648 int ff_h264_get_slice_type(const H264Context *h);
00649
00654 int ff_h264_alloc_tables(H264Context *h);
00655
00659 int ff_h264_fill_default_ref_list(H264Context *h);
00660
00661 int ff_h264_decode_ref_pic_list_reordering(H264Context *h);
00662 void ff_h264_fill_mbaff_ref_list(H264Context *h);
00663 void ff_h264_remove_all_refs(H264Context *h);
00664
00668 int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count);
00669
00670 int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb);
00671
00672 void ff_generate_sliding_window_mmcos(H264Context *h);
00673
00678 int ff_h264_check_intra4x4_pred_mode(H264Context *h);
00679
00684 int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma);
00685
00686 void ff_h264_hl_decode_mb(H264Context *h);
00687 int ff_h264_frame_start(H264Context *h);
00688 int ff_h264_decode_extradata(H264Context *h, const uint8_t *buf, int size);
00689 av_cold int ff_h264_decode_init(AVCodecContext *avctx);
00690 av_cold void ff_h264_decode_init_vlc(void);
00691
00696 int ff_h264_decode_mb_cavlc(H264Context *h);
00697
00702 int ff_h264_decode_mb_cabac(H264Context *h);
00703
00704 void ff_h264_init_cabac_states(H264Context *h);
00705
00706 void ff_h264_direct_dist_scale_factor(H264Context *const h);
00707 void ff_h264_direct_ref_list_init(H264Context *const h);
00708 void ff_h264_pred_direct_motion(H264Context *const h, int *mb_type);
00709
00710 void ff_h264_filter_mb_fast(H264Context *h, int mb_x, int mb_y,
00711 uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr,
00712 unsigned int linesize, unsigned int uvlinesize);
00713 void ff_h264_filter_mb(H264Context *h, int mb_x, int mb_y,
00714 uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr,
00715 unsigned int linesize, unsigned int uvlinesize);
00716
00722 void ff_h264_reset_sei(H264Context *h);
00723
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 #define LUMA_DC_BLOCK_INDEX 48
00755 #define CHROMA_DC_BLOCK_INDEX 49
00756
00757
00758 static const uint8_t scan8[16 * 3 + 3] = {
00759 4 + 1 * 8, 5 + 1 * 8, 4 + 2 * 8, 5 + 2 * 8,
00760 6 + 1 * 8, 7 + 1 * 8, 6 + 2 * 8, 7 + 2 * 8,
00761 4 + 3 * 8, 5 + 3 * 8, 4 + 4 * 8, 5 + 4 * 8,
00762 6 + 3 * 8, 7 + 3 * 8, 6 + 4 * 8, 7 + 4 * 8,
00763 4 + 6 * 8, 5 + 6 * 8, 4 + 7 * 8, 5 + 7 * 8,
00764 6 + 6 * 8, 7 + 6 * 8, 6 + 7 * 8, 7 + 7 * 8,
00765 4 + 8 * 8, 5 + 8 * 8, 4 + 9 * 8, 5 + 9 * 8,
00766 6 + 8 * 8, 7 + 8 * 8, 6 + 9 * 8, 7 + 9 * 8,
00767 4 + 11 * 8, 5 + 11 * 8, 4 + 12 * 8, 5 + 12 * 8,
00768 6 + 11 * 8, 7 + 11 * 8, 6 + 12 * 8, 7 + 12 * 8,
00769 4 + 13 * 8, 5 + 13 * 8, 4 + 14 * 8, 5 + 14 * 8,
00770 6 + 13 * 8, 7 + 13 * 8, 6 + 14 * 8, 7 + 14 * 8,
00771 0 + 0 * 8, 0 + 5 * 8, 0 + 10 * 8
00772 };
00773
00774 static av_always_inline uint32_t pack16to32(int a, int b)
00775 {
00776 #if HAVE_BIGENDIAN
00777 return (b & 0xFFFF) + (a << 16);
00778 #else
00779 return (a & 0xFFFF) + (b << 16);
00780 #endif
00781 }
00782
00783 static av_always_inline uint16_t pack8to16(int a, int b)
00784 {
00785 #if HAVE_BIGENDIAN
00786 return (b & 0xFF) + (a << 8);
00787 #else
00788 return (a & 0xFF) + (b << 8);
00789 #endif
00790 }
00791
00795 static av_always_inline int get_chroma_qp(H264Context *h, int t, int qscale)
00796 {
00797 return h->pps.chroma_qp_table[t][qscale];
00798 }
00799
00803 static av_always_inline int pred_intra_mode(H264Context *h, int n)
00804 {
00805 const int index8 = scan8[n];
00806 const int left = h->intra4x4_pred_mode_cache[index8 - 1];
00807 const int top = h->intra4x4_pred_mode_cache[index8 - 8];
00808 const int min = FFMIN(left, top);
00809
00810 tprintf(h->s.avctx, "mode:%d %d min:%d\n", left, top, min);
00811
00812 if (min < 0)
00813 return DC_PRED;
00814 else
00815 return min;
00816 }
00817
00818 static av_always_inline void write_back_intra_pred_mode(H264Context *h)
00819 {
00820 int8_t *i4x4 = h->intra4x4_pred_mode + h->mb2br_xy[h->mb_xy];
00821 int8_t *i4x4_cache = h->intra4x4_pred_mode_cache;
00822
00823 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
00824 i4x4[4] = i4x4_cache[7 + 8 * 3];
00825 i4x4[5] = i4x4_cache[7 + 8 * 2];
00826 i4x4[6] = i4x4_cache[7 + 8 * 1];
00827 }
00828
00829 static av_always_inline void write_back_non_zero_count(H264Context *h)
00830 {
00831 const int mb_xy = h->mb_xy;
00832 uint8_t *nnz = h->non_zero_count[mb_xy];
00833 uint8_t *nnz_cache = h->non_zero_count_cache;
00834
00835 AV_COPY32(&nnz[ 0], &nnz_cache[4 + 8 * 1]);
00836 AV_COPY32(&nnz[ 4], &nnz_cache[4 + 8 * 2]);
00837 AV_COPY32(&nnz[ 8], &nnz_cache[4 + 8 * 3]);
00838 AV_COPY32(&nnz[12], &nnz_cache[4 + 8 * 4]);
00839 AV_COPY32(&nnz[16], &nnz_cache[4 + 8 * 6]);
00840 AV_COPY32(&nnz[20], &nnz_cache[4 + 8 * 7]);
00841 AV_COPY32(&nnz[32], &nnz_cache[4 + 8 * 11]);
00842 AV_COPY32(&nnz[36], &nnz_cache[4 + 8 * 12]);
00843
00844 if (!h->s.chroma_y_shift) {
00845 AV_COPY32(&nnz[24], &nnz_cache[4 + 8 * 8]);
00846 AV_COPY32(&nnz[28], &nnz_cache[4 + 8 * 9]);
00847 AV_COPY32(&nnz[40], &nnz_cache[4 + 8 * 13]);
00848 AV_COPY32(&nnz[44], &nnz_cache[4 + 8 * 14]);
00849 }
00850 }
00851
00852 static av_always_inline void write_back_motion_list(H264Context *h,
00853 MpegEncContext *const s,
00854 int b_stride,
00855 int b_xy, int b8_xy,
00856 int mb_type, int list)
00857 {
00858 int16_t(*mv_dst)[2] = &s->current_picture.f.motion_val[list][b_xy];
00859 int16_t(*mv_src)[2] = &h->mv_cache[list][scan8[0]];
00860 AV_COPY128(mv_dst + 0 * b_stride, mv_src + 8 * 0);
00861 AV_COPY128(mv_dst + 1 * b_stride, mv_src + 8 * 1);
00862 AV_COPY128(mv_dst + 2 * b_stride, mv_src + 8 * 2);
00863 AV_COPY128(mv_dst + 3 * b_stride, mv_src + 8 * 3);
00864 if (CABAC) {
00865 uint8_t (*mvd_dst)[2] = &h->mvd_table[list][FMO ? 8 * h->mb_xy
00866 : h->mb2br_xy[h->mb_xy]];
00867 uint8_t(*mvd_src)[2] = &h->mvd_cache[list][scan8[0]];
00868 if (IS_SKIP(mb_type)) {
00869 AV_ZERO128(mvd_dst);
00870 } else {
00871 AV_COPY64(mvd_dst, mvd_src + 8 * 3);
00872 AV_COPY16(mvd_dst + 3 + 3, mvd_src + 3 + 8 * 0);
00873 AV_COPY16(mvd_dst + 3 + 2, mvd_src + 3 + 8 * 1);
00874 AV_COPY16(mvd_dst + 3 + 1, mvd_src + 3 + 8 * 2);
00875 }
00876 }
00877
00878 {
00879 int8_t *ref_index = &s->current_picture.f.ref_index[list][b8_xy];
00880 int8_t *ref_cache = h->ref_cache[list];
00881 ref_index[0 + 0 * 2] = ref_cache[scan8[0]];
00882 ref_index[1 + 0 * 2] = ref_cache[scan8[4]];
00883 ref_index[0 + 1 * 2] = ref_cache[scan8[8]];
00884 ref_index[1 + 1 * 2] = ref_cache[scan8[12]];
00885 }
00886 }
00887
00888 static av_always_inline void write_back_motion(H264Context *h, int mb_type)
00889 {
00890 MpegEncContext *const s = &h->s;
00891 const int b_stride = h->b_stride;
00892 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * h->b_stride;
00893 const int b8_xy = 4 * h->mb_xy;
00894
00895 if (USES_LIST(mb_type, 0)) {
00896 write_back_motion_list(h, s, b_stride, b_xy, b8_xy, mb_type, 0);
00897 } else {
00898 fill_rectangle(&s->current_picture.f.ref_index[0][b8_xy],
00899 2, 2, 2, (uint8_t)LIST_NOT_USED, 1);
00900 }
00901 if (USES_LIST(mb_type, 1))
00902 write_back_motion_list(h, s, b_stride, b_xy, b8_xy, mb_type, 1);
00903
00904 if (h->slice_type_nos == AV_PICTURE_TYPE_B && CABAC) {
00905 if (IS_8X8(mb_type)) {
00906 uint8_t *direct_table = &h->direct_table[4 * h->mb_xy];
00907 direct_table[1] = h->sub_mb_type[1] >> 1;
00908 direct_table[2] = h->sub_mb_type[2] >> 1;
00909 direct_table[3] = h->sub_mb_type[3] >> 1;
00910 }
00911 }
00912 }
00913
00914 static av_always_inline int get_dct8x8_allowed(H264Context *h)
00915 {
00916 if (h->sps.direct_8x8_inference_flag)
00917 return !(AV_RN64A(h->sub_mb_type) &
00918 ((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8) *
00919 0x0001000100010001ULL));
00920 else
00921 return !(AV_RN64A(h->sub_mb_type) &
00922 ((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8 | MB_TYPE_DIRECT2) *
00923 0x0001000100010001ULL));
00924 }
00925
00926 #endif