videodecoder: return NULL from _allocate_output_buffer() if alloc fails
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Wed, 17 Oct 2012 09:55:01 +0000 (10:55 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Wed, 17 Oct 2012 09:55:01 +0000 (10:55 +0100)
.. instead of garbage pointer. Also log failure in debug log.
Should've returned the flow return like _allocate_output_frame().

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

gst-libs/gst/video/gstvideodecoder.c

index 4292a9c..9e830ff 100644 (file)
@@ -3032,11 +3032,16 @@ gst_video_decoder_negotiate (GstVideoDecoder * decoder)
  * Helper function that allocates a buffer to hold a video frame for @decoder's
  * current #GstVideoCodecState.
  *
- * Returns: (transfer full): allocated buffer
+ * You should use gst_video_decoder_allocate_output_frame() instead of this
+ * function, if possible at all.
+ *
+ * Returns: (transfer full): allocated buffer, or NULL if no buffer could be
+ *     allocated (e.g. when downstream is flushing or shutting down)
  */
 GstBuffer *
 gst_video_decoder_allocate_output_buffer (GstVideoDecoder * decoder)
 {
+  GstFlowReturn flow;
   GstBuffer *buffer;
 
   GST_DEBUG ("alloc src buffer");
@@ -3047,10 +3052,16 @@ gst_video_decoder_allocate_output_buffer (GstVideoDecoder * decoder)
               && gst_pad_check_reconfigure (decoder->srcpad))))
     gst_video_decoder_negotiate (decoder);
 
-  gst_buffer_pool_acquire_buffer (decoder->priv->pool, &buffer, NULL);
+  flow = gst_buffer_pool_acquire_buffer (decoder->priv->pool, &buffer, NULL);
 
   GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
 
+  if (flow != GST_FLOW_OK) {
+    GST_INFO_OBJECT (decoder, "couldn't allocate output buffer, flow %s",
+        gst_flow_get_name (flow));
+    buffer = NULL;
+  }
+
   return buffer;
 }