omxbufferpool: fix race when releasing input buffers
authorGuillaume Desmottes <guillaume.desmottes@collabora.com>
Mon, 7 Jan 2019 12:29:37 +0000 (13:29 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.com>
Tue, 8 Jan 2019 15:04:31 +0000 (16:04 +0100)
If buffers were released from the pool while
gst_omx_video_enc_handle_frame() was waiting for new buffers,
gst_omx_port_acquire_buffer() was never awaken as the buffers weren't
released through OMX's messaging system.

GQueue isn't thread safe so also protect it with the lock mutex.

omx/gstomx.c
omx/gstomx.h
omx/gstomxbufferpool.c

index 3c0953b..121e97c 100644 (file)
@@ -2554,6 +2554,17 @@ gst_omx_port_wait_buffers_released (GstOMXPort * port, GstClockTime timeout)
   return err;
 }
 
+void
+gst_omx_port_requeue_buffer (GstOMXPort * port, GstOMXBuffer * buf)
+{
+  g_mutex_lock (&port->comp->lock);
+  g_queue_push_tail (&port->pending_buffers, buf);
+  g_mutex_unlock (&port->comp->lock);
+
+  /* awake gst_omx_port_acquire_buffer() */
+  gst_omx_component_send_message (port->comp, NULL);
+}
+
 /* NOTE: Uses comp->lock and comp->messages_lock */
 OMX_ERRORTYPE
 gst_omx_port_set_enabled (GstOMXPort * port, gboolean enabled)
index d61303c..4b61343 100644 (file)
@@ -461,6 +461,7 @@ OMX_ERRORTYPE     gst_omx_port_use_eglimages (GstOMXPort *port, const GList *ima
 OMX_ERRORTYPE     gst_omx_port_deallocate_buffers (GstOMXPort *port);
 OMX_ERRORTYPE     gst_omx_port_populate (GstOMXPort *port);
 OMX_ERRORTYPE     gst_omx_port_wait_buffers_released (GstOMXPort * port, GstClockTime timeout);
+void              gst_omx_port_requeue_buffer (GstOMXPort * port, GstOMXBuffer * buf);
 
 OMX_ERRORTYPE     gst_omx_port_mark_reconfigured (GstOMXPort * port);
 
index 910f3ff..9700cd6 100644 (file)
@@ -669,7 +669,7 @@ gst_omx_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer)
                 gst_omx_error_to_string (err), err));
       }
     } else if (pool->port->port_def.eDir == OMX_DirInput) {
-      g_queue_push_tail (&pool->port->pending_buffers, omx_buf);
+      gst_omx_port_requeue_buffer (pool->port, omx_buf);
     }
   }
 }