ref: f4ad2720ec05bb9e58bc90fd9aecdf1727d4cd41
parent: 677dcb7c4093e512c52d6d164d3b3daabf00d595
author: David Michael Barr <b@rr-dav.id.au>
date: Fri Oct 12 21:25:07 EDT 2018
Defer DC_PRED for zero-alpha CFL_PRED
--- a/src/recon.c
+++ b/src/recon.c
@@ -855,6 +855,7 @@
cbw4 - (furthest_r >> ss_hor),
cbh4 - (furthest_b >> ss_ver));
for (int pl = 0; pl < 2; pl++) {
+ if (!b->cfl_alpha[pl]) continue;
int angle = 0;
const pixel *top_sb_edge = NULL;
if (!((t->by & ~ss_ver) & (f->sb_step - 1))) {
@@ -875,16 +876,10 @@
top_sb_edge, DC_PRED, &angle,
uv_t_dim->w,
uv_t_dim->h, edge);
- if (b->cfl_alpha[pl]) {
- dsp->ipred.cfl_pred[m](uv_dst[pl], stride, edge,
- uv_t_dim->w * 4,
- uv_t_dim->h * 4,
- b->cfl_alpha[pl], ac);
- } else {
- dsp->ipred.intra_pred[m](uv_dst[pl], stride, edge,
- uv_t_dim->w * 4,
- uv_t_dim->h * 4, 0);
- }
+ dsp->ipred.cfl_pred[m](uv_dst[pl], stride, edge,
+ uv_t_dim->w * 4,
+ uv_t_dim->h * 4,
+ b->cfl_alpha[pl], ac);
}
if (DEBUG_BLOCK_INFO && DEBUG_B_PIXELS) {
ac_dump(ac, 4*cbw4, 4*cbh4, "ac");
@@ -943,8 +938,11 @@
for (x = init_x >> ss_hor, t->bx += init_x; x < sub_cw4;
x += uv_t_dim->w, t->bx += uv_t_dim->w << ss_hor)
{
- if (b->uv_mode == CFL_PRED || b->pal_sz[1])
+ if ((b->uv_mode == CFL_PRED && b->cfl_alpha[pl]) ||
+ b->pal_sz[1])
+ {
goto skip_uv_pred;
+ }
int angle = b->uv_angle;
// this probably looks weird because we're using
@@ -963,6 +961,8 @@
const int sby = t->by >> f->sb_shift;
top_sb_edge += f->sb128w * 128 * (sby - 1);
}
+ const enum IntraPredMode uv_mode =
+ b->uv_mode == CFL_PRED ? DC_PRED : b->uv_mode;
const enum IntraPredMode m =
bytefn(dav1d_prepare_intra_edges)(t->bx >> ss_hor,
(t->bx >> ss_hor) >
@@ -973,7 +973,7 @@
ts->tiling.col_end >> ss_hor,
ts->tiling.row_end >> ss_ver,
edge_flags, dst, stride,
- top_sb_edge, b->uv_mode,
+ top_sb_edge, uv_mode,
&angle, uv_t_dim->w,
uv_t_dim->h, edge);
dsp->ipred.intra_pred[m](dst, stride, edge,