> > --- > src/Makefile.am | 4 ++++ > src/mjpeg-fallback.cpp | 38 +++++++++++++------------------------- > 2 files changed, 17 insertions(+), 25 deletions(-) > > diff --git a/src/Makefile.am b/src/Makefile.am > index 0133bf5..31b8af1 100644 > --- a/src/Makefile.am > +++ b/src/Makefile.am > @@ -21,6 +21,7 @@ AM_CPPFLAGS = \ > $(X11_CFLAGS) \ > $(XFIXES_CFLAGS) \ > $(XRANDR_CFLAGS) \ > + $(XEXT_CFLAGS) \ > $(NULL) > > AM_CFLAGS = \ > @@ -56,6 +57,7 @@ spice_streaming_agent_LDADD = \ > $(X11_LIBS) \ > $(XFIXES_LIBS) \ > $(XRANDR_LIBS) \ > + $(XEXT_LIBS) \ > $(JPEG_LIBS) \ > $(NULL) > > @@ -77,6 +79,8 @@ spice_streaming_agent_SOURCES = \ > utils.cpp \ > utils.hpp \ > x11-display-info.cpp \ > + xlib-capture.cpp \ > + xlib-capture.hpp \ > $(NULL) > > if HAVE_GST > diff --git a/src/mjpeg-fallback.cpp b/src/mjpeg-fallback.cpp > index 03247a1..a43825b 100644 > --- a/src/mjpeg-fallback.cpp > +++ b/src/mjpeg-fallback.cpp > @@ -16,6 +16,7 @@ > #include <sstream> > #include <memory> > #include <syslog.h> > +#include "xlib-capture.hpp" > > using namespace spice::streaming_agent; > > @@ -44,11 +45,10 @@ public: > private: > MjpegSettings settings; > Display *const dpy; > + XlibCapture *xc; unique_ptr ? > > std::vector<uint8_t> frame; > > - // last frame sizes > - int last_width = -1, last_height = -1; > // last time before capture > uint64_t last_time = 0; > }; > @@ -58,19 +58,21 @@ private: > MjpegFrameCapture::MjpegFrameCapture(const MjpegSettings& settings): > settings(settings),dpy(XOpenDisplay(nullptr)) > { > - if (!dpy) > + if (!dpy) { > throw std::runtime_error("Unable to initialize X11"); > + } > + xc = new XlibCapture(dpy); > } > > MjpegFrameCapture::~MjpegFrameCapture() > { > + delete xc; > XCloseDisplay(dpy); > } > > void MjpegFrameCapture::Reset() > { > frame.clear(); > - last_width = last_height = -1; > } > > FrameInfo MjpegFrameCapture::CaptureFrame() > @@ -100,34 +102,20 @@ FrameInfo MjpegFrameCapture::CaptureFrame() > } > } > > - int screen = XDefaultScreen(dpy); > - > - Window win = RootWindow(dpy, screen); > + XImg *image = xc->capture(); > The capture returns a NULL value on failure, better to check it (was "// TODO handle errors"). > - XWindowAttributes win_info; > - XGetWindowAttributes(dpy, win, &win_info); > + bool is_first = image->new_resolution(); > > - bool is_first = false; > - if (win_info.width != last_width || win_info.height != last_height) { > - last_width = win_info.width; > - last_height = win_info.height; > - is_first = true; > - } > + info.size.width = image->width(); > + info.size.height = image->height(); > > - info.size.width = win_info.width; > - info.size.height = win_info.height; > - > - int format = ZPixmap; > - // TODO handle errors > - XImage *image = XGetImage(dpy, win, win_info.x, win_info.y, > - win_info.width, win_info.height, AllPlanes, > format); > > // TODO handle errors > // TODO multiple formats (only 32 bit) > - write_JPEG_file(frame, settings.quality, (uint8_t*) image->data, > - image->width, image->height); > + write_JPEG_file(frame, settings.quality, (uint8_t*) image->get_data(), > + image->width(), image->height()); > > - image->f.destroy_image(image); > + delete image; > > info.buffer = &frame[0]; > info.buffer_size = frame.size(); Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel