diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2018-11-09 00:20:26 +0300 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2018-11-09 00:20:26 +0300 |
commit | 1ddd4cb83b1a214798a047fcec7b50f4f0234369 (patch) | |
tree | 337bda5d15a87aa0343e3e2c9a26698ef00234ad | |
parent | 39b35e34c85c07dc21c4242d1372934a674cac22 (diff) |
Always free references upon sequence header refresh
Also clear refpoc[] for intrabc frames. Fixes #146.
This changes sequence header parsing so that we no longer reset
c->have_seq_hdr to 0 if parsing of the most recent sequence header
failed. Rather, we will just continue with the old sequence header
and test any future sequence headers against this. This may help
error resilience in streams that periodically re-send their sequence
header.
-rw-r--r-- | src/decode.c | 8 | ||||
-rw-r--r-- | src/obu.c | 13 | ||||
-rw-r--r-- | src/ref_mvs.c | 4 |
3 files changed, 14 insertions, 11 deletions
diff --git a/src/decode.c b/src/decode.c index 5340422..d3ffc4c 100644 --- a/src/decode.c +++ b/src/decode.c @@ -3009,8 +3009,12 @@ int dav1d_submit_frame(Dav1dContext *const c) { f->mvs_ref = dav1d_ref_create(f->sb128h * 32 * f->b4_stride * sizeof(*f->mvs)); f->mvs = f->mvs_ref->data; - for (int i = 0; i < 7; i++) - f->refpoc[i] = f->refp[i].p.poc; + if (!f->frame_hdr.allow_intrabc) { + for (int i = 0; i < 7; i++) + f->refpoc[i] = f->refp[i].p.poc; + } else { + memset(f->refpoc, 0, sizeof(f->refpoc)); + } if (f->frame_hdr.use_ref_frame_mvs) { for (int i = 0; i < 7; i++) { const int refidx = f->frame_hdr.refidx[i]; @@ -1046,15 +1046,11 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in) { Av1SequenceHeader hdr, *const hdr_ptr = c->have_seq_hdr ? &hdr : &c->seq_hdr; memset(hdr_ptr, 0, sizeof(*hdr_ptr)); c->have_frame_hdr = 0; - if ((res = parse_seq_hdr(c, &gb, hdr_ptr)) < 0) { - c->have_seq_hdr = 0; + if ((res = parse_seq_hdr(c, &gb, hdr_ptr)) < 0) return res; - } - if ((unsigned)res != len) { - c->have_seq_hdr = 0; + if ((unsigned)res != len) goto error; - } - if (c->have_seq_hdr && memcmp(&hdr, &c->seq_hdr, sizeof(hdr))) { + if (!c->have_frame_hdr || memcmp(&hdr, &c->seq_hdr, sizeof(hdr))) { for (int i = 0; i < 8; i++) { if (c->refs[i].p.p.data[0]) dav1d_thread_picture_unref(&c->refs[i].p); @@ -1063,7 +1059,8 @@ 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; + if (c->have_seq_hdr) + c->seq_hdr = hdr; } c->have_seq_hdr = 1; break; diff --git a/src/ref_mvs.c b/src/ref_mvs.c index fa92d28..9c749a9 100644 --- a/src/ref_mvs.c +++ b/src/ref_mvs.c @@ -2054,7 +2054,9 @@ int av1_init_ref_mv_common(AV1_COMMON *cm, const int ref_poc = cm->buffer_pool.frame_bufs[i].cur_frame_offset; cm->ref_frame_sign_bias[1 + i] = get_relative_dist(cm, ref_poc, cur_poc) > 0; } - av1_setup_motion_field(cm); + if (allow_ref_frame_mvs) { + av1_setup_motion_field(cm); + } return 0; } |