ref: da97ba3fb1aba089f814918691296b08a7e7a663
parent: 9923967842794c2af3b3991ff97a16bef5e2197e
author: Luc Trudeau <ltrudeau@twoorioles.com>
date: Wed Oct 3 12:11:12 EDT 2018
Move delta_lf inside delta_q check
--- a/src/decode.c
+++ b/src/decode.c
@@ -852,6 +852,10 @@
const int prev_qidx = ts->last_qidx;
const int have_delta_q = f->frame_hdr.delta.q.present &&
(bs != (f->seq_hdr.sb128 ? BS_128x128 : BS_64x64) || !b->skip);
+
+ int8_t prev_delta_lf[4];
+ memcpy(prev_delta_lf, ts->last_delta_lf, 4);
+
if (have_delta_q) {
int delta_q = msac_decode_symbol_adapt(&ts->msac, ts->cdf.m.delta_q, 4);
if (delta_q == 3) {
@@ -866,6 +870,32 @@
if (have_delta_q && DEBUG_BLOCK_INFO)
printf("Post-delta_q[%d->%d]: r=%d\n",
delta_q, ts->last_qidx, ts->msac.rng);
+
+ if (f->frame_hdr.delta.lf.present) {
+ const int n_lfs = f->frame_hdr.delta.lf.multi ?
+ f->seq_hdr.layout != DAV1D_PIXEL_LAYOUT_I400 ? 4 : 2 : 1;
+
+ for (int i = 0; i < n_lfs; i++) {
+ int delta_lf =
+ msac_decode_symbol_adapt(&ts->msac,
+ ts->cdf.m.delta_lf[i + f->frame_hdr.delta.lf.multi], 4);
+ if (delta_lf == 3) {
+ const int n_bits = 1 + msac_decode_bools(&ts->msac, 3);
+ delta_lf = msac_decode_bools(&ts->msac, n_bits) +
+ 1 + (1 << n_bits);
+ }
+ if (delta_lf) {
+ if (msac_decode_bool(&ts->msac, 128 << 7))
+ delta_lf = -delta_lf;
+ delta_lf *= 1 << f->frame_hdr.delta.lf.res_log2;
+ }
+ ts->last_delta_lf[i] =
+ iclip(ts->last_delta_lf[i] + delta_lf, -63, 63);
+ if (have_delta_q && DEBUG_BLOCK_INFO)
+ printf("Post-delta_lf[%d:%d]: r=%d\n", i, delta_lf,
+ ts->msac.rng);
+ }
+ }
}
if (ts->last_qidx == f->frame_hdr.quant.yac) {
// assign frame-wide q values to this sb
@@ -874,30 +904,6 @@
// find sb-specific quant parameters
init_quant_tables(&f->seq_hdr, &f->frame_hdr, ts->last_qidx, ts->dqmem);
ts->dq = ts->dqmem;
- }
-
- // delta_lf
- int8_t prev_delta_lf[4];
- memcpy(prev_delta_lf, ts->last_delta_lf, 4);
- if (have_delta_q && f->frame_hdr.delta.lf.present) {
- const int n_lfs = f->frame_hdr.delta.lf.multi ?
- f->seq_hdr.layout != DAV1D_PIXEL_LAYOUT_I400 ? 4 : 2 : 1;
-
- for (int i = 0; i < n_lfs; i++) {
- int delta_lf = msac_decode_symbol_adapt(&ts->msac,
- ts->cdf.m.delta_lf[i + f->frame_hdr.delta.lf.multi], 4);
- if (delta_lf == 3) {
- const int n_bits = 1 + msac_decode_bools(&ts->msac, 3);
- delta_lf = msac_decode_bools(&ts->msac, n_bits) + 1 + (1 << n_bits);
- }
- if (delta_lf) {
- if (msac_decode_bool(&ts->msac, 128 << 7)) delta_lf = -delta_lf;
- delta_lf *= 1 << f->frame_hdr.delta.lf.res_log2;
- }
- ts->last_delta_lf[i] = iclip(ts->last_delta_lf[i] + delta_lf, -63, 63);
- if (have_delta_q && DEBUG_BLOCK_INFO)
- printf("Post-delta_lf[%d:%d]: r=%d\n", i, delta_lf, ts->msac.rng);
- }
}
if (!memcmp(ts->last_delta_lf, (int8_t[4]) { 0, 0, 0, 0 }, 4)) {
// assign frame-wide lf values to this sb