msmith gst-plugins-base: gst-plugins-base/ gst-plugins-base/gst/playback/

[email protected]
Newsgroups gmane.comp.video.gstreamer.cvs
Message-ID <[email protected]>
CVS Root:       /cvs/gstreamer
Module:         gst-plugins-base
Changes by:     msmith
Date:           Thu Nov 20 2008  22:11:52 UTC

Log message:
    * gst/playback/gstdecodebin2.c:
      If the top-level type of the stream is plain text, don't try to decode
      it, matching behaviour of decodebin.
    * gst/playback/gstplaysink.c:
      If we fail to generate a text chain (e.g. due to missing optional
      plugins), don't crash.

Modified files:
    .               : ChangeLog
    gst/playback    : gstdecodebin2.c gstplaysink.c

Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.4202&r2=1.4203
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstdecodebin2.c.diff?r1=1.50&r2=1.51
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaysink.c.diff?r1=1.18&r2=1.19

====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v
retrieving revision 1.4202
retrieving revision 1.4203
diff -u -d -r1.4202 -r1.4203
--- ChangeLog	20 Nov 2008 22:06:03 -0000	1.4202
+++ ChangeLog	20 Nov 2008 22:11:35 -0000	1.4203
@@ -1,5 +1,14 @@
 2008-11-20  Michael Smith <[email protected]>
 
+	* gst/playback/gstdecodebin2.c:
+	  If the top-level type of the stream is plain text, don't try to decode
+	  it, matching behaviour of decodebin.
+	* gst/playback/gstplaysink.c:
+	  If we fail to generate a text chain (e.g. due to missing optional
+	  plugins), don't crash.
+
+2008-11-20  Michael Smith <[email protected]>
 	* gst-libs/gst/rtsp/gstrtspdefs.c:
 	  Fix win32 build. Oops.
Index: gstdecodebin2.c
RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstdecodebin2.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- gstdecodebin2.c	8 Oct 2008 14:44:04 -0000	1.50
+++ gstdecodebin2.c	20 Nov 2008 22:11:38 -0000	1.51
@@ -1416,6 +1416,16 @@
   GST_DEBUG_OBJECT (decode_bin, "typefind found caps %" GST_PTR_FORMAT, caps);
+  /* If the typefinder (but not something else) finds text/plain - i.e. that's
+   * the top-level type of the file - then error out.
+   */
+  if (gst_structure_has_name (gst_caps_get_structure (caps, 0), "text/plain")) {
+    GST_ELEMENT_ERROR (decode_bin, STREAM, WRONG_TYPE,
+        (_("This appears to be a text file")),
+        ("decodebin2 cannot decode plain text files"));
+    goto exit;
+  }
   /* we can only deal with one type, we don't yet support dynamically changing
    * caps from the typefind element */
   if (decode_bin->have_type)
@@ -1425,7 +1435,7 @@
   pad = gst_element_get_static_pad (typefind, "src");
-  analyze_new_pad (decode_bin, typefind, pad, caps, NULL);
+  analyze_new_paypefind, pad, caps, NULL);
   gst_object_unref (pad);
@@ -1434,7 +1444,8 @@
 }
 static void
