|
|
|
@ -1621,6 +1621,50 @@ static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref, |
|
|
|
|
ff_thread_await_progress(&ref->tf, y, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void hevc_luma_mv_mpv_mode(HEVCContext *s, int x0, int y0, int nPbW, |
|
|
|
|
int nPbH, int log2_cb_size, int part_idx, |
|
|
|
|
int merge_idx, MvField *mv) |
|
|
|
|
{ |
|
|
|
|
HEVCLocalContext *lc = &s->HEVClc; |
|
|
|
|
enum InterPredIdc inter_pred_idc = PRED_L0; |
|
|
|
|
int mvp_flag; |
|
|
|
|
|
|
|
|
|
ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH); |
|
|
|
|
if (s->sh.slice_type == B_SLICE) |
|
|
|
|
inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH); |
|
|
|
|
|
|
|
|
|
if (inter_pred_idc != PRED_L1) { |
|
|
|
|
if (s->sh.nb_refs[L0]) |
|
|
|
|
mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]); |
|
|
|
|
|
|
|
|
|
mv->pred_flag[0] = 1; |
|
|
|
|
hls_mvd_coding(s, x0, y0, 0); |
|
|
|
|
mvp_flag = ff_hevc_mvp_lx_flag_decode(s); |
|
|
|
|
ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, |
|
|
|
|
part_idx, merge_idx, mv, mvp_flag, 0); |
|
|
|
|
mv->mv[0].x += lc->pu.mvd.x; |
|
|
|
|
mv->mv[0].y += lc->pu.mvd.y; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (inter_pred_idc != PRED_L0) { |
|
|
|
|
if (s->sh.nb_refs[L1]) |
|
|
|
|
mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]); |
|
|
|
|
|
|
|
|
|
if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) { |
|
|
|
|
AV_ZERO32(&lc->pu.mvd); |
|
|
|
|
} else { |
|
|
|
|
hls_mvd_coding(s, x0, y0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mv->pred_flag[1] = 1; |
|
|
|
|
mvp_flag = ff_hevc_mvp_lx_flag_decode(s); |
|
|
|
|
ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, |
|
|
|
|
part_idx, merge_idx, mv, mvp_flag, 1); |
|
|
|
|
mv->mv[1].x += lc->pu.mvd.x; |
|
|
|
|
mv->mv[1].y += lc->pu.mvd.y; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void hls_prediction_unit(HEVCContext *s, int x0, int y0, |
|
|
|
|
int nPbW, int nPbH, |
|
|
|
|
int log2_cb_size, int partIdx) |
|
|
|
@ -1664,46 +1708,8 @@ static void hls_prediction_unit(HEVCContext *s, int x0, int y0, |
|
|
|
|
ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, |
|
|
|
|
partIdx, merge_idx, ¤t_mv); |
|
|
|
|
} else { |
|
|
|
|
enum InterPredIdc inter_pred_idc = PRED_L0; |
|
|
|
|
int mvp_flag; |
|
|
|
|
|
|
|
|
|
ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH); |
|
|
|
|
if (s->sh.slice_type == B_SLICE) |
|
|
|
|
inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH); |
|
|
|
|
|
|
|
|
|
if (inter_pred_idc != PRED_L1) { |
|
|
|
|
if (s->sh.nb_refs[L0]) { |
|
|
|
|
current_mv.ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]); |
|
|
|
|
} |
|
|
|
|
current_mv.pred_flag[0] = 1; |
|
|
|
|
hls_mvd_coding(s, x0, y0, 0); |
|
|
|
|
mvp_flag = ff_hevc_mvp_lx_flag_decode(s); |
|
|
|
|
ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, |
|
|
|
|
partIdx, merge_idx, ¤t_mv, |
|
|
|
|
mvp_flag, 0); |
|
|
|
|
current_mv.mv[0].x += lc->pu.mvd.x; |
|
|
|
|
current_mv.mv[0].y += lc->pu.mvd.y; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (inter_pred_idc != PRED_L0) { |
|
|
|
|
if (s->sh.nb_refs[L1]) { |
|
|
|
|
current_mv.ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) { |
|
|
|
|
AV_ZERO32(&lc->pu.mvd); |
|
|
|
|
} else { |
|
|
|
|
hls_mvd_coding(s, x0, y0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
current_mv.pred_flag[1] = 1; |
|
|
|
|
mvp_flag = ff_hevc_mvp_lx_flag_decode(s); |
|
|
|
|
ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, |
|
|
|
|
partIdx, merge_idx, ¤t_mv, |
|
|
|
|
mvp_flag, 1); |
|
|
|
|
current_mv.mv[1].x += lc->pu.mvd.x; |
|
|
|
|
current_mv.mv[1].y += lc->pu.mvd.y; |
|
|
|
|
} |
|
|
|
|
hevc_luma_mv_mpv_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, |
|
|
|
|
partIdx, merge_idx, ¤t_mv); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
x_pu = x0 >> s->sps->log2_min_pu_size; |
|
|
|
|