shithub: dav1d

Download patch

ref: c2e0490c0f5c2b326787a9b7200c8ac543cbf323
parent: d5cc850312ac712f33cdd35a09f36f338bd1644a
author: James Almer <[email protected]>
date: Wed Feb 13 19:56:00 EST 2019

lib: also free internal buffers when flushing with one frame thread

--- a/src/lib.c
+++ b/src/lib.c
@@ -392,6 +392,22 @@
     dav1d_data_unref_internal(&c->in);
     c->drain = 0;
 
+    for (int i = 0; i < 8; i++) {
+        if (c->refs[i].p.p.data[0])
+            dav1d_thread_picture_unref(&c->refs[i].p);
+        dav1d_ref_dec(&c->refs[i].segmap);
+        dav1d_ref_dec(&c->refs[i].refmvs);
+        dav1d_cdf_thread_unref(&c->cdf[i]);
+    }
+    c->frame_hdr = NULL;
+    c->seq_hdr = NULL;
+    dav1d_ref_dec(&c->seq_hdr_ref);
+
+    c->mastering_display = NULL;
+    c->content_light = NULL;
+    dav1d_ref_dec(&c->mastering_display_ref);
+    dav1d_ref_dec(&c->content_light_ref);
+
     if (c->n_fc == 1) return;
 
     // mark each currently-running frame as flushing, so that we
@@ -413,22 +429,6 @@
             dav1d_thread_picture_unref(out_delayed);
     }
     atomic_store(c->frame_thread.flush, 0);
-
-    for (int i = 0; i < 8; i++) {
-        if (c->refs[i].p.p.data[0])
-            dav1d_thread_picture_unref(&c->refs[i].p);
-        dav1d_ref_dec(&c->refs[i].segmap);
-        dav1d_ref_dec(&c->refs[i].refmvs);
-        dav1d_cdf_thread_unref(&c->cdf[i]);
-    }
-    c->frame_hdr = NULL;
-    c->seq_hdr = NULL;
-    dav1d_ref_dec(&c->seq_hdr_ref);
-
-    c->mastering_display = NULL;
-    c->content_light = NULL;
-    dav1d_ref_dec(&c->mastering_display_ref);
-    dav1d_ref_dec(&c->content_light_ref);
 
     c->frame_thread.next = 0;
 }