-pad_added_group_cb (GstElement * element, GstPad * pad, GstDecodeGroup * group)
+    pad_added_group_cb (GstElement * element, GstPad * pad,
+    GstDecodeGroup * group)
 {
   GstCaps *caps;
   gboolean expose = FALSE;
@@ -1463,7 +1474,7 @@
-pad_removed_group_cb (GstElement * element, GstPad * pad,
+    pad_removed_group_cb (GstElement * element, GstPad * pad,
     GstDecodeGroup * group)
   GST_LOG_OBJECT (pad, "pad removed, group:%p", group);
@@ -1472,8 +1483,7 @@
    * removed when the group's multiqueue is drained */
-static void
-no_more_pads_group_cb (GstElement * element, GstDecodeGroup * group)
+static void no_more_pads_group_cb (GstElement * element, GstDecodeGroup * group)
   GST_LOG_OBJECT (element, "no more pads, setting group %p to complete", group);
@@ -1482,7 +1492,7 @@
-pad_added_cb (GstElement * element, GstPad * pad, GstDecodeBin * dbin)
+    pad_added_cb (GstElement * element, GstPad * pad, GstDecodeBin * dbin)
@@ -1495,13 +1505,12 @@
-pad_removed_cb (GstElement * element, GstPad * pad, GstDecodeBin * dbin)
+    pad_removed_cb (GstElement * element, GstPad * pad, GstDecodeBin * dbin)
   GST_LOG_OBJECT (pad, "Pad removed from non-grouped element");
-no_more_pads_cb (GstElement * element, GstDecodeBin * dbin)
+static void no_more_pads_cb (GstElement * element, GstDecodeBin * dbin)
   GstDecodeGroup *group;
@@ -1522,7 +1531,7 @@
-caps_notify_cb (GstPad * pad, GParamSpec * unused, GstDecodeBin * dbin)
+    caps_notify_cb (GstPad * pad, GParamSpec * unused, GstDecodeBin * dbin)
   GstElement *element;
@@ -1537,7 +1546,8 @@
-caps_notify_group_cb (GstPad * pad, GParamSpec * unused, GstDecodeGroup * group)
+    caps_notify_group_cb (GstPad * pad, GParamSpec * unused,
@@ -1552,8 +1562,7 @@
 /* Decide whether an element is a demuxer based on the 
  * klass and number/type of src pad templates it has */
-static gboolean
-is_demuxer_element (GstElement * srcelement)
+static gboolean is_demuxer_element (GstElement * srcelement)
   GstElementFactory *srcfactory;
   GstElementClass *elemclass;
@@ -1605,8 +1614,7 @@
  * 
  * The decodebin_lock should be taken !
  */
-are_raw_caps (GstDecodeBin * dbin, GstCaps * caps)
+static gboolean are_raw_caps (GstDecodeBin * dbin, GstCaps * caps)
   GstCaps *intersection;
   gboolean res;
@@ -1632,8 +1640,7 @@
  * GstDecodeGroup functions
  ****/
-multi_queue_overrun_cb (GstElement * queue, GstDecodeGroup * group)
+static void multi_queue_overrun_cb (GstElement * queue, GstDecodeGroup * group)
   GST_LOG_OBJECT (group->dbin, "multiqueue is full");
@@ -1648,8 +1655,8 @@
  * Creates a new GstDecodeGroup. It is up to the caller to add it to the list
  * of groups.
-static GstDecodeGroup *
-gst_decode_group_new (GstDecodeBin * dbin, gboolean use_queue)
+static GstDecodeGroup *gst_decode_group_new (GstDecodeBin * dbin,
+    gboolean use_queue)
   GstElement *mq;
@@ -1703,8 +1710,7 @@
  *
  * Returns: %NULL if no groups are available, or all groups are completed.
-get_current_group (GstDecodeBin * dbin)
+static GstDecodeGroup *get_current_group (GstDecodeBin * dbin)
   GList *tmp;
   GstDecodeGroup *group = NULL;
@@ -1734,8 +1740,8 @@
  * Returns the srcpad of the multiqueue corresponding the given pad.
  * Returns NULL if there was an error.
-static GstPad *
-gst_decode_group_control_demuxer_pad (GstDecodeGroup * group, GstPad * pad)
+static GstPad *gst_decode_group_control_demuxer_pad (GstDecodeGroup * group,
+    GstPad * pad)
   GstPad *srcpad, *sinkpad;
   gchar *nb, *sinkname, *srcname;
@@ -1778,7 +1784,7 @@
 static gboolean
-gst_decode_group_control_source_pad (GstDecodeGroup * group,
+    gst_decode_group_control_source_pad (GstDecodeGroup * group,
     GstDecodePad * dpad)
   g_return_val_if_fail (group != NULL, FALSE);
@@ -1803,8 +1809,7 @@
  * Call with the group lock taken ! MT safe
-gst_decode_group_check_if_blocked (GstDecodeGroup * group)
+static void gst_decode_group_check_if_blocked (GstDecodeGroup * group)
   gboolean blocked = TRUE;
@@ -1842,8 +1847,7 @@
   DECODE_BIN_UNLOCK (group->dbin);
-gst_decode_group_check_if_drained (GstDecodeGroup * group)
+static void gst_decode_group_check_if_drained (GstDecodeGroup * group)
   GstDecodeBin *dbin = group->dbin;
@@ -1906,8 +1910,7 @@
  * Return: negative if a<b, 0 if a==b, positive if a>b
-static gint
-sort_end_pads (GstDecodePad * da, GstDecodePad * db)
+static gint sort_end_pads (GstDecodePad * da, GstDecodePad * db)
   gint va, vb;
   GstCaps *capsa, *capsb;
@@ -1957,8 +1960,7 @@
  * Not MT safe, please take the group lock
-gst_decode_group_expose (GstDecodeGroup * group)
+static gboolean gst_decode_group_expose (GstDecodeGroup * group)
   GList *next = NULL;
@@ -2080,8 +2082,7 @@
   return FALSE;
-gst_decode_group_hide (GstDecodeGroup * group)
+static void gst_decode_group_hide (GstDecodeGroup * group)
@@ -2107,7 +2108,7 @@
-deactivate_free_recursive (GstDecodeGroup * group, GstElement * element)
+    deactivate_free_recursive (GstDecodeGroup * group, GstElement * element)
   GstIterator *it;
   GstIteratorResult res;
@@ -2174,8 +2175,7 @@
   return;
-gst_decode_group_free (GstDecodeGroup * group)
+static void gst_decode_group_free (GstDecodeGroup * group)
@@ -2223,8 +2223,7 @@
  * MT safe
-gst_decode_group_set_complete (GstDecodeGroup * group)
+static void gst_decode_group_set_complete (GstDecodeGroup * group)
   GST_LOG_OBJECT (group->dbin, "Setting group %p to COMPLETE", group);
@@ -2240,13 +2239,11 @@
  * GstDecodePad functions
  *************************/
-gst_decode_pad_class_init (GstDecodePadClass * klass)
+static void gst_decode_pad_class_init (GstDecodePadClass * klass)
-gst_decode_pad_init (GstDecodePad * pad)
+static void gst_decode_pad_init (GstDecodePad * pad)
   pad->group = NULL;
   pad->blocked = FALSE;
@@ -2256,7 +2253,8 @@
-source_pad_blocked_cb (GstDecodePad * dpad, gboolean blocked, gpointer unused)
+    source_pad_blocked_cb (GstDecodePad * dpad, gboolean blocked,
+    gpointer unused)
   GST_LOG_OBJECT (dpad, "blocked:%d, dpad->group:%p", blocked, dpad->group);
@@ -2271,7 +2269,7 @@
-source_pad_event_probe (GstPad * pad, GstEvent * event, GstDecodePad * dpad)
+    source_pad_event_probe (GstPad * pad, GstEvent * event, GstDecodePad * dpad)
   GST_LOG_OBJECT (pad, "%s dpad:%p", GST_EVENT_TYPE_NAME (event), dpad);
@@ -2290,22 +2288,20 @@
   return TRUE;
-gst_decode_pad_set_blocked (GstDecodePad * dpad, gboolean blocked)
+static void gst_decode_pad_set_blocked (GstDecodePad * dpad, gboolean blocked)
   gst_pad_set_blocked_async (GST_PAD (dpad), blocked,
       (GstPadBlockCallback) source_pad_blocked_cb, NULL);
-gst_decode_pad_add_drained_check (GstDecodePad * dpad)
+static void gst_decode_pad_add_drained_check (GstDecodePad * dpad)
   gst_pad_add_event_probe (GST_PAD (dpad),
       G_CALLBACK (source_pad_event_probe), dpad);
-gst_decode_pad_activate (GstDecodePad * dpad, GstDecodeGroup * group)
+    gst_decode_pad_activate (GstDecodePad * dpad, GstDecodeGroup * group)
   g_return_if_fail (group != NULL);
@@ -2315,8 +2311,7 @@
   gst_decode_pad_add_drained_check (dpad);
-gst_decode_pad_unblock (GstDecodePad * dpad)
+static void gst_decode_pad_unblock (GstDecodePad * dpad)
   gst_decode_pad_set_blocked (dpad, FALSE);
@@ -2325,8 +2320,8 @@
  * Creates a new GstDecodePad for the given pad.
-static GstDecodePad *
-gst_decode_pad_new (GstDecodeBin * dbin, GstPad * pad, GstDecodeGroup * group)
+static GstDecodePad *gst_decode_pad_new (GstDecodeBin * dbin, GstPad * pad,
   GstDecodePad *dpad;
@@ -2345,8 +2340,7 @@
  * Element add/remove
  *****/
-do_async_start (GstDecodeBin * dbin)
+static void do_async_start (GstDecodeBin * dbin)
   GstMessage *message;
@@ -2356,8 +2350,7 @@
   parent_class->handle_message (GST_BIN_CAST (dbin), message);
-do_async_done (GstDecodeBin * dbin)
+static void do_async_done (GstDecodeBin * dbin)
@@ -2379,8 +2372,7 @@
  * any.
-find_sink_pad (GstElement * element)
+static GstPad *find_sink_pad (GstElement * element)
   GstPad *pad = NULL;
@@ -2397,7 +2389,8 @@
 static GstStateChangeReturn
-gst_decode_bin_change_state (GstElement * element, GstStateChange transition)
+    gst_decode_bin_change_state (GstElement * element,
+    GstStateChange transition)
   GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
   GstDecodeBin *dbin = GST_DECODE_BIN (element);
@@ -2449,9 +2442,7 @@
   }
-gboolean
-gst_decode_bin_plugin_init (GstPlugin * plugin)
-{
+gboolean gst_decode_bin_plugin_init (GstPlugin * plugin) {
   GST_DEBUG_CATEGORY_INIT (gst_decode_bin_debug, "decodebin2", 0,
       "decoder bin");
Index: gstplaysink.c
RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaysink.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- gstplaysink.c	10 Nov 2008 10:33:26 -0000	1.18
+++ gstplaysink.c	20 Nov 2008 22:11:38 -0000	1.19
@@ -1238,13 +1238,15 @@
     if (!playsink->textchain) {
       playsink->textchain = gen_text_chain (playsink);
     }
-    add_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
-    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad),
-        playsink->textchain->textsinkpad);
-    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad),
-        playsink->textchain->videosinkpad);
-    gst_pad_link (playsink->textchain->srcpad, playsink->videochain->sinkpad);
-    activate_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
+    if (playsink->textchain) {
+      add_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
+      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad),
+          playsink->textchain->textsinkpad);
+      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad),
+          playsink->textchain->videosinkpad);
+      gst_pad_link (playsink->textchain->srcpad, playsink->videochain->sinkpad);
+      activate_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
+    }
   } else {
     /* we have no subtitles/text or we are requested to not show them */
     if (playsink->textchain) {

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.