playsink: Don't fail if there are subtitles and audio but no video
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 23 Feb 2010 18:12:40 +0000 (19:12 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 9 Mar 2010 21:01:38 +0000 (21:01 +0000)
Change playbin2 to not error out if there are subtitles and audio
but no video. If visualizations are enabled the subtitles are rendered on top
of the visualization stream, otherwise the subtitles are not linked at all and
only the audio is played (and a warning message is posted).

If there are only subtitles but neither audio nor video an error message is
still posted.

Fixes bug #610866.

gst/playback/gstplaysink.c

index 78f9f05335fc2c3561c16f25b25dc351c9cd29e6..d25223ed867ca743578d2178b03b266ffa8ba2b2 100644 (file)
@@ -1829,20 +1829,16 @@ gst_play_sink_reconfigure (GstPlaySink * playsink)
 
   /* figure out which components we need */
   if (flags & GST_PLAY_FLAG_TEXT && playsink->text_pad) {
-    /* we have a text_pad and we need text rendering, in this case we need a
-     * video_pad to combine the video with the text */
-    if (!playsink->video_pad)
-      goto subs_but_no_video;
-
-    /* we have subtitles and we are requested to show it, we also need to show
-     * video in this case. */
-    need_video = TRUE;
+    /* we have subtitles and we are requested to show it */
     need_text = TRUE;
-  } else if (((flags & GST_PLAY_FLAG_VIDEO)
+  }
+
+  if (((flags & GST_PLAY_FLAG_VIDEO)
           || (flags & GST_PLAY_FLAG_NATIVE_VIDEO)) && playsink->video_pad) {
     /* we have video and we are requested to show it */
     need_video = TRUE;
   }
+
   if (playsink->audio_pad) {
     if ((flags & GST_PLAY_FLAG_AUDIO) || (flags & GST_PLAY_FLAG_NATIVE_AUDIO)) {
       need_audio = TRUE;
@@ -1856,6 +1852,26 @@ gst_play_sink_reconfigure (GstPlaySink * playsink)
       }
     }
   }
+
+  /* we have a text_pad and we need text rendering, in this case we need a
+   * video_pad to combine the video with the text or visualizations */
+  if (need_text && !need_video) {
+    if (playsink->video_pad) {
+      need_video = TRUE;
+    } else if (!need_audio) {
+      GST_ELEMENT_WARNING (playsink, STREAM, FORMAT,
+          (_("Can't play a text file without video or visualizations.")),
+          ("Have text pad but no video pad or visualizations"));
+      need_text = FALSE;
+    } else {
+      GST_ELEMENT_ERROR (playsink, STREAM, FORMAT,
+          (_("Can't play a text file without video or visualizations.")),
+          ("Have text pad but no video pad or visualizations"));
+      GST_PLAY_SINK_LOCK (playsink);
+      return FALSE;
+    }
+  }
+
   GST_DEBUG_OBJECT (playsink, "audio:%d, video:%d, vis:%d, text:%d", need_audio,
       need_video, need_vis, need_text);
 
@@ -1927,48 +1943,6 @@ gst_play_sink_reconfigure (GstPlaySink * playsink)
       gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), NULL);
   }
 
-  if (need_text) {
-    GST_DEBUG_OBJECT (playsink, "adding text");
-    if (!playsink->textchain) {
-      GST_DEBUG_OBJECT (playsink, "creating text chain");
-      playsink->textchain = gen_text_chain (playsink);
-    }
-    if (playsink->textchain) {
-      GST_DEBUG_OBJECT (playsink, "adding text chain");
-      if (playsink->textchain->overlay != NULL)
-        g_object_set (playsink->textchain->overlay, "silent", FALSE, NULL);
-      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 {
-    GST_DEBUG_OBJECT (playsink, "no text needed");
-    /* we have no subtitles/text or we are requested to not show them */
-    if (playsink->textchain) {
-      if (playsink->text_pad == NULL) {
-        /* no text pad, remove the chain entirely */
-        GST_DEBUG_OBJECT (playsink, "removing text chain");
-        add_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
-        activate_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
-      } else {
-        /* we have a chain and a textpad, turn the subtitles off */
-        GST_DEBUG_OBJECT (playsink, "turning off the text");
-        g_object_set (G_OBJECT (playsink->textchain->overlay), "silent", TRUE,
-            NULL);
-      }
-    }
-    if (!need_video && playsink->video_pad)
-      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), NULL);
-    if (playsink->text_pad && !playsink->textchain)
-      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad), NULL);
-  }
-
   if (need_audio) {
     gboolean raw, queue;
 
@@ -2080,20 +2054,64 @@ gst_play_sink_reconfigure (GstPlaySink * playsink)
       activate_chain (GST_PLAY_CHAIN (playsink->vischain), FALSE);
     }
   }
+
+  if (need_text) {
+    GST_DEBUG_OBJECT (playsink, "adding text");
+    if (!playsink->textchain) {
+      GST_DEBUG_OBJECT (playsink, "creating text chain");
+      playsink->textchain = gen_text_chain (playsink);
+    }
+    if (playsink->textchain) {
+      GST_DEBUG_OBJECT (playsink, "adding text chain");
+      if (playsink->textchain->overlay)
+        g_object_set (G_OBJECT (playsink->textchain->overlay), "silent", FALSE, NULL);
+      add_chain (GST_PLAY_CHAIN (playsink->textchain), TRUE);
+
+      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad),
+          playsink->textchain->textsinkpad);
+
+      if (need_vis) {
+        GstPad *srcpad;
+
+        srcpad =
+            gst_element_get_static_pad (playsink->vischain->chain.bin, "src");
+        gst_pad_unlink (srcpad, playsink->videochain->sinkpad);
+        gst_pad_link (srcpad, playsink->textchain->videosinkpad);
+        gst_object_unref (srcpad);
+      } else {
+        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 {
+    GST_DEBUG_OBJECT (playsink, "no text needed");
+    /* we have no subtitles/text or we are requested to not show them */
+    if (playsink->textchain) {
+      if (playsink->text_pad == NULL) {
+        /* no text pad, remove the chain entirely */
+        GST_DEBUG_OBJECT (playsink, "removing text chain");
+        add_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
+        activate_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE);
+      } else {
+        /* we have a chain and a textpad, turn the subtitles off */
+        GST_DEBUG_OBJECT (playsink, "turning off the text");
+        g_object_set (G_OBJECT (playsink->textchain->overlay), "silent", TRUE,
+            NULL);
+      }
+    }
+    if (!need_video && playsink->video_pad)
+      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), NULL);
+    if (playsink->text_pad && !playsink->textchain)
+      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad), NULL);
+  }
+
   do_async_done (playsink);
   GST_PLAY_SINK_UNLOCK (playsink);
 
   return TRUE;
-
-  /* ERRORS */
-subs_but_no_video:
-  {
-    GST_ELEMENT_ERROR (playsink, STREAM, FORMAT,
-        (_("Can't play a text file without video.")),
-        ("Have text pad but no video pad"));
-    GST_PLAY_SINK_UNLOCK (playsink);
-    return FALSE;
-  }
 }
 
 /**