XOverlay lost after setting playbin state to Null

Ralph ralph.gucwa at racelogic.co.uk
Mon Nov 28 06:48:58 PST 2011


I'm developing a C# WPF application using OSSBuild and gstreamersharp. I'm
using XOverlayAdapter to display video on a hosted WindowsForms control to
which I have a Windows handle. Everything is working nicely except the
situation when I set the playbin2 state to Null which is required for
changing the source or changing the pipeline structure.
This is exactly what I'm doing (I stripped out all checks if the elements
have been created correctly):

1. Create a playbin

      Gst.BasePlugins.PlayBin2 playBin = new Gst.BasePlugins.PlayBin2();
      playBin.PlayFlags &= ~((Gst.BasePlugins.PlayBin2.PlayFlagsType)(1 <<
2));
      playBin.Bus.AddSignalWatch();
      playBin.Bus.EnableSyncMessageEmission();
      playBin.Bus.Message += new Gst.MessageHandler(OnPlayBinMessage);

2. Create a videosink

      Gst.Video.VideoSink videoSink =
Gst.ElementFactory.Make("dshowvideosink") as Gst.Video.VideoSink;
      videoSink["force-aspect-ratio"] = true;

3. Associate the videosink with a WindowsForms control (screen) to display
the video in a rectangular area in my WPF window.

      Gst.Interfaces.XOverlayAdapter overlayAdapter = new
Gst.Interfaces.XOverlayAdapter(videoSink.Handle);
      overlayAdapter.XwindowId = (ulong)screen.Handle;

4. Attach the videosink to the playbin

      playBin.VideoSink = videoSink;

5. Set playbin's URI to some video file on my hard drive

      playBin.SetState(Gst.State.Null);
      playBin.Uri = @"file:///" + fileName.Replace('\\', '/');
      playBin.SetState(Gst.State.Paused);

6. Now I can play and pause the video by changing the state of the playbin

      playBin.SetState(Gst.State.Playing);
      playBin.SetState(Gst.State.Paused);

So far so good, everything is working smoothly, I can play, pause, seek the
video displayed in a rectangular area in my window. The problem starts when
I try to play another video file. According to all manuals, I should set the
pipeline state to Null before changing the URI:

7. Open another video file

      playBin.SetState(Gst.State.Null);
      playBin.Uri = @"file:///" + newFileName.Replace('\\', '/');
      playBin.SetState(Gst.State.Playing);

Unfortunately this causes the rectangular area in my window to become black
and a separate video window is created by GStreamer. It has nothing to do
with changing the URI, it is setting the playbin state to Null which
disconnects the video output from the overlay and pops up a new window.
What am I doing wrong?

--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/XOverlay-lost-after-setting-playbin-state-to-Null-tp4115442p4115442.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list