aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Gramner <gramner@twoorioles.com>2024-04-02 20:45:49 +0200
committerHenrik Gramner <gramner@twoorioles.com>2024-04-08 20:25:58 +0200
commit67fcf01bf2a47a9dc17460c7ac1547a311010468 (patch)
tree87eec85c4574fdbf5ebdc8b5538a2198c1d4db3d
parent17a2180a61469c9ebda04fc42eb86b0179059c32 (diff)
downloadlibdav1d-67fcf01bf2a47a9dc17460c7ac1547a311010468.tar.gz
decode: Simplify read_mv_residual()
-rw-r--r--src/decode.c80
1 files changed, 29 insertions, 51 deletions
diff --git a/src/decode.c b/src/decode.c
index f6d9104..7427c35 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -73,42 +73,29 @@ static void init_quant_tables(const Dav1dSequenceHeader *const seq_hdr,
}
}
-static int read_mv_component_diff(Dav1dTaskContext *const t,
+static int read_mv_component_diff(MsacContext *const msac,
CdfMvComponent *const mv_comp,
- const int have_fp)
+ const int mv_prec)
{
- Dav1dTileState *const ts = t->ts;
- const Dav1dFrameContext *const f = t->f;
- const int have_hp = f->frame_hdr->hp;
- const int sign = dav1d_msac_decode_bool_adapt(&ts->msac, mv_comp->sign);
- const int cl = dav1d_msac_decode_symbol_adapt16(&ts->msac,
- mv_comp->classes, 10);
- int up, fp, hp;
+ const int sign = dav1d_msac_decode_bool_adapt(msac, mv_comp->sign);
+ const int cl = dav1d_msac_decode_symbol_adapt16(msac, mv_comp->classes, 10);
+ int up, fp = 3, hp = 1;
if (!cl) {
- up = dav1d_msac_decode_bool_adapt(&ts->msac, mv_comp->class0);
- if (have_fp) {
- fp = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- mv_comp->class0_fp[up], 3);
- hp = have_hp ? dav1d_msac_decode_bool_adapt(&ts->msac,
- mv_comp->class0_hp) : 1;
- } else {
- fp = 3;
- hp = 1;
+ up = dav1d_msac_decode_bool_adapt(msac, mv_comp->class0);
+ if (mv_prec >= 0) { // !force_integer_mv
+ fp = dav1d_msac_decode_symbol_adapt4(msac, mv_comp->class0_fp[up], 3);
+ if (mv_prec > 0) // allow_high_precision_mv
+ hp = dav1d_msac_decode_bool_adapt(msac, mv_comp->class0_hp);
}
} else {
up = 1 << cl;
for (int n = 0; n < cl; n++)
- up |= dav1d_msac_decode_bool_adapt(&ts->msac,
- mv_comp->classN[n]) << n;
- if (have_fp) {
- fp = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- mv_comp->classN_fp, 3);
- hp = have_hp ? dav1d_msac_decode_bool_adapt(&ts->msac,
- mv_comp->classN_hp) : 1;
- } else {
- fp = 3;
- hp = 1;
+ up |= dav1d_msac_decode_bool_adapt(msac, mv_comp->classN[n]) << n;
+ if (mv_prec >= 0) { // !force_integer_mv
+ fp = dav1d_msac_decode_symbol_adapt4(msac, mv_comp->classN_fp, 3);
+ if (mv_prec > 0) // allow_high_precision_mv
+ hp = dav1d_msac_decode_bool_adapt(msac, mv_comp->classN_hp);
}
}
@@ -117,25 +104,16 @@ static int read_mv_component_diff(Dav1dTaskContext *const t,
return sign ? -diff : diff;
}
-static void read_mv_residual(Dav1dTaskContext *const t, mv *const ref_mv,
- CdfMvContext *const mv_cdf, const int have_fp)
+static void read_mv_residual(Dav1dTileState *const ts, mv *const ref_mv,
+ const int mv_prec)
{
- switch (dav1d_msac_decode_symbol_adapt4(&t->ts->msac, t->ts->cdf.mv.joint,
- N_MV_JOINTS - 1))
- {
- case MV_JOINT_HV:
- ref_mv->y += read_mv_component_diff(t, &mv_cdf->comp[0], have_fp);
- ref_mv->x += read_mv_component_diff(t, &mv_cdf->comp[1], have_fp);
- break;
- case MV_JOINT_H:
- ref_mv->x += read_mv_component_diff(t, &mv_cdf->comp[1], have_fp);
- break;
- case MV_JOINT_V:
- ref_mv->y += read_mv_component_diff(t, &mv_cdf->comp[0], have_fp);
- break;
- default:
- break;
- }
+ MsacContext *const msac = &ts->msac;
+ const enum MVJoint mv_joint =
+ dav1d_msac_decode_symbol_adapt4(msac, ts->cdf.mv.joint, N_MV_JOINTS - 1);
+ if (mv_joint & MV_JOINT_V)
+ ref_mv->y += read_mv_component_diff(msac, &ts->cdf.mv.comp[0], mv_prec);
+ if (mv_joint & MV_JOINT_H)
+ ref_mv->x += read_mv_component_diff(msac, &ts->cdf.mv.comp[1], mv_prec);
}
static void read_tx_tree(Dav1dTaskContext *const t,
@@ -1323,7 +1301,7 @@ static int decode_b(Dav1dTaskContext *const t,
}
const union mv ref = b->mv[0];
- read_mv_residual(t, &b->mv[0], &ts->cdf.mv, 0);
+ read_mv_residual(ts, &b->mv[0], -1);
// clip intrabc motion vector to decoded parts of current tile
int border_left = ts->tiling.col_start * 4;
@@ -1585,8 +1563,8 @@ static int decode_b(Dav1dTaskContext *const t,
break; \
case NEWMV: \
b->mv[idx] = mvstack[b->drl_idx].mv.mv[idx]; \
- read_mv_residual(t, &b->mv[idx], &ts->cdf.mv, \
- !f->frame_hdr->force_integer_mv); \
+ const int mv_prec = f->frame_hdr->hp - f->frame_hdr->force_integer_mv; \
+ read_mv_residual(ts, &b->mv[idx], mv_prec); \
break; \
}
has_subpel_filter = imin(bw4, bh4) == 1 ||
@@ -1774,8 +1752,8 @@ static int decode_b(Dav1dTaskContext *const t,
if (DEBUG_BLOCK_INFO)
printf("Post-intermode[%d,drl=%d]: r=%d\n",
b->inter_mode, b->drl_idx, ts->msac.rng);
- read_mv_residual(t, &b->mv[0], &ts->cdf.mv,
- !f->frame_hdr->force_integer_mv);
+ const int mv_prec = f->frame_hdr->hp - f->frame_hdr->force_integer_mv;
+ read_mv_residual(ts, &b->mv[0], mv_prec);
if (DEBUG_BLOCK_INFO)
printf("Post-residualmv[mv=y:%d,x:%d]: r=%d\n",
b->mv[0].y, b->mv[0].x, ts->msac.rng);