omxvideodec: prevent timeout when shutting down because of pending out buffers
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 25 Jul 2018 07:57:20 +0000 (09:57 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Thu, 30 Aug 2018 08:59:30 +0000 (10:59 +0200)
The OMX transition state to Loaded won't be complete until all buffers
have been freed. There is no point waiting, and timeout, if we know that
output buffers haven't been freed yet.

The typical scenario is output buffers being still used downstream
and being freed later when released back to the pool.

https://bugzilla.gnome.org/show_bug.cgi?id=796918

omx/gstomxvideodec.c

index 6791fb7..5f86da5 100644 (file)
@@ -408,8 +408,15 @@ gst_omx_video_dec_shutdown (GstOMXVideoDec * self)
     gst_omx_component_set_state (self->dec, OMX_StateLoaded);
     gst_omx_port_deallocate_buffers (self->dec_in_port);
     gst_omx_video_dec_deallocate_output_buffers (self);
-    if (state > OMX_StateLoaded)
-      gst_omx_component_get_state (self->dec, 5 * GST_SECOND);
+    if (state > OMX_StateLoaded) {
+      if (self->dec_out_port->buffers)
+        /* Don't wait for the state transition if the pool still has outstanding
+         * buffers as it will timeout anyway */
+        GST_WARNING_OBJECT (self,
+            "Output buffers haven't been freed; still owned downstream?");
+      else
+        gst_omx_component_get_state (self->dec, 5 * GST_SECOND);
+    }
   }
 
   return TRUE;