videodecoder: make _release_frame external API
authorMark Nauwelaerts <mnauw@users.sourceforge.net>
Tue, 26 Nov 2013 19:50:33 +0000 (20:50 +0100)
committerMark Nauwelaerts <mnauw@users.sourceforge.net>
Sun, 1 Dec 2013 11:06:37 +0000 (12:06 +0100)
... so subclasses can release a frame all the way (also from frame list)
without having to pass through _finish_frame or _drop_frame.
The latter may not be applicable, or may or may not have already
been called for the frame in question.

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

gst-libs/gst/video/gstvideodecoder.c
gst-libs/gst/video/gstvideodecoder.h

index c2808b0722cb16c6950999fcc8b0a9eace18da30..ca73a461f71cc24acc2cee65283418fce72600e5 100644 (file)
@@ -436,8 +436,6 @@ static void gst_video_decoder_reset (GstVideoDecoder * decoder, gboolean full,
 static GstFlowReturn gst_video_decoder_decode_frame (GstVideoDecoder * decoder,
     GstVideoCodecFrame * frame);
 
-static void gst_video_decoder_release_frame (GstVideoDecoder * dec,
-    GstVideoCodecFrame * frame);
 static GstClockTime gst_video_decoder_get_frame_duration (GstVideoDecoder *
     decoder, GstVideoCodecFrame * frame);
 static GstVideoCodecFrame *gst_video_decoder_new_frame (GstVideoDecoder *
@@ -2345,18 +2343,31 @@ no_output_buffer:
   }
 }
 
-static void
+/**
+ * gst_video_decoder_release_frame:
+ * @dec: a #GstVideoDecoder
+ * @frame: (transfer full): the #GstVideoCodecFrame to release
+ *
+ * Similar to gst_video_decoder_drop_frame(), but simply releases @frame
+ * without any processing other than removing it from list of pending frames,
+ * after which it is considered finished and released.
+ *
+ * Since: 1.4
+ */
+void
 gst_video_decoder_release_frame (GstVideoDecoder * dec,
     GstVideoCodecFrame * frame)
 {
   GList *link;
 
   /* unref once from the list */
+  GST_VIDEO_DECODER_STREAM_LOCK (dec);
   link = g_list_find (dec->priv->frames, frame);
   if (link) {
     gst_video_codec_frame_unref (frame);
     dec->priv->frames = g_list_delete_link (dec->priv->frames, link);
   }
+  GST_VIDEO_DECODER_STREAM_UNLOCK (dec);
 
   /* unref because this function takes ownership */
   gst_video_codec_frame_unref (frame);
index 1bdb37dcddeb8e04c58e46a18d8d96ba34d8e4b1..abe2fbb421bee4431606a5033f1f1d2e43428be9 100644 (file)
@@ -366,6 +366,9 @@ GstFlowReturn    gst_video_decoder_finish_frame (GstVideoDecoder *decoder,
 GstFlowReturn    gst_video_decoder_drop_frame (GstVideoDecoder *dec,
                                               GstVideoCodecFrame *frame);
 
+void             gst_video_decoder_release_frame (GstVideoDecoder * dec,
+                                                 GstVideoCodecFrame * frame);
+
 void             gst_video_decoder_merge_tags (GstVideoDecoder *dec,
                                                const GstTagList *tags,
                                                GstTagMergeMode mode);