Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/videolan/dav1d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2018-11-09 00:20:26 +0300
committerRonald S. Bultje <rsbultje@gmail.com>2018-11-09 00:20:26 +0300
commit1ddd4cb83b1a214798a047fcec7b50f4f0234369 (patch)
tree337bda5d15a87aa0343e3e2c9a26698ef00234ad
parent39b35e34c85c07dc21c4242d1372934a674cac22 (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.c8
-rw-r--r--src/obu.c13
-rw-r--r--src/ref_mvs.c4
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];
diff --git a/src/obu.c b/src/obu.c
index 560bc6e..1404d5c 100644
--- a/src/obu.c
+++ b/src/obu.c
@@ -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;
}