[Spice-devel] [PATCH spice-streaming-agent] gst-plugin: Initialize X connection also when ximagesrc is used
Frediano Ziglio
fziglio at redhat.com
Tue Apr 30 15:06:05 UTC 2019
>
> In order to get graphic devices info a connection to X server
> is required, make sure we get it also when ximagesrc capture
> is used ( XLIB_CAPTURE=0 ).
>
> Signed-off-by: Snir Sheriber <ssheribe at redhat.com>
> ---
> src/gst-plugin.cpp | 18 ++++++++----------
> 1 file changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/src/gst-plugin.cpp b/src/gst-plugin.cpp
> index 3edf9f5..0814ef5 100644
> --- a/src/gst-plugin.cpp
> +++ b/src/gst-plugin.cpp
> @@ -84,9 +84,9 @@ private:
> GstElement *get_encoder_plugin(const GstreamerEncoderSettings &settings,
> GstCapsUPtr &sink_caps);
> GstElement *get_capture_plugin(const GstreamerEncoderSettings
> &settings);
> void pipeline_init(const GstreamerEncoderSettings &settings);
> + Display *dpy;
Maybe you can have "Display *const dpy;" ?
> #if XLIB_CAPTURE
> void xlib_capture();
> - Display *dpy;
> XImage *image = nullptr;
> #endif
> GstObjectUPtr<GstElement> pipeline, capture, sink;
> @@ -251,13 +251,6 @@ void GstreamerFrameCapture::pipeline_init(const
> GstreamerEncoderSettings &settin
> throw std::runtime_error("Linking gstreamer's elements failed");
> }
>
> -#if XLIB_CAPTURE
> - dpy = XOpenDisplay(nullptr);
> - if (!dpy) {
> - throw std::runtime_error("Unable to initialize X11");
> - }
> -#endif
> -
> gst_element_set_state(pipeline.get(), GST_STATE_PLAYING);
>
> #if !XLIB_CAPTURE
> @@ -292,6 +285,10 @@ void GstreamerFrameCapture::pipeline_init(const
> GstreamerEncoderSettings &settin
> GstreamerFrameCapture::GstreamerFrameCapture(const GstreamerEncoderSettings
> &settings):
> settings(settings)
> {
> + dpy = XOpenDisplay(nullptr);
> + if (!dpy) {
> + throw std::runtime_error("Unable to initialize X11");
> + }
> pipeline_init(settings);
> }
>
> @@ -313,9 +310,7 @@ GstreamerFrameCapture::~GstreamerFrameCapture()
> {
> free_sample();
> gst_element_set_state(pipeline.get(), GST_STATE_NULL);
> -#if XLIB_CAPTURE
> XCloseDisplay(dpy);
> -#endif
> }
>
> void GstreamerFrameCapture::Reset()
> @@ -326,6 +321,9 @@ void GstreamerFrameCapture::Reset()
> #if XLIB_CAPTURE
> void GstreamerFrameCapture::xlib_capture()
> {
> + if (!dpy) {
> + throw std::runtime_error("X11 connection is not initialized");
> + }
Why do you need this? dpy is initialized on the constructor, who should
clear the pointer?
> int screen = XDefaultScreen(dpy);
>
> Window win = RootWindow(dpy, screen);
Frediano
More information about the Spice-devel
mailing list