shithub: dav1d

Download patch

ref: 6bc4acf43c3f76fec817b5fb4e3b4ada4ae41ad6
parent: 32908aae0f99eae453ed4e255978e3365abd123e
author: Janne Grunau <[email protected]>
date: Sun Dec 9 06:21:25 EST 2018

svc: move spatial layer check out of output_picture

Prevents unnecessary returns from get_picture and fixes wrong return
value when a lower spatial level was dropped from output_picture()
(0 without a valid picture instead of -EAGAIN).

--- a/src/lib.c
+++ b/src/lib.c
@@ -248,15 +248,6 @@
     int has_grain = fgdata->num_y_points || fgdata->num_uv_points[0] ||
                     fgdata->num_uv_points[1];
 
-    // skip lower spatial layers
-    if (c->operating_point_idc && !c->all_layers) {
-        const int max_spatial_id = ulog2(c->operating_point_idc >> 8);
-        if (max_spatial_id > in->frame_hdr->spatial_id) {
-            dav1d_picture_unref(in);
-            return 0;
-        }
-    }
-
     // If there is nothing to be done, skip the allocation/copy
     if (!c->apply_grain || !has_grain) {
         dav1d_picture_move_ref(out, in);
@@ -291,6 +282,22 @@
     return 0;
 }
 
+static int output_picture_ready(Dav1dContext *const c) {
+
+    if (!c->out.data[0]) return 0;
+
+    // skip lower spatial layers
+    if (c->operating_point_idc && !c->all_layers) {
+        const int max_spatial_id = ulog2(c->operating_point_idc >> 8);
+        if (max_spatial_id > c->out.frame_hdr->spatial_id) {
+            dav1d_picture_unref(&c->out);
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
 static int drain_picture(Dav1dContext *const c, Dav1dPicture *const out) {
     unsigned drain_count = 0;
     do {
@@ -312,7 +319,7 @@
             if (out_delayed->visible && progress != FRAME_ERROR)
                 dav1d_picture_ref(&c->out, &out_delayed->p);
             dav1d_thread_picture_unref(out_delayed);
-            if (c->out.data[0])
+            if (output_picture_ready(c))
                 return output_image(c, out, &c->out);
         }
     } while (++drain_count < c->n_fc);
@@ -346,13 +353,13 @@
             in->data += res;
             if (!in->sz) dav1d_data_unref(in);
         }
-        if (c->out.data[0])
+        if (output_picture_ready(c))
             break;
         if (res < 0)
             return res;
     }
 
-    if (c->out.data[0])
+    if (output_picture_ready(c))
         return output_image(c, out, &c->out);
 
     if (c->n_fc > 1 && drain)