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

Remove entries from c->refs[] that can be retrieved from frame_hdr

parent 5a4fea2c
......@@ -3043,6 +3043,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
}
#undef assign_bitdepth_case
int ref_coded_width[7];
if (f->frame_hdr->frame_type & 1) {
if (f->frame_hdr->primary_ref_frame != DAV1D_PRIMARY_REF_NONE) {
const int pri_ref = f->frame_hdr->refidx[f->frame_hdr->primary_ref_frame];
......@@ -3067,7 +3068,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
goto error;
}
dav1d_thread_picture_ref(&f->refp[i], &c->refs[refidx].p);
f->ref_coded_width[i] = c->refs[refidx].coded_width;
ref_coded_width[i] = c->refs[refidx].p.p.frame_hdr->width[0];
if (f->frame_hdr->width[0] != c->refs[refidx].p.p.p.w ||
f->frame_hdr->height != c->refs[refidx].p.p.p.h)
{
......@@ -3182,7 +3183,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
for (int i = 0; i < 7; i++) {
const int refidx = f->frame_hdr->refidx[i];
if (c->refs[refidx].refmvs != NULL &&
f->ref_coded_width[i] == f->cur.p.w &&
ref_coded_width[i] == f->cur.p.w &&
f->refp[i].p.p.h == f->cur.p.h)
{
f->ref_mvs_ref[i] = c->refs[refidx].refmvs;
......@@ -3214,7 +3215,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
if (f->frame_hdr->segmentation.temporal || !f->frame_hdr->segmentation.update_map) {
const int pri_ref = f->frame_hdr->primary_ref_frame;
assert(pri_ref != DAV1D_PRIMARY_REF_NONE);
const int ref_w = ((f->ref_coded_width[pri_ref] + 7) >> 3) << 1;
const int ref_w = ((ref_coded_width[pri_ref] + 7) >> 3) << 1;
const int ref_h = ((f->refp[pri_ref].p.p.h + 7) >> 3) << 1;
if (ref_w == f->bw && ref_h == f->bh) {
f->prev_segmap_ref = c->refs[f->frame_hdr->refidx[pri_ref]].segmap;
......@@ -3255,7 +3256,6 @@ int dav1d_submit_frame(Dav1dContext *const c) {
if (c->refs[i].p.p.data[0])
dav1d_thread_picture_unref(&c->refs[i].p);
dav1d_thread_picture_ref(&c->refs[i].p, &f->sr_cur);
c->refs[i].coded_width = f->frame_hdr->width[0];
if (c->cdf[i].cdf) dav1d_cdf_thread_unref(&c->cdf[i]);
if (f->frame_hdr->refresh_context) {
......@@ -3263,11 +3263,6 @@ int dav1d_submit_frame(Dav1dContext *const c) {
} else {
dav1d_cdf_thread_ref(&c->cdf[i], &f->in_cdf);
}
c->refs[i].lf_mode_ref_deltas =
f->frame_hdr->loopfilter.mode_ref_deltas;
c->refs[i].seg_data = f->frame_hdr->segmentation.seg_data;
memcpy(c->refs[i].gmv, f->frame_hdr->gmv, sizeof(c->refs[i].gmv));
c->refs[i].film_grain = f->frame_hdr->film_grain.data;
dav1d_ref_dec(&c->refs[i].segmap);
c->refs[i].segmap = f->cur_segmap_ref;
......@@ -3280,7 +3275,6 @@ int dav1d_submit_frame(Dav1dContext *const c) {
dav1d_ref_inc(f->mvs_ref);
}
memcpy(c->refs[i].refpoc, f->refpoc, sizeof(f->refpoc));
c->refs[i].qidx = f->frame_hdr->quant.yac;
}
}
......
......@@ -94,14 +94,8 @@ struct Dav1dContext {
struct {
Dav1dThreadPicture p;
Dav1dRef *segmap;
Dav1dSegmentationDataSet seg_data;
Dav1dRef *refmvs;
unsigned refpoc[7];
Dav1dWarpedMotionParams gmv[7];
Dav1dLoopfilterModeRefDeltas lf_mode_ref_deltas;
Dav1dFilmGrainData film_grain;
uint8_t qidx;
unsigned coded_width;
} refs[8];
CdfThreadContext cdf[8];
......@@ -138,7 +132,6 @@ struct Dav1dFrameContext {
uint8_t *cur_segmap;
const uint8_t *prev_segmap;
unsigned refpoc[7], refrefpoc[7][7];
int ref_coded_width[7];
uint8_t gmv_warp_allowed[7];
CdfThreadContext in_cdf, out_cdf;
struct {
......
......@@ -736,7 +736,8 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
// segmentation data from the reference frame.
assert(hdr->primary_ref_frame != DAV1D_PRIMARY_REF_NONE);
const int pri_ref = hdr->refidx[hdr->primary_ref_frame];
hdr->segmentation.seg_data = c->refs[pri_ref].seg_data;
hdr->segmentation.seg_data =
c->refs[pri_ref].p.p.frame_hdr->segmentation.seg_data;
}
} else {
memset(&hdr->segmentation.seg_data, 0, sizeof(Dav1dSegmentationDataSet));
......@@ -796,7 +797,8 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
hdr->loopfilter.mode_ref_deltas = default_mode_ref_deltas;
} else {
const int ref = hdr->refidx[hdr->primary_ref_frame];
hdr->loopfilter.mode_ref_deltas = c->refs[ref].lf_mode_ref_deltas;
hdr->loopfilter.mode_ref_deltas =
c->refs[ref].p.p.frame_hdr->loopfilter.mode_ref_deltas;
}
hdr->loopfilter.mode_ref_delta_enabled = dav1d_get_bits(gb, 1);
if (hdr->loopfilter.mode_ref_delta_enabled) {
......@@ -970,7 +972,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
const Dav1dWarpedMotionParams *const ref_gmv =
hdr->primary_ref_frame == DAV1D_PRIMARY_REF_NONE ? &dav1d_default_wm_params :
&c->refs[hdr->refidx[hdr->primary_ref_frame]].gmv[i];
&c->refs[hdr->refidx[hdr->primary_ref_frame]].p.p.frame_hdr->gmv[i];
int32_t *const mat = hdr->gmv[i].matrix;
const int32_t *const ref_mat = ref_gmv->matrix;
int bits, shift;
......@@ -1018,7 +1020,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
if (hdr->refidx[i] == refidx)
break;
if (i == 7) goto error;
hdr->film_grain.data = c->refs[refidx].film_grain;
hdr->film_grain.data = c->refs[refidx].p.p.frame_hdr->film_grain.data;
hdr->film_grain.data.seed = seed;
} else {
Dav1dFilmGrainData *const fgd = &hdr->film_grain.data;
......@@ -1363,20 +1365,13 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) {
dav1d_thread_picture_ref(&c->refs[i].p, &c->refs[r].p);
if (c->cdf[i].cdf) dav1d_cdf_thread_unref(&c->cdf[i]);
dav1d_init_states(&c->cdf[i], c->refs[r].qidx);
c->refs[i].lf_mode_ref_deltas = c->refs[r].lf_mode_ref_deltas;
c->refs[i].seg_data = c->refs[r].seg_data;
for (int j = 0; j < 7; j++)
c->refs[i].gmv[j] = dav1d_default_wm_params;
c->refs[i].film_grain = c->refs[r].film_grain;
dav1d_init_states(&c->cdf[i], c->refs[r].p.p.frame_hdr->quant.yac);
dav1d_ref_dec(&c->refs[i].segmap);
c->refs[i].segmap = c->refs[r].segmap;
if (c->refs[r].segmap)
dav1d_ref_inc(c->refs[r].segmap);
dav1d_ref_dec(&c->refs[i].refmvs);
c->refs[i].qidx = c->refs[r].qidx;
}
}
c->frame_hdr = NULL;
......
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