From 6f80bad2bdb2269bdbadc3fa6f3118b777925944 Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Thu, 8 Dec 2022 21:24:14 -0300
Subject: [PATCH] picture: support creating and freeing refs without tile data

---
 src/decode.c  |  8 ++++----
 src/lib.c     | 12 ++++++------
 src/obu.c     |  4 ++--
 src/picture.c | 24 ++++++++++++------------
 4 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/decode.c b/src/decode.c
index 2ac190b2b..2c816338a 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -3426,7 +3426,7 @@ void dav1d_decode_frame_exit(Dav1dFrameContext *const f, const int retval) {
                (size_t)f->frame_thread.cf_sz * 128 * 128 / 2);
     }
     for (int i = 0; i < 7; i++) {
-        if (f->refp[i].p.data[0])
+        if (f->refp[i].p.frame_hdr)
             dav1d_thread_picture_unref(&f->refp[i]);
         dav1d_ref_dec(&f->ref_mvs_ref[i]);
     }
@@ -3832,7 +3832,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
     const unsigned refresh_frame_flags = f->frame_hdr->refresh_frame_flags;
     for (int i = 0; i < 8; i++) {
         if (refresh_frame_flags & (1 << i)) {
-            if (c->refs[i].p.p.data[0])
+            if (c->refs[i].p.p.frame_hdr)
                 dav1d_thread_picture_unref(&c->refs[i].p);
             dav1d_thread_picture_ref(&c->refs[i].p, &f->sr_cur);
 
@@ -3862,7 +3862,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
             dav1d_thread_picture_unref(&c->out);
             for (int i = 0; i < 8; i++) {
                 if (refresh_frame_flags & (1 << i)) {
-                    if (c->refs[i].p.p.data[0])
+                    if (c->refs[i].p.p.frame_hdr)
                         dav1d_thread_picture_unref(&c->refs[i].p);
                     dav1d_cdf_thread_unref(&c->cdf[i]);
                     dav1d_ref_dec(&c->refs[i].segmap);
@@ -3883,7 +3883,7 @@ error:
     if (f->frame_hdr->refresh_context)
         dav1d_cdf_thread_unref(&f->out_cdf);
     for (int i = 0; i < 7; i++) {
-        if (f->refp[i].p.data[0])
+        if (f->refp[i].p.frame_hdr)
             dav1d_thread_picture_unref(&f->refp[i]);
         dav1d_ref_dec(&f->ref_mvs_ref[i]);
     }
diff --git a/src/lib.c b/src/lib.c
index 841b32d21..ea66ae464 100644
--- a/src/lib.c
+++ b/src/lib.c
@@ -561,16 +561,16 @@ error:
 
 void dav1d_flush(Dav1dContext *const c) {
     dav1d_data_unref_internal(&c->in);
-    if (c->out.p.data[0])
+    if (c->out.p.frame_hdr)
         dav1d_thread_picture_unref(&c->out);
-    if (c->cache.p.data[0])
+    if (c->cache.p.frame_hdr)
         dav1d_thread_picture_unref(&c->cache);
 
     c->drain = 0;
     c->cached_error = 0;
 
     for (int i = 0; i < 8; i++) {
-        if (c->refs[i].p.p.data[0])
+        if (c->refs[i].p.p.frame_hdr)
             dav1d_thread_picture_unref(&c->refs[i].p);
         dav1d_ref_dec(&c->refs[i].segmap);
         dav1d_ref_dec(&c->refs[i].refmvs);
@@ -625,7 +625,7 @@ void dav1d_flush(Dav1dContext *const c) {
             f->n_tile_data = 0;
             f->task_thread.retval = 0;
             Dav1dThreadPicture *out_delayed = &c->frame_thread.out_delayed[next];
-            if (out_delayed->p.data[0]) {
+            if (out_delayed->p.frame_hdr) {
                 dav1d_thread_picture_unref(out_delayed);
             }
         }
@@ -704,7 +704,7 @@ static COLD void close_internal(Dav1dContext **const c_out, int flush) {
     dav1d_free_aligned(c->fc);
     if (c->n_fc > 1 && c->frame_thread.out_delayed) {
         for (unsigned n = 0; n < c->n_fc; n++)
-            if (c->frame_thread.out_delayed[n].p.data[0])
+            if (c->frame_thread.out_delayed[n].p.frame_hdr)
                 dav1d_thread_picture_unref(&c->frame_thread.out_delayed[n]);
         free(c->frame_thread.out_delayed);
     }
@@ -713,7 +713,7 @@ static COLD void close_internal(Dav1dContext **const c_out, int flush) {
     free(c->tile);
     for (int n = 0; n < 8; n++) {
         dav1d_cdf_thread_unref(&c->cdf[n]);
-        if (c->refs[n].p.p.data[0])
+        if (c->refs[n].p.p.frame_hdr)
             dav1d_thread_picture_unref(&c->refs[n].p);
         dav1d_ref_dec(&c->refs[n].refmvs);
         dav1d_ref_dec(&c->refs[n].segmap);
diff --git a/src/obu.c b/src/obu.c
index 068a50c03..47ab11779 100644
--- a/src/obu.c
+++ b/src/obu.c
@@ -1257,7 +1257,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
             dav1d_ref_dec(&c->mastering_display_ref);
             dav1d_ref_dec(&c->content_light_ref);
             for (int i = 0; i < 8; i++) {
-                if (c->refs[i].p.p.data[0])
+                if (c->refs[i].p.p.frame_hdr)
                     dav1d_thread_picture_unref(&c->refs[i].p);
                 dav1d_ref_dec(&c->refs[i].segmap);
                 dav1d_ref_dec(&c->refs[i].refmvs);
@@ -1601,7 +1601,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
                 for (int i = 0; i < 8; i++) {
                     if (i == r) continue;
 
-                    if (c->refs[i].p.p.data[0])
+                    if (c->refs[i].p.p.frame_hdr)
                         dav1d_thread_picture_unref(&c->refs[i].p);
                     dav1d_thread_picture_ref(&c->refs[i].p, &c->refs[r].p);
 
diff --git a/src/picture.c b/src/picture.c
index 544828fe4..58ebd824d 100644
--- a/src/picture.c
+++ b/src/picture.c
@@ -233,13 +233,13 @@ void dav1d_picture_ref(Dav1dPicture *const dst, const Dav1dPicture *const src) {
     if (src->ref) {
         validate_input(src->data[0] != NULL);
         dav1d_ref_inc(src->ref);
-        if (src->frame_hdr_ref) dav1d_ref_inc(src->frame_hdr_ref);
-        if (src->seq_hdr_ref) dav1d_ref_inc(src->seq_hdr_ref);
-        if (src->m.user_data.ref) dav1d_ref_inc(src->m.user_data.ref);
-        if (src->content_light_ref) dav1d_ref_inc(src->content_light_ref);
-        if (src->mastering_display_ref) dav1d_ref_inc(src->mastering_display_ref);
-        if (src->itut_t35_ref) dav1d_ref_inc(src->itut_t35_ref);
     }
+    if (src->frame_hdr_ref) dav1d_ref_inc(src->frame_hdr_ref);
+    if (src->seq_hdr_ref) dav1d_ref_inc(src->seq_hdr_ref);
+    if (src->m.user_data.ref) dav1d_ref_inc(src->m.user_data.ref);
+    if (src->content_light_ref) dav1d_ref_inc(src->content_light_ref);
+    if (src->mastering_display_ref) dav1d_ref_inc(src->mastering_display_ref);
+    if (src->itut_t35_ref) dav1d_ref_inc(src->itut_t35_ref);
     *dst = *src;
 }
 
@@ -282,13 +282,13 @@ void dav1d_picture_unref_internal(Dav1dPicture *const p) {
     if (p->ref) {
         validate_input(p->data[0] != NULL);
         dav1d_ref_dec(&p->ref);
-        dav1d_ref_dec(&p->seq_hdr_ref);
-        dav1d_ref_dec(&p->frame_hdr_ref);
-        dav1d_ref_dec(&p->m.user_data.ref);
-        dav1d_ref_dec(&p->content_light_ref);
-        dav1d_ref_dec(&p->mastering_display_ref);
-        dav1d_ref_dec(&p->itut_t35_ref);
     }
+    dav1d_ref_dec(&p->seq_hdr_ref);
+    dav1d_ref_dec(&p->frame_hdr_ref);
+    dav1d_ref_dec(&p->m.user_data.ref);
+    dav1d_ref_dec(&p->content_light_ref);
+    dav1d_ref_dec(&p->mastering_display_ref);
+    dav1d_ref_dec(&p->itut_t35_ref);
     memset(p, 0, sizeof(*p));
     dav1d_data_props_set_defaults(&p->m);
 }
-- 
GitLab