XOverlay lost after setting playbin state to Null

Stefan Sauer ensonic at hora-obscura.de
Mon Nov 28 08:27:31 PST 2011


On 11/28/2011 03:48 PM, Ralph wrote:
> 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);

you could do a set_locked_state(TRUE) on the videosink (to avoid it
going down), then goto READY, change uri, go back to PAUSED,
set_locked_state(FALSE), go to PLAYING

Stefan

> 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.
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



More information about the gstreamer-devel mailing list