Commit e071d257 authored by Ronald S. Bultje's avatar Ronald S. Bultje

Make sequence header a referenced object

parent 41e64ac1
......@@ -702,7 +702,7 @@ static int decode_b(Dav1dTileContext *const t,
const int cbw4 = (bw4 + ss_hor) >> ss_hor, cbh4 = (bh4 + ss_ver) >> ss_ver;
const int have_left = t->bx > ts->tiling.col_start;
const int have_top = t->by > ts->tiling.row_start;
const int has_chroma = f->seq_hdr.layout != DAV1D_PIXEL_LAYOUT_I400 &&
const int has_chroma = f->seq_hdr->layout != DAV1D_PIXEL_LAYOUT_I400 &&
(bw4 > ss_hor || t->bx & 1) &&
(bh4 > ss_ver || t->by & 1);
......@@ -894,7 +894,7 @@ static int decode_b(Dav1dTileContext *const t,
// cdef index
if (!b->skip) {
const int idx = f->seq_hdr.sb128 ? ((t->bx & 16) >> 4) +
const int idx = f->seq_hdr->sb128 ? ((t->bx & 16) >> 4) +
((t->by & 16) >> 3) : 0;
if (t->cur_sb_cdef_idx_ptr[idx] == -1) {
const int v = msac_decode_bools(&ts->msac, f->frame_hdr.cdef.n_bits);
......@@ -910,12 +910,12 @@ static int decode_b(Dav1dTileContext *const t,
}
// delta-q/lf
if (!(t->bx & (31 >> !f->seq_hdr.sb128)) &&
!(t->by & (31 >> !f->seq_hdr.sb128)))
if (!(t->bx & (31 >> !f->seq_hdr->sb128)) &&
!(t->by & (31 >> !f->seq_hdr->sb128)))
{
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);
(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);
......@@ -937,7 +937,7 @@ static int decode_b(Dav1dTileContext *const t,
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;
f->seq_hdr->layout != DAV1D_PIXEL_LAYOUT_I400 ? 4 : 2 : 1;
for (int i = 0; i < n_lfs; i++) {
int delta_lf =
......@@ -966,7 +966,7 @@ static int decode_b(Dav1dTileContext *const t,
ts->dq = f->dq;
} else if (ts->last_qidx != prev_qidx) {
// find sb-specific quant parameters
init_quant_tables(&f->seq_hdr, &f->frame_hdr, ts->last_qidx, ts->dqmem);
init_quant_tables(f->seq_hdr, &f->frame_hdr, ts->last_qidx, ts->dqmem);
ts->dq = ts->dqmem;
}
if (!memcmp(ts->last_delta_lf, (int8_t[4]) { 0, 0, 0, 0 }, 4)) {
......@@ -1094,7 +1094,7 @@ static int decode_b(Dav1dTileContext *const t,
}
if (b->y_mode == DC_PRED && !b->pal_sz[0] &&
imax(b_dim[2], b_dim[3]) <= 3 && f->seq_hdr.filter_intra)
imax(b_dim[2], b_dim[3]) <= 3 && f->seq_hdr->filter_intra)
{
const int is_filter = msac_decode_bool_adapt(&ts->msac,
ts->cdf.m.use_filter_intra[bs]);
......@@ -1241,11 +1241,11 @@ static int decode_b(Dav1dTileContext *const t,
else if (mvlist[0][1].y | mvlist[0][1].x)
b->mv[0] = mvlist[0][1];
else {
if (t->by - (16 << f->seq_hdr.sb128) < ts->tiling.row_start) {
if (t->by - (16 << f->seq_hdr->sb128) < ts->tiling.row_start) {
b->mv[0].y = 0;
b->mv[0].x = -(512 << f->seq_hdr.sb128) - 2048;
b->mv[0].x = -(512 << f->seq_hdr->sb128) - 2048;
} else {
b->mv[0].y = -(512 << f->seq_hdr.sb128);
b->mv[0].y = -(512 << f->seq_hdr->sb128);
b->mv[0].x = 0;
}
}
......@@ -1281,9 +1281,9 @@ static int decode_b(Dav1dTileContext *const t,
src_top += border_top - src_top;
}
const int sbx = (t->bx >> (4 + f->seq_hdr.sb128)) << (6 + f->seq_hdr.sb128);
const int sby = (t->by >> (4 + f->seq_hdr.sb128)) << (6 + f->seq_hdr.sb128);
const int sb_size = 1 << (6 + f->seq_hdr.sb128);
const int sbx = (t->bx >> (4 + f->seq_hdr->sb128)) << (6 + f->seq_hdr->sb128);
const int sby = (t->by >> (4 + f->seq_hdr->sb128)) << (6 + f->seq_hdr->sb128);
const int sb_size = 1 << (6 + f->seq_hdr->sb128);
// check for overlap with current superblock
if (src_bottom > sby && src_right > sbx) {
if (src_top - border_top >= src_bottom - sby) {
......@@ -1529,7 +1529,7 @@ static int decode_b(Dav1dTileContext *const t,
// jnt_comp vs. seg vs. wedge
int is_segwedge = 0;
if (f->seq_hdr.masked_compound) {
if (f->seq_hdr->masked_compound) {
const int mask_ctx = get_mask_comp_ctx(t->a, &t->l, by4, bx4);
is_segwedge = msac_decode_bool_adapt(&ts->msac,
......@@ -1540,9 +1540,9 @@ static int decode_b(Dav1dTileContext *const t,
}
if (!is_segwedge) {
if (f->seq_hdr.jnt_comp) {
if (f->seq_hdr->jnt_comp) {
const int jnt_ctx =
get_jnt_comp_ctx(f->seq_hdr.order_hint_n_bits,
get_jnt_comp_ctx(f->seq_hdr->order_hint_n_bits,
f->cur.poc, f->refp[b->ref[0]].p.poc,
f->refp[b->ref[1]].p.poc, t->a, &t->l,
by4, bx4);
......@@ -1707,7 +1707,7 @@ static int decode_b(Dav1dTileContext *const t,
// interintra flags
const int ii_sz_grp = dav1d_ymode_size_context[bs];
if (f->seq_hdr.inter_intra &&
if (f->seq_hdr->inter_intra &&
interintra_allowed_mask & (1 << bs) &&
msac_decode_bool_adapt(&ts->msac, ts->cdf.m.interintra[ii_sz_grp]))
{
......@@ -1724,7 +1724,7 @@ static int decode_b(Dav1dTileContext *const t,
} else {
b->interintra_type = INTER_INTRA_NONE;
}
if (DEBUG_BLOCK_INFO && f->seq_hdr.inter_intra &&
if (DEBUG_BLOCK_INFO && f->seq_hdr->inter_intra &&
interintra_allowed_mask & (1 << bs))
{
printf("Post-interintra[t=%d,m=%d,w=%d]: r=%d\n",
......@@ -1792,7 +1792,7 @@ static int decode_b(Dav1dTileContext *const t,
by4, bx4);
filter[0] = msac_decode_symbol_adapt(&ts->msac,
ts->cdf.m.filter[0][ctx1], N_SWITCHABLE_FILTERS);
if (f->seq_hdr.dual_filter) {
if (f->seq_hdr->dual_filter) {
const int ctx2 = get_filter_ctx(t->a, &t->l, comp, 1,
b->ref[0], by4, bx4);
if (DEBUG_BLOCK_INFO)
......@@ -2206,7 +2206,7 @@ static void setup_tile(Dav1dTileState *const ts,
const int tile_start_off)
{
const int col_sb_start = f->frame_hdr.tiling.col_start_sb[tile_col];
const int col_sb128_start = col_sb_start >> !f->seq_hdr.sb128;
const int col_sb128_start = col_sb_start >> !f->seq_hdr->sb128;
const int col_sb_end = f->frame_hdr.tiling.col_start_sb[tile_col + 1];
const int row_sb_start = f->frame_hdr.tiling.row_start_sb[tile_row];
const int row_sb_end = f->frame_hdr.tiling.row_start_sb[tile_row + 1];
......@@ -2354,13 +2354,13 @@ static void read_restoration_info(Dav1dTileContext *const t,
int dav1d_decode_tile_sbrow(Dav1dTileContext *const t) {
const Dav1dFrameContext *const f = t->f;
const enum BlockLevel root_bl = f->seq_hdr.sb128 ? BL_128X128 : BL_64X64;
const enum BlockLevel root_bl = f->seq_hdr->sb128 ? BL_128X128 : BL_64X64;
Dav1dTileState *const ts = t->ts;
const Dav1dContext *const c = f->c;
const int sb_step = f->sb_step;
const int tile_row = ts->tiling.row, tile_col = ts->tiling.col;
const int col_sb_start = f->frame_hdr.tiling.col_start_sb[tile_col];
const int col_sb128_start = col_sb_start >> !f->seq_hdr.sb128;
const int col_sb128_start = col_sb_start >> !f->seq_hdr->sb128;
reset_context(&t->l, !(f->frame_hdr.frame_type & 1), f->frame_thread.pass);
if (f->frame_thread.pass == 2) {
......@@ -2372,7 +2372,7 @@ int dav1d_decode_tile_sbrow(Dav1dTileContext *const t) {
return 1;
if (decode_sb(t, root_bl, c->intra_edge.root[root_bl]))
return 1;
if (t->bx & 16 || f->seq_hdr.sb128)
if (t->bx & 16 || f->seq_hdr->sb128)
t->a++;
}
f->bd_fn.backup_ipred_edge(t);
......@@ -2467,7 +2467,7 @@ int dav1d_decode_tile_sbrow(Dav1dTileContext *const t) {
}
if (decode_sb(t, root_bl, c->intra_edge.root[root_bl]))
return 1;
if (t->bx & 16 || f->seq_hdr.sb128) {
if (t->bx & 16 || f->seq_hdr->sb128) {
t->a++;
t->lf_mask++;
}
......@@ -2680,9 +2680,9 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) {
// init ref mvs
if ((f->frame_hdr.frame_type & 1) || f->frame_hdr.allow_intrabc) {
f->mvs = f->mvs_ref->data;
const int order_hint_n_bits = f->seq_hdr.order_hint * f->seq_hdr.order_hint_n_bits;
const int order_hint_n_bits = f->seq_hdr->order_hint * f->seq_hdr->order_hint_n_bits;
const int ret = av1_init_ref_mv_common(f->libaom_cm, f->bw >> 1, f->bh >> 1,
f->b4_stride, f->seq_hdr.sb128,
f->b4_stride, f->seq_hdr->sb128,
f->mvs, f->ref_mvs, f->cur.poc, f->refpoc,
f->refrefpoc, f->frame_hdr.gmv,
f->frame_hdr.hp, f->frame_hdr.force_integer_mv,
......@@ -2694,7 +2694,7 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) {
}
// setup dequant tables
init_quant_tables(&f->seq_hdr, &f->frame_hdr, f->frame_hdr.quant.yac, f->dq);
init_quant_tables(f->seq_hdr, &f->frame_hdr, f->frame_hdr.quant.yac, f->dq);
if (f->frame_hdr.quant.qm)
for (int j = 0; j < N_RECT_TX_SIZES; j++) {
f->qm[0][j][0] = dav1d_qm_tbl[f->frame_hdr.quant.qm_y][0][j];
......@@ -2714,9 +2714,9 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) {
for (int j = i + 1; j < 7; j++) {
const unsigned ref1poc = f->refp[j].p.poc;
const unsigned d1 = imin(abs(get_poc_diff(f->seq_hdr.order_hint_n_bits,
const unsigned d1 = imin(abs(get_poc_diff(f->seq_hdr->order_hint_n_bits,
ref0poc, f->cur.poc)), 31);
const unsigned d0 = imin(abs(get_poc_diff(f->seq_hdr.order_hint_n_bits,
const unsigned d0 = imin(abs(get_poc_diff(f->seq_hdr->order_hint_n_bits,
ref1poc, f->cur.poc)), 31);
const int order = d0 <= d1;
......@@ -2822,7 +2822,7 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) {
for (int sby = f->frame_hdr.tiling.row_start_sb[tile_row];
sby < sbh_end; sby++)
{
t->by = sby << (4 + f->seq_hdr.sb128);
t->by = sby << (4 + f->seq_hdr->sb128);
for (int tile_col = 0; tile_col < f->frame_hdr.tiling.cols; tile_col++) {
t->ts = &f->ts[tile_row * f->frame_hdr.tiling.cols + tile_col];
......@@ -2947,6 +2947,7 @@ error:
dav1d_ref_dec(&f->cur_segmap_ref);
dav1d_ref_dec(&f->prev_segmap_ref);
dav1d_ref_dec(&f->mvs_ref);
dav1d_ref_dec(&f->seq_hdr_ref);
for (int i = 0; i < f->n_tile_data; i++)
dav1d_data_unref(&f->tile[i].data);
......@@ -2987,14 +2988,16 @@ int dav1d_submit_frame(Dav1dContext *const c) {
}
f->seq_hdr = c->seq_hdr;
f->seq_hdr_ref = c->seq_hdr_ref;
dav1d_ref_inc(f->seq_hdr_ref);
f->frame_hdr = c->frame_hdr;
const int bd_idx = (f->seq_hdr.bpc - 8) >> 1;
const int bd_idx = (f->seq_hdr->bpc - 8) >> 1;
f->dsp = &c->dsp[bd_idx];
if (!f->dsp->ipred.intra_pred[DC_PRED]) {
Dav1dDSPContext *const dsp = &c->dsp[bd_idx];
switch (f->seq_hdr.bpc) {
switch (f->seq_hdr->bpc) {
#define assign_bitdepth_case(bd) \
case bd: \
dav1d_cdef_dsp_init_##bd##bpc(&dsp->cdef); \
......@@ -3013,7 +3016,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
#undef assign_bitdepth_case
default:
fprintf(stderr, "Compiled without support for %d-bit decoding\n",
f->seq_hdr.bpc);
f->seq_hdr->bpc);
res = -ENOPROTOOPT;
goto error;
}
......@@ -3025,7 +3028,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
f->bd_fn.filter_sbrow = dav1d_filter_sbrow_##bd##bpc; \
f->bd_fn.backup_ipred_edge = dav1d_backup_ipred_edge_##bd##bpc; \
f->bd_fn.read_coef_blocks = dav1d_read_coef_blocks_##bd##bpc
if (f->seq_hdr.bpc <= 8) {
if (f->seq_hdr->bpc <= 8) {
#if CONFIG_8BPC
assign_bitdepth_case(8);
#endif
......@@ -3051,8 +3054,8 @@ int dav1d_submit_frame(Dav1dContext *const c) {
f->frame_hdr.height * 2 < c->refs[refidx].p.p.p.h ||
f->frame_hdr.width[0] > c->refs[refidx].p.p.p.w * 16 ||
f->frame_hdr.height > c->refs[refidx].p.p.p.h * 16 ||
f->seq_hdr.layout != c->refs[refidx].p.p.p.layout ||
f->seq_hdr.bpc != c->refs[refidx].p.p.p.bpc)
f->seq_hdr->layout != c->refs[refidx].p.p.p.layout ||
f->seq_hdr->bpc != c->refs[refidx].p.p.p.bpc)
{
for (int j = 0; j < i; j++)
dav1d_thread_picture_unref(&f->refp[j]);
......@@ -3101,7 +3104,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
// allocate frame
res = dav1d_thread_picture_alloc(&f->sr_cur, f->frame_hdr.width[1],
f->frame_hdr.height,
f->seq_hdr.layout, f->seq_hdr.bpc,
f->seq_hdr->layout, f->seq_hdr->bpc,
c->n_fc > 1 ? &f->frame_thread.td : NULL,
f->frame_hdr.show_frame, &c->allocator);
if (res < 0) goto error;
......@@ -3109,11 +3112,11 @@ int dav1d_submit_frame(Dav1dContext *const c) {
f->sr_cur.p.poc = f->frame_hdr.frame_offset;
f->sr_cur.p.p.type = f->frame_hdr.frame_type;
f->sr_cur.p.p.film_grain = f->frame_hdr.film_grain.data;
f->sr_cur.p.p.pri = f->seq_hdr.pri;
f->sr_cur.p.p.trc = f->seq_hdr.trc;
f->sr_cur.p.p.mtrx = f->seq_hdr.mtrx;
f->sr_cur.p.p.chr = f->seq_hdr.chr;
f->sr_cur.p.p.fullrange = f->seq_hdr.color_range;
f->sr_cur.p.p.pri = f->seq_hdr->pri;
f->sr_cur.p.p.trc = f->seq_hdr->trc;
f->sr_cur.p.p.mtrx = f->seq_hdr->mtrx;
f->sr_cur.p.p.chr = f->seq_hdr->chr;
f->sr_cur.p.p.fullrange = f->seq_hdr->color_range;
f->sr_cur.p.m = f->tile[0].data.m;
f->sr_cur.p.p.spatial_id = f->frame_hdr.spatial_id;
......@@ -3149,8 +3152,8 @@ int dav1d_submit_frame(Dav1dContext *const c) {
f->bh = ((f->frame_hdr.height + 7) >> 3) << 1;
f->sb128w = (f->bw + 31) >> 5;
f->sb128h = (f->bh + 31) >> 5;
f->sb_shift = 4 + f->seq_hdr.sb128;
f->sb_step = 16 << f->seq_hdr.sb128;
f->sb_shift = 4 + f->seq_hdr->sb128;
f->sb_step = 16 << f->seq_hdr->sb128;
f->sbh = (f->bh + f->sb_step - 1) >> f->sb_shift;
f->b4_stride = (f->bw + 31) & ~31;
......@@ -3305,6 +3308,7 @@ error:
dav1d_picture_unref(&f->cur);
dav1d_thread_picture_unref(&f->sr_cur);
dav1d_ref_dec(&f->mvs_ref);
dav1d_ref_dec(&f->seq_hdr_ref);
for (int i = 0; i < f->n_tile_data; i++)
dav1d_data_unref(&f->tile[i].data);
......
......@@ -75,9 +75,10 @@ struct Dav1dContext {
Dav1dData data;
int start, end;
} tile[256];
int n_tile_data, have_seq_hdr, have_frame_hdr;
int n_tile_data, have_frame_hdr;
int n_tiles;
Av1SequenceHeader seq_hdr; // FIXME make ref?
Dav1dRef *seq_hdr_ref;
Av1SequenceHeader *seq_hdr;
Av1FrameHeader frame_hdr; // FIXME make ref?
// decoded output picture queue
......@@ -122,7 +123,8 @@ struct Dav1dContext {
};
struct Dav1dFrameContext {
Av1SequenceHeader seq_hdr;
Dav1dRef *seq_hdr_ref;
Av1SequenceHeader *seq_hdr;
Av1FrameHeader frame_hdr;
Dav1dThreadPicture refp[7];
Dav1dPicture cur; // during block coding / reconstruction
......
......@@ -178,7 +178,7 @@ void bytefn(dav1d_loopfilter_sbrow)(const Dav1dFrameContext *const f,
int x, have_left;
// Don't filter outside the frame
const int have_top = sby > 0;
const int is_sb64 = !f->seq_hdr.sb128;
const int is_sb64 = !f->seq_hdr->sb128;
const int starty4 = (sby & is_sb64) << 4;
const int sbsz = 32 >> is_sb64;
const int sbl2 = 5 - is_sb64;
......
......@@ -110,31 +110,31 @@ void bytefn(dav1d_lr_copy_lpf)(Dav1dFrameContext *const f,
if (restore_planes & LR_RESTORE_Y) {
const int h = f->bh << 2;
const int w = f->bw << 2;
const int row_h = imin((sby + 1) << (6 + f->seq_hdr.sb128), h - 4);
const int y_stripe = (sby << (6 + f->seq_hdr.sb128)) - offset;
const int row_h = imin((sby + 1) << (6 + f->seq_hdr->sb128), h - 4);
const int y_stripe = (sby << (6 + f->seq_hdr->sb128)) - offset;
backup_lpf(f, f->lf.lr_lpf_line_ptr[0], lr_stride,
src[0] - offset * PXSTRIDE(src_stride[0]), src_stride[0],
0, f->seq_hdr.sb128, y_stripe, row_h, w, 0);
0, f->seq_hdr->sb128, y_stripe, row_h, w, 0);
}
if (restore_planes & (LR_RESTORE_U | LR_RESTORE_V)) {
const int ss_ver = f->sr_cur.p.p.layout == DAV1D_PIXEL_LAYOUT_I420;
const int ss_hor = f->sr_cur.p.p.layout != DAV1D_PIXEL_LAYOUT_I444;
const int h = f->bh << (2 - ss_ver);
const int w = f->bw << (2 - ss_hor);
const int row_h = imin((sby + 1) << ((6 - ss_ver) + f->seq_hdr.sb128), h - 4);
const int row_h = imin((sby + 1) << ((6 - ss_ver) + f->seq_hdr->sb128), h - 4);
const ptrdiff_t offset_uv = offset >> ss_ver;
const int y_stripe =
(sby << ((6 - ss_ver) + f->seq_hdr.sb128)) - offset_uv;
(sby << ((6 - ss_ver) + f->seq_hdr->sb128)) - offset_uv;
if (restore_planes & LR_RESTORE_U) {
backup_lpf(f, f->lf.lr_lpf_line_ptr[1], lr_stride,
src[1] - offset_uv * PXSTRIDE(src_stride[1]), src_stride[1],
ss_ver, f->seq_hdr.sb128, y_stripe, row_h, w, ss_hor);
ss_ver, f->seq_hdr->sb128, y_stripe, row_h, w, ss_hor);
}
if (restore_planes & LR_RESTORE_V) {
backup_lpf(f, f->lf.lr_lpf_line_ptr[2], lr_stride,
src[2] - offset_uv * PXSTRIDE(src_stride[1]), src_stride[1],
ss_ver, f->seq_hdr.sb128, y_stripe, row_h, w, ss_hor);
ss_ver, f->seq_hdr->sb128, y_stripe, row_h, w, ss_hor);
}
}
}
......@@ -278,8 +278,8 @@ void bytefn(dav1d_lr_sbrow)(Dav1dFrameContext *const f, pixel *const dst[3],
if (restore_planes & LR_RESTORE_Y) {
const int h = f->sr_cur.p.p.h;
const int w = f->sr_cur.p.p.w;
const int row_h = imin((sby + 1) << (6 + f->seq_hdr.sb128), h);
const int y_stripe = (sby << (6 + f->seq_hdr.sb128)) - offset_y;
const int row_h = imin((sby + 1) << (6 + f->seq_hdr->sb128), h);
const int y_stripe = (sby << (6 + f->seq_hdr->sb128)) - offset_y;
lr_sbrow(f, dst[0] - offset_y * PXSTRIDE(dst_stride[0]), y_stripe, w,
h, row_h, 0);
}
......@@ -288,10 +288,10 @@ void bytefn(dav1d_lr_sbrow)(Dav1dFrameContext *const f, pixel *const dst[3],
const int ss_hor = f->sr_cur.p.p.layout != DAV1D_PIXEL_LAYOUT_I444;
const int h = (f->sr_cur.p.p.h + ss_ver) >> ss_ver;
const int w = (f->sr_cur.p.p.w + ss_hor) >> ss_hor;
const int row_h = imin((sby + 1) << ((6 - ss_ver) + f->seq_hdr.sb128), h);
const int row_h = imin((sby + 1) << ((6 - ss_ver) + f->seq_hdr->sb128), h);
const ptrdiff_t offset_uv = offset_y >> ss_ver;
const int y_stripe =
(sby << ((6 - ss_ver) + f->seq_hdr.sb128)) - offset_uv;
(sby << ((6 - ss_ver) + f->seq_hdr->sb128)) - offset_uv;
if (restore_planes & LR_RESTORE_U)
lr_sbrow(f, dst[1] - offset_uv * PXSTRIDE(dst_stride[1]), y_stripe,
w, h, row_h, 1);
......
......@@ -274,7 +274,7 @@ error:
static int read_frame_size(Dav1dContext *const c, GetBits *const gb,
const int use_ref)
{
const Av1SequenceHeader *const seqhdr = &c->seq_hdr;
const Av1SequenceHeader *const seqhdr = c->seq_hdr;
Av1FrameHeader *const hdr = &c->frame_hdr;
if (use_ref) {
......@@ -344,7 +344,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
#if DEBUG_FRAME_HDR
const uint8_t *const init_ptr = gb->ptr;
#endif
const Av1SequenceHeader *const seqhdr = &c->seq_hdr;
const Av1SequenceHeader *const seqhdr = c->seq_hdr;
Av1FrameHeader *const hdr = &c->frame_hdr;
int res;
......@@ -407,7 +407,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
if (seqhdr->decoder_model_info_present) {
hdr->buffer_removal_time_present = dav1d_get_bits(gb, 1);
if (hdr->buffer_removal_time_present) {
for (int i = 0; i < c->seq_hdr.num_operating_points; i++) {
for (int i = 0; i < c->seq_hdr->num_operating_points; i++) {
const struct Av1SequenceHeaderOperatingPoint *const seqop = &seqhdr->operating_points[i];
struct Av1FrameHeaderOperatingPoint *const op = &hdr->operating_points[i];
if (seqop->decoder_model_param_present) {
......@@ -1203,17 +1203,23 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
switch (type) {
case OBU_SEQ_HDR: {
Av1SequenceHeader hdr, *const hdr_ptr = c->have_seq_hdr ? &hdr : &c->seq_hdr;
memset(hdr_ptr, 0, sizeof(*hdr_ptr));
Dav1dRef *ref = dav1d_ref_create(sizeof(Av1SequenceHeader));
if (!ref) return -ENOMEM;
Av1SequenceHeader *seq_hdr = ref->data;
memset(seq_hdr, 0, sizeof(*seq_hdr));
c->have_frame_hdr = 0;
if ((res = parse_seq_hdr(c, &gb, hdr_ptr)) < 0)
if ((res = parse_seq_hdr(c, &gb, seq_hdr)) < 0) {
dav1d_ref_dec(&ref);
return res;
if (check_for_overrun(&gb, init_bit_pos, len))
}
if (check_for_overrun(&gb, init_bit_pos, len)) {
dav1d_ref_dec(&ref);
return -EINVAL;
}
// If we have read a sequence header which is different from
// the old one, this is a new video sequence and can't use any
// previous state. Free that state.
if (c->have_seq_hdr && memcmp(&hdr, &c->seq_hdr, sizeof(hdr))) {
if (c->seq_hdr && memcmp(seq_hdr, c->seq_hdr, sizeof(*seq_hdr))) {
for (int i = 0; i < 8; i++) {
if (c->refs[i].p.p.data[0])
dav1d_thread_picture_unref(&c->refs[i].p);
......@@ -1222,9 +1228,10 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
if (c->cdf[i].cdf)
dav1d_cdf_thread_unref(&c->cdf[i]);
}
c->seq_hdr = hdr;
dav1d_ref_dec(&c->seq_hdr_ref);
}
c->have_seq_hdr = 1;
c->seq_hdr_ref = ref;
c->seq_hdr = seq_hdr;
break;
}
case OBU_REDUNDANT_FRAME_HDR:
......@@ -1233,7 +1240,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
case OBU_FRAME:
case OBU_FRAME_HDR:
c->have_frame_hdr = 0;
if (!c->have_seq_hdr) goto error;
if (!c->seq_hdr) goto error;
c->frame_hdr.temporal_id = temporal_id;
c->frame_hdr.spatial_id = spatial_id;
if ((res = parse_frame_hdr(c, &gb)) < 0)
......@@ -1306,7 +1313,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
return -EINVAL;
}
if (c->have_seq_hdr && c->have_frame_hdr &&
if (c->seq_hdr && c->have_frame_hdr &&
c->n_tiles == c->frame_hdr.tiling.cols * c->frame_hdr.tiling.rows)
{
if (!c->n_tile_data)
......@@ -1316,7 +1323,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
assert(!c->n_tile_data);
c->have_frame_hdr = 0;
c->n_tiles = 0;
} else if (c->have_seq_hdr && c->have_frame_hdr &&
} else if (c->seq_hdr && c->have_frame_hdr &&
c->frame_hdr.show_existing_frame)
{
if (c->n_fc == 1) {
......
......@@ -368,7 +368,7 @@ void bytefn(dav1d_read_coef_blocks)(Dav1dTileContext *const t,
const uint8_t *const b_dim = dav1d_block_dimensions[bs];
const int bw4 = b_dim[0], bh4 = b_dim[1];
const int cbw4 = (bw4 + ss_hor) >> ss_hor, cbh4 = (bh4 + ss_ver) >> ss_ver;
const int has_chroma = f->seq_hdr.layout != DAV1D_PIXEL_LAYOUT_I400 &&
const int has_chroma = f->seq_hdr->layout != DAV1D_PIXEL_LAYOUT_I400 &&
(bw4 > ss_hor || t->bx & 1) &&
(bh4 > ss_ver || t->by & 1);
......@@ -748,7 +748,7 @@ void bytefn(dav1d_recon_b_intra)(Dav1dTileContext *const t, const enum BlockSize
const int bw4 = b_dim[0], bh4 = b_dim[1];
const int w4 = imin(bw4, f->bw - t->bx), h4 = imin(bh4, f->bh - t->by);
const int cw4 = (w4 + ss_hor) >> ss_hor, ch4 = (h4 + ss_ver) >> ss_ver;
const int has_chroma = f->seq_hdr.layout != DAV1D_PIXEL_LAYOUT_I400 &&
const int has_chroma = f->seq_hdr->layout != DAV1D_PIXEL_LAYOUT_I400 &&
(bw4 > ss_hor || t->bx & 1) &&
(bh4 > ss_ver || t->by & 1);
const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[b->tx];
......@@ -759,7 +759,7 @@ void bytefn(dav1d_recon_b_intra)(Dav1dTileContext *const t, const enum BlockSize
pixel *const edge = edge_buf + 128;
const int cbw4 = (bw4 + ss_hor) >> ss_hor, cbh4 = (bh4 + ss_ver) >> ss_ver;
const int intra_edge_filter_flag = f->seq_hdr.intra_edge_filter << 10;
const int intra_edge_filter_flag = f->seq_hdr->intra_edge_filter << 10;
for (int init_y = 0; init_y < h4; init_y += 16) {
for (int init_x = 0; init_x < w4; init_x += 16) {
......@@ -1139,7 +1139,7 @@ int bytefn(dav1d_recon_b_inter)(Dav1dTileContext *const t, const enum BlockSize
const uint8_t *const b_dim = dav1d_block_dimensions[bs];
const int bw4 = b_dim[0], bh4 = b_dim[1];
const int w4 = imin(bw4, f->bw - t->bx), h4 = imin(bh4, f->bh - t->by);
const int has_chroma = f->seq_hdr.layout != DAV1D_PIXEL_LAYOUT_I400 &&
const int has_chroma = f->seq_hdr->layout != DAV1D_PIXEL_LAYOUT_I400 &&
(bw4 > ss_hor || t->bx & 1) &&
(bh4 > ss_ver || t->by & 1);
const int chr_layout_idx = f->cur.p.layout == DAV1D_PIXEL_LAYOUT_I400 ? 0 :
......@@ -1579,11 +1579,11 @@ void bytefn(dav1d_filter_sbrow)(Dav1dFrameContext *const f, const int sby) {
start_of_tile_row);
}
if (f->seq_hdr.restoration) {
if (f->seq_hdr->restoration) {
// Store loop filtered pixels required by loop restoration
bytefn(dav1d_lr_copy_lpf)(f, f->lf.p, sby);
}
if (f->seq_hdr.cdef) {
if (f->seq_hdr->cdef) {
if (sby) {
const int ss_ver = f->cur.p.layout == DAV1D_PIXEL_LAYOUT_I420;
pixel *p_up[3] = {
......@@ -1618,7 +1618,7 @@ void bytefn(dav1d_filter_sbrow)(Dav1dFrameContext *const f, const int sby) {
f->resize_start[!!pl]);
}
}
if (f->seq_hdr.restoration) {
if (f->seq_hdr->restoration) {
bytefn(dav1d_lr_sbrow)(f, f->lf.sr_p, sby);
}
......@@ -1630,7 +1630,7 @@ void bytefn(dav1d_filter_sbrow)(Dav1dFrameContext *const f, const int sby) {
f->lf.sr_p[1] += sbsz * 4 * PXSTRIDE(f->sr_cur.p.stride[1]) >> ss_ver;
f->lf.sr_p[2] += sbsz * 4 * PXSTRIDE(f->sr_cur.p.stride[1]) >> ss_ver;
f->lf.prev_mask_ptr = f->lf.mask_ptr;
if ((sby & 1) || f->seq_hdr.sb128) {
if ((sby & 1) || f->seq_hdr->sb128) {
f->lf.mask_ptr += f->sb128w;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment