ref: 42ea146f847d761b91d66d4db2c5a6341fefee75
parent: ad0c04126e32413807a24c1e0002b168d09b751a
author: Luc Trudeau <ltrudeau@twoorioles.com>
date: Mon Jul 29 08:12:44 EDT 2019
decode_coefs reuse lossless variable
--- a/src/env.h
+++ b/src/env.h
@@ -118,22 +118,10 @@
return out;
}
-static inline enum TxfmTypeSet get_ext_txtp_set(const enum RectTxfmSize tx,
+static inline enum TxfmTypeSet get_ext_txtp_set(const TxfmInfo *const t_dim,
const int inter,
- const Dav1dFrameHeader *const hdr,
- const int seg_id)
+ const int reduced_txtp_set)
{
- if (!hdr->segmentation.qidx[seg_id]) {
- if (hdr->segmentation.lossless[seg_id]) {
- assert(tx == (int) TX_4X4);
- return TXTP_SET_LOSSLESS;
- } else {
- return TXTP_SET_DCT;
- }
- }
-
- const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[tx];
-
if (t_dim->max >= TX_64X64)
return TXTP_SET_DCT;
@@ -140,7 +128,7 @@
if (t_dim->max == TX_32X32)
return inter ? TXTP_SET_DCT_ID : TXTP_SET_DCT;
- if (hdr->reduced_txtp_set)
+ if (reduced_txtp_set)
return inter ? TXTP_SET_DCT_ID : TXTP_SET_DT4_ID;
const enum TxfmSize txsqsz = t_dim->min;
@@ -151,31 +139,9 @@
return txsqsz == TX_16X16 ? TXTP_SET_DT4_ID : TXTP_SET_DT4_ID_1D;
}
-static inline enum TxfmType get_uv_intra_txtp(const enum IntraPredMode uv_mode,
- const enum RectTxfmSize tx,
- const Dav1dFrameHeader *const hdr,
- const int seg_id)
-{
- if (hdr->segmentation.lossless[seg_id]) {
- assert(tx == (int) TX_4X4);
- return WHT_WHT;
- }
-
- const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[tx];
-
- return t_dim->max == TX_32X32 ? DCT_DCT : dav1d_txtp_from_uvmode[uv_mode];
-}
-
static inline enum TxfmType get_uv_inter_txtp(const TxfmInfo *const uvt_dim,
- const enum TxfmType ytxtp,
- const Dav1dFrameHeader *const hdr,
- const int seg_id)
+ const enum TxfmType ytxtp)
{
- if (hdr->segmentation.lossless[seg_id]) {
- assert(uvt_dim->max == TX_4X4);
- return WHT_WHT;
- }
-
if (uvt_dim->max == TX_32X32)
return ytxtp == IDTX ? IDTX : DCT_DCT;
if (uvt_dim->min == TX_16X16 &&
--- a/src/recon_tmpl.c
+++ b/src/recon_tmpl.c
@@ -66,6 +66,7 @@
Dav1dTileState *const ts = t->ts;
const int chroma = !!plane;
const Dav1dFrameContext *const f = t->f;
+ const int lossless = f->frame_hdr->segmentation.lossless[b->seg_id];
const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[tx];
const int dbg = DEBUG_BLOCK_INFO && plane && 0;
@@ -81,41 +82,48 @@
t_dim->ctx, sctx, all_skip, ts->msac.rng);
if (all_skip) {
*res_ctx = 0x40;
- *txtp = f->frame_hdr->segmentation.lossless[b->seg_id] ? WHT_WHT : DCT_DCT;
+ *txtp = lossless ? WHT_WHT : DCT_DCT;
return -1;
}
// transform type (chroma: derived, luma: explicitly coded)
- if (chroma) {
+ if (lossless) {
+ assert(t_dim->max == (int) TX_4X4);
+ *txtp = WHT_WHT;
+ } else if (chroma) {
if (intra) {
- *txtp = get_uv_intra_txtp(b->uv_mode, tx, f->frame_hdr, b->seg_id);
+ *txtp = t_dim->max == TX_32X32 ?
+ DCT_DCT : dav1d_txtp_from_uvmode[b->uv_mode];
} else {
const enum TxfmType y_txtp = *txtp;
- *txtp = get_uv_inter_txtp(t_dim, y_txtp, f->frame_hdr, b->seg_id);
+ *txtp = get_uv_inter_txtp(t_dim, y_txtp);
}
} else {
- const enum TxfmTypeSet set = get_ext_txtp_set(tx, !intra,
- f->frame_hdr, b->seg_id);
- const unsigned set_cnt = dav1d_tx_type_count[set];
- unsigned idx;
- if (set_cnt == 1) {
- idx = 0;
+ if (!f->frame_hdr->segmentation.qidx[b->seg_id]) {
+ *txtp = DCT_DCT;
} else {
- const int set_idx = dav1d_tx_type_set_index[!intra][set];
- const enum IntraPredMode y_mode_nofilt = intra ? b->y_mode == FILTER_PRED ?
- dav1d_filter_mode_to_y_mode[b->y_angle] : b->y_mode : 0;
- uint16_t *const txtp_cdf = intra ?
- ts->cdf.m.txtp_intra[set_idx][t_dim->min][y_mode_nofilt] :
- ts->cdf.m.txtp_inter[set_idx][t_dim->min];
- idx = (set_cnt <= 8 ? dav1d_msac_decode_symbol_adapt8 :
- dav1d_msac_decode_symbol_adapt16)(&ts->msac, txtp_cdf, set_cnt);
+ const enum TxfmTypeSet set =
+ get_ext_txtp_set(t_dim, !intra, f->frame_hdr->reduced_txtp_set);
+ if (set == TXTP_SET_DCT)
+ *txtp = DCT_DCT;
+ else {
+ const unsigned set_cnt = dav1d_tx_type_count[set];
+ const int set_idx = dav1d_tx_type_set_index[!intra][set];
+ const enum IntraPredMode y_mode_nofilt = intra ? b->y_mode == FILTER_PRED ?
+ dav1d_filter_mode_to_y_mode[b->y_angle] : b->y_mode : 0;
+ uint16_t *const txtp_cdf = intra ?
+ ts->cdf.m.txtp_intra[set_idx][t_dim->min][y_mode_nofilt] :
+ ts->cdf.m.txtp_inter[set_idx][t_dim->min];
+ const unsigned idx = (set_cnt <= 8 ? dav1d_msac_decode_symbol_adapt8 :
+ dav1d_msac_decode_symbol_adapt16)(&ts->msac, txtp_cdf, set_cnt);
- if (dbg)
- printf("Post-txtp[%d->%d][%d->%d][%d][%d->%d]: r=%d\n",
- set, set_idx, tx, t_dim->min, intra ? (int)y_mode_nofilt : -1,
- idx, dav1d_tx_types_per_set[set][idx], ts->msac.rng);
+ *txtp = dav1d_tx_types_per_set[set][idx];
+ if (dbg)
+ printf("Post-txtp[%d->%d][%d->%d][%d][%d->%d]: r=%d\n",
+ set, set_idx, tx, t_dim->min, intra ? (int)y_mode_nofilt : -1,
+ idx, dav1d_tx_types_per_set[set][idx], ts->msac.rng);
+ }
}
- *txtp = dav1d_tx_types_per_set[set][idx];
}
// find end-of-block (eob)
@@ -199,17 +207,20 @@
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx], 4);
tok = 6 + tok_br;
dbg_print_hi_tok(eob, tok + tok_br, tok_br);
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx],
+ 4);
tok = 9 + tok_br;
dbg_print_hi_tok(eob, tok + tok_br, tok_br);
if (tok_br == 3) {
- tok = 12 + dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ tok = 12 +
+ dav1d_msac_decode_symbol_adapt4(&ts->msac,
+ br_cdf[br_ctx],
+ 4);
dbg_print_hi_tok(eob, tok + tok_br, tok_br);
}
}
@@ -235,24 +246,26 @@
const int br_ctx = get_br_ctx(levels, 1, tx_class, x, y, stride);
int tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx], 4);
tok = 3 + tok_br;
dbg_print_hi_tok(i, tok + tok_br, tok_br);
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx], 4);
tok = 6 + tok_br;
dbg_print_hi_tok(i, tok + tok_br, tok_br);
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx],
+ 4);
tok = 9 + tok_br;
dbg_print_hi_tok(i, tok + tok_br, tok_br);
if (tok_br == 3) {
tok = 12 + dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx],
+ 4);
dbg_print_hi_tok(i, tok + tok_br, tok_br);
}
}
@@ -288,17 +301,20 @@
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx], 4);
dc_tok = 6 + tok_br;
dbg_print_hi_tok(dc_tok + tok_br, tok_br);
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ br_cdf[br_ctx],
+ 4);
dc_tok = 9 + tok_br;
dbg_print_hi_tok(dc_tok + tok_br, tok_br);
if (tok_br == 3) {
- dc_tok = 12 + dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[br_ctx], 4);
+ dc_tok = 12 +
+ dav1d_msac_decode_symbol_adapt4(&ts->msac,
+ br_cdf[br_ctx],
+ 4);
dbg_print_hi_tok(dc_tok + tok_br, tok_br);
}
}
@@ -332,12 +348,13 @@
dbg_print_hi_tok(dc_tok + tok_br, tok_br);
if (tok_br == 3) {
tok_br = dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[0], 4);
+ br_cdf[0], 4);
dc_tok = 9 + tok_br;
dbg_print_hi_tok(dc_tok + tok_br, tok_br);
if (tok_br == 3) {
- dc_tok = 12 + dav1d_msac_decode_symbol_adapt4(&ts->msac,
- br_cdf[0], 4);
+ dc_tok = 12 +
+ dav1d_msac_decode_symbol_adapt4(&ts->msac,
+ br_cdf[0], 4);
dbg_print_hi_tok(dc_tok + tok_br, tok_br);
}
}
@@ -348,7 +365,6 @@
// residual and sign
int dc_sign = 1 << 6;
- const int lossless = f->frame_hdr->segmentation.lossless[b->seg_id];
const uint16_t *const dq_tbl = ts->dq[b->seg_id][plane];
const uint8_t *const qm_tbl = f->qm[lossless || is_1d || *txtp == IDTX][tx][plane];
const int dq_shift = imax(0, t_dim->ctx - 2);