Lines Matching refs:sl
38 static int get_scale_factor(H264SliceContext *sl, in get_scale_factor() argument
41 int poc0 = sl->ref_list[0][i].poc; in get_scale_factor()
46 avpriv_request_sample(sl->h264->avctx, "pocdiff overflow"); in get_scale_factor()
48 if (td == 0 || sl->ref_list[0][i].parent->long_ref) { in get_scale_factor()
56 av_log(sl->h264->avctx, AV_LOG_DEBUG, "pocdiff0 overflow\n"); in get_scale_factor()
63 H264SliceContext *sl) in ff_h264_direct_dist_scale_factor() argument
67 const int poc1 = sl->ref_list[1][0].poc; in ff_h264_direct_dist_scale_factor()
73 const int poc1 = sl->ref_list[1][0].parent->field_poc[field]; in ff_h264_direct_dist_scale_factor()
74 for (i = 0; i < 2 * sl->ref_count[0]; i++) in ff_h264_direct_dist_scale_factor()
75 sl->dist_scale_factor_field[field][i ^ field] = in ff_h264_direct_dist_scale_factor()
76 get_scale_factor(sl, poc, poc1, i + 16); in ff_h264_direct_dist_scale_factor()
79 for (i = 0; i < sl->ref_count[0]; i++) in ff_h264_direct_dist_scale_factor()
80 sl->dist_scale_factor[i] = get_scale_factor(sl, poc, poc1, i); in ff_h264_direct_dist_scale_factor()
83 static void fill_colmap(const H264Context *h, H264SliceContext *sl, in fill_colmap() argument
87 H264Picture *const ref1 = sl->ref_list[1][0].parent; in fill_colmap()
90 int end = mbafi ? 16 + 2 * sl->ref_count[0] : sl->ref_count[0]; in fill_colmap()
107 if (4 * sl->ref_list[0][j].parent->frame_num + in fill_colmap()
108 (sl->ref_list[0][j].reference & 3) == poc) { in fill_colmap()
121 void ff_h264_direct_ref_list_init(const H264Context *const h, H264SliceContext *sl) in ff_h264_direct_ref_list_init() argument
123 H264Ref *const ref1 = &sl->ref_list[1][0]; in ff_h264_direct_ref_list_init()
129 for (list = 0; list < sl->list_count; list++) { in ff_h264_direct_ref_list_init()
130 cur->ref_count[sidx][list] = sl->ref_count[list]; in ff_h264_direct_ref_list_init()
131 for (j = 0; j < sl->ref_count[list]; j++) in ff_h264_direct_ref_list_init()
132 cur->ref_poc[sidx][list][j] = 4 * sl->ref_list[list][j].parent->frame_num + in ff_h264_direct_ref_list_init()
133 (sl->ref_list[list][j].reference & 3); in ff_h264_direct_ref_list_init()
147 sl->col_fieldoff = 0; in ff_h264_direct_ref_list_init()
149 if (sl->list_count != 2 || !sl->ref_count[1]) in ff_h264_direct_ref_list_init()
154 int *col_poc = sl->ref_list[1][0].parent->field_poc; in ff_h264_direct_ref_list_init()
157 sl->col_parity = 1; in ff_h264_direct_ref_list_init()
159 sl->col_parity = (FFABS(col_poc[0] - (int64_t)cur_poc) >= in ff_h264_direct_ref_list_init()
162 sidx = sl->col_parity; in ff_h264_direct_ref_list_init()
164 } else if (!(h->picture_structure & sl->ref_list[1][0].reference) && in ff_h264_direct_ref_list_init()
165 !sl->ref_list[1][0].parent->mbaff) { in ff_h264_direct_ref_list_init()
166 sl->col_fieldoff = 2 * sl->ref_list[1][0].reference - 3; in ff_h264_direct_ref_list_init()
169 if (sl->slice_type_nos != AV_PICTURE_TYPE_B || sl->direct_spatial_mv_pred) in ff_h264_direct_ref_list_init()
173 fill_colmap(h, sl, sl->map_col_to_list0, list, sidx, ref1sidx, 0); in ff_h264_direct_ref_list_init()
176 fill_colmap(h, sl, sl->map_col_to_list0_field[field], list, field, in ff_h264_direct_ref_list_init()
200 static void pred_spatial_direct_motion(const H264Context *const h, H264SliceContext *sl, in pred_spatial_direct_motion() argument
205 int mb_xy = sl->mb_xy, mb_y = sl->mb_y; in pred_spatial_direct_motion()
216 assert(sl->ref_list[1][0].reference & 3); in pred_spatial_direct_motion()
218 await_reference_mb_row(h, &sl->ref_list[1][0], in pred_spatial_direct_motion()
219 sl->mb_y + !!IS_INTERLACED(*mb_type)); in pred_spatial_direct_motion()
226 int left_ref = sl->ref_cache[list][scan8[0] - 1]; in pred_spatial_direct_motion()
227 int top_ref = sl->ref_cache[list][scan8[0] - 8]; in pred_spatial_direct_motion()
228 int refc = sl->ref_cache[list][scan8[0] - 8 + 4]; in pred_spatial_direct_motion()
229 const int16_t *C = sl->mv_cache[list][scan8[0] - 8 + 4]; in pred_spatial_direct_motion()
231 refc = sl->ref_cache[list][scan8[0] - 8 - 1]; in pred_spatial_direct_motion()
232 C = sl->mv_cache[list][scan8[0] - 8 - 1]; in pred_spatial_direct_motion()
240 const int16_t *const A = sl->mv_cache[list][scan8[0] - 1]; in pred_spatial_direct_motion()
241 const int16_t *const B = sl->mv_cache[list][scan8[0] - 8]; in pred_spatial_direct_motion()
259 av_assert2(ref[list] < (sl->ref_count[list] << !!FRAME_MBAFF(h))); in pred_spatial_direct_motion()
277 fill_rectangle(&sl->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1); in pred_spatial_direct_motion()
278 fill_rectangle(&sl->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1); in pred_spatial_direct_motion()
279 fill_rectangle(&sl->mv_cache[0][scan8[0]], 4, 4, 8, 0, 4); in pred_spatial_direct_motion()
280 fill_rectangle(&sl->mv_cache[1][scan8[0]], 4, 4, 8, 0, 4); in pred_spatial_direct_motion()
287 if (IS_INTERLACED(sl->ref_list[1][0].parent->mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL in pred_spatial_direct_motion()
289 mb_y = (sl->mb_y & ~1) + sl->col_parity; in pred_spatial_direct_motion()
290 mb_xy = sl->mb_x + in pred_spatial_direct_motion()
291 ((sl->mb_y & ~1) + sl->col_parity) * h->mb_stride; in pred_spatial_direct_motion()
294 mb_y += sl->col_fieldoff; in pred_spatial_direct_motion()
295 mb_xy += h->mb_stride * sl->col_fieldoff; // non-zero for FL -> FL & differ parity in pred_spatial_direct_motion()
300 mb_y = sl->mb_y & ~1; in pred_spatial_direct_motion()
301 mb_xy = (sl->mb_y & ~1) * h->mb_stride + sl->mb_x; in pred_spatial_direct_motion()
302 mb_type_col[0] = sl->ref_list[1][0].parent->mb_type[mb_xy]; in pred_spatial_direct_motion()
303 mb_type_col[1] = sl->ref_list[1][0].parent->mb_type[mb_xy + h->mb_stride]; in pred_spatial_direct_motion()
323 mb_type_col[1] = sl->ref_list[1][0].parent->mb_type[mb_xy]; in pred_spatial_direct_motion()
343 await_reference_mb_row(h, &sl->ref_list[1][0], mb_y); in pred_spatial_direct_motion()
345 l1mv0 = (void*)&sl->ref_list[1][0].parent->motion_val[0][h->mb2b_xy[mb_xy]]; in pred_spatial_direct_motion()
346 l1mv1 = (void*)&sl->ref_list[1][0].parent->motion_val[1][h->mb2b_xy[mb_xy]]; in pred_spatial_direct_motion()
347 l1ref0 = &sl->ref_list[1][0].parent->ref_index[0][4 * mb_xy]; in pred_spatial_direct_motion()
348 l1ref1 = &sl->ref_list[1][0].parent->ref_index[1][4 * mb_xy]; in pred_spatial_direct_motion()
350 if (sl->mb_y & 1) { in pred_spatial_direct_motion()
367 if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8])) in pred_spatial_direct_motion()
369 sl->sub_mb_type[i8] = sub_mb_type; in pred_spatial_direct_motion()
371 fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, in pred_spatial_direct_motion()
373 fill_rectangle(&sl->ref_cache[1][scan8[i8 * 4]], 2, 2, 8, in pred_spatial_direct_motion()
375 if (!IS_INTRA(mb_type_col[y8]) && !sl->ref_list[1][0].parent->long_ref && in pred_spatial_direct_motion()
394 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, a, 4); in pred_spatial_direct_motion()
395 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, b, 4); in pred_spatial_direct_motion()
404 fill_rectangle(&sl->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1); in pred_spatial_direct_motion()
405 fill_rectangle(&sl->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1); in pred_spatial_direct_motion()
406 if (!IS_INTRA(mb_type_col[0]) && !sl->ref_list[1][0].parent->long_ref && in pred_spatial_direct_motion()
423 fill_rectangle(&sl->mv_cache[0][scan8[0]], 4, 4, 8, a, 4); in pred_spatial_direct_motion()
424 fill_rectangle(&sl->mv_cache[1][scan8[0]], 4, 4, 8, b, 4); in pred_spatial_direct_motion()
431 if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8])) in pred_spatial_direct_motion()
433 sl->sub_mb_type[i8] = sub_mb_type; in pred_spatial_direct_motion()
435 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, mv[0], 4); in pred_spatial_direct_motion()
436 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, mv[1], 4); in pred_spatial_direct_motion()
437 fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, in pred_spatial_direct_motion()
439 fill_rectangle(&sl->ref_cache[1][scan8[i8 * 4]], 2, 2, 8, in pred_spatial_direct_motion()
444 if (!IS_INTRA(mb_type_col[0]) && !sl->ref_list[1][0].parent->long_ref && in pred_spatial_direct_motion()
454 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, in pred_spatial_direct_motion()
457 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, in pred_spatial_direct_motion()
468 AV_ZERO32(sl->mv_cache[0][scan8[i8 * 4 + i4]]); in pred_spatial_direct_motion()
470 AV_ZERO32(sl->mv_cache[1][scan8[i8 * 4 + i4]]); in pred_spatial_direct_motion()
475 sl->sub_mb_type[i8] += MB_TYPE_16x16 - MB_TYPE_8x8; in pred_spatial_direct_motion()
487 static void pred_temp_direct_motion(const H264Context *const h, H264SliceContext *sl, in pred_temp_direct_motion() argument
492 int mb_xy = sl->mb_xy, mb_y = sl->mb_y; in pred_temp_direct_motion()
500 assert(sl->ref_list[1][0].reference & 3); in pred_temp_direct_motion()
502 await_reference_mb_row(h, &sl->ref_list[1][0], in pred_temp_direct_motion()
503 sl->mb_y + !!IS_INTERLACED(*mb_type)); in pred_temp_direct_motion()
505 if (IS_INTERLACED(sl->ref_list[1][0].parent->mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL in pred_temp_direct_motion()
507 mb_y = (sl->mb_y & ~1) + sl->col_parity; in pred_temp_direct_motion()
508 mb_xy = sl->mb_x + in pred_temp_direct_motion()
509 ((sl->mb_y & ~1) + sl->col_parity) * h->mb_stride; in pred_temp_direct_motion()
512 mb_y += sl->col_fieldoff; in pred_temp_direct_motion()
513 mb_xy += h->mb_stride * sl->col_fieldoff; // non-zero for FL -> FL & differ parity in pred_temp_direct_motion()
518 mb_y = sl->mb_y & ~1; in pred_temp_direct_motion()
519 mb_xy = sl->mb_x + (sl->mb_y & ~1) * h->mb_stride; in pred_temp_direct_motion()
520 mb_type_col[0] = sl->ref_list[1][0].parent->mb_type[mb_xy]; in pred_temp_direct_motion()
521 mb_type_col[1] = sl->ref_list[1][0].parent->mb_type[mb_xy + h->mb_stride]; in pred_temp_direct_motion()
544 mb_type_col[1] = sl->ref_list[1][0].parent->mb_type[mb_xy]; in pred_temp_direct_motion()
567 await_reference_mb_row(h, &sl->ref_list[1][0], mb_y); in pred_temp_direct_motion()
569 l1mv0 = (void*)&sl->ref_list[1][0].parent->motion_val[0][h->mb2b_xy[mb_xy]]; in pred_temp_direct_motion()
570 l1mv1 = (void*)&sl->ref_list[1][0].parent->motion_val[1][h->mb2b_xy[mb_xy]]; in pred_temp_direct_motion()
571 l1ref0 = &sl->ref_list[1][0].parent->ref_index[0][4 * mb_xy]; in pred_temp_direct_motion()
572 l1ref1 = &sl->ref_list[1][0].parent->ref_index[1][4 * mb_xy]; in pred_temp_direct_motion()
574 if (sl->mb_y & 1) { in pred_temp_direct_motion()
583 const int *map_col_to_list0[2] = { sl->map_col_to_list0[0], in pred_temp_direct_motion()
584 sl->map_col_to_list0[1] }; in pred_temp_direct_motion()
585 const int *dist_scale_factor = sl->dist_scale_factor; in pred_temp_direct_motion()
589 map_col_to_list0[0] = sl->map_col_to_list0_field[sl->mb_y & 1][0]; in pred_temp_direct_motion()
590 map_col_to_list0[1] = sl->map_col_to_list0_field[sl->mb_y & 1][1]; in pred_temp_direct_motion()
591 dist_scale_factor = sl->dist_scale_factor_field[sl->mb_y & 1]; in pred_temp_direct_motion()
593 ref_offset = (sl->ref_list[1][0].parent->mbaff << 4) & (mb_type_col[0] >> 3); in pred_temp_direct_motion()
605 if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8])) in pred_temp_direct_motion()
607 sl->sub_mb_type[i8] = sub_mb_type; in pred_temp_direct_motion()
609 fill_rectangle(&sl->ref_cache[1][scan8[i8 * 4]], 2, 2, 8, 0, 1); in pred_temp_direct_motion()
611 fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, 0, 1); in pred_temp_direct_motion()
612 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, 0, 4); in pred_temp_direct_motion()
613 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, 0, 4); in pred_temp_direct_motion()
626 fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, in pred_temp_direct_motion()
634 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, in pred_temp_direct_motion()
636 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, in pred_temp_direct_motion()
648 fill_rectangle(&sl->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1); in pred_temp_direct_motion()
663 fill_rectangle(&sl->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1); in pred_temp_direct_motion()
664 fill_rectangle(&sl->mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4); in pred_temp_direct_motion()
665 fill_rectangle(&sl->mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4); in pred_temp_direct_motion()
673 if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8])) in pred_temp_direct_motion()
675 sl->sub_mb_type[i8] = sub_mb_type; in pred_temp_direct_motion()
676 fill_rectangle(&sl->ref_cache[1][scan8[i8 * 4]], 2, 2, 8, 0, 1); in pred_temp_direct_motion()
678 fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, 0, 1); in pred_temp_direct_motion()
679 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, 0, 4); in pred_temp_direct_motion()
680 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, 0, 4); in pred_temp_direct_motion()
694 fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, in pred_temp_direct_motion()
700 fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, in pred_temp_direct_motion()
702 fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, in pred_temp_direct_motion()
708 int16_t *mv_l0 = sl->mv_cache[0][scan8[i8 * 4 + i4]]; in pred_temp_direct_motion()
711 AV_WN32A(sl->mv_cache[1][scan8[i8 * 4 + i4]], in pred_temp_direct_motion()
721 void ff_h264_pred_direct_motion(const H264Context *const h, H264SliceContext *sl, in ff_h264_pred_direct_motion() argument
724 if (sl->direct_spatial_mv_pred) in ff_h264_pred_direct_motion()
725 pred_spatial_direct_motion(h, sl, mb_type); in ff_h264_pred_direct_motion()
727 pred_temp_direct_motion(h, sl, mb_type); in ff_h264_pred_direct_motion()