X11ScreenCaptureImageProvider.cpp
Go to the documentation of this file.
2 
3 #include <ArmarXCore/core/time.h>
4 
6 
7 namespace visionx
8 {
9 
10  const std::string X11ScreenCaptureImageProvider::defaultName = "X11ScreenCapture";
11 
13  {
14  clock = armarx::Clock(armarx::ClockType::Realtime);
15  }
16 
17  std::string
19  {
20  return defaultName;
21  }
22 
23  std::string
25  {
26  return defaultName;
27  }
28 
29  void
31  {
32  ARMARX_INFO << "Initializing X11...";
33 
34  display = XOpenDisplay(nullptr);
35 
36  ARMARX_CHECK_GREATER_EQUAL(properties.screenNumber, 0);
37  ARMARX_CHECK_LESS(properties.screenNumber, XScreenCount(display));
38  window = RootWindow(display, properties.screenNumber);
39 
40  setNumberImages(1);
41 
42  // setImageFormat(ImageDimension(dim.width, dim.height), visionx::eRgb, visionx::eBayerPatternGr);
43  setImageFormat(ImageDimension(properties.width, properties.height),
44  visionx::eRgb,
45  visionx::eBayerPatternGr);
46 
47  out = cv::Mat(properties.height, properties.width, CV_8UC3);
48 
49  setImageSyncMode(visionx::eFpsSynchronization);
50  frameRate = properties.fps;
51  ARMARX_INFO << "Using " << frameRate << " FPS";
52  }
53 
54  void
56  {
57  if (ximg != nullptr)
58  {
59  XDestroyImage(ximg);
60  }
61 
62  XCloseDisplay(display);
63  }
64 
65  bool
67  {
68  if (ximg != nullptr)
69  {
70  XDestroyImage(ximg);
71  }
72 
73  ximg = XGetImage(display,
74  window,
75  properties.x,
76  properties.y,
77  properties.width,
78  properties.height,
79  AllPlanes,
80  ZPixmap);
81  ximg_cv = cv::Mat(properties.height, properties.width, CV_8UC4, ximg->data);
82 
83  auto tmpSharedMemoryProvider = sharedMemoryProvider;
84  if (tmpSharedMemoryProvider)
85  {
86  Ice::Byte* pixels = static_cast<Ice::Byte*>(out.data);
87  updateTimestamp(clock.now().toMicroSecondsSinceEpoch());
88  cv::cvtColor(ximg_cv, out, cv::COLOR_RGBA2BGR);
90  tmpSharedMemoryProvider->getScopedWriteLock());
91  memcpy(ppImageBuffers[0], pixels, out.cols * out.rows * out.channels());
92  }
93 
94  return true;
95  }
96 
97  void
99  {
100  properties.fps = static_cast<int>(framesPerSecond);
101  }
102 
103  void
105  {
106  ;
107  }
108 
111  {
113  new armarx::ComponentPropertyDefinitions(getConfigIdentifier());
114 
115  defs->optional(properties.screenNumber,
116  "screen.number",
117  "Screen number to record. This does not correspond to "
118  "the monitor count, as this is transparent to X. You "
119  "don't want to change this in most cases.");
120  defs->optional(properties.fps, "fps", "Frames per second.");
121  defs->optional(properties.x, "region.x", "X coordinate of the region to record.");
122  defs->optional(properties.y, "region.y", "Y coordinate of the region to record.");
123  defs->optional(properties.width, "region.width", "Width of the region to record.");
124  defs->optional(properties.height, "region.height", "Height of the region to record.");
125 
126  return defs;
127  }
128 
129  std::vector<imrec::ChannelPreferences>
131  {
132  ARMARX_TRACE;
133 
134  imrec::ChannelPreferences cp;
135  cp.requiresLossless = false;
136  cp.name = "screen";
137  return {cp};
138  }
139 } // namespace visionx
visionx::X11ScreenCaptureImageProvider::onInitCapturingImageProvider
void onInitCapturingImageProvider() override
This is called when the Component::onInitComponent() is called.
Definition: X11ScreenCaptureImageProvider.cpp:30
visionx
ArmarX headers.
Definition: OpenPoseStressTest.h:38
display
Use of this software is granted under one of the following two to be chosen freely by the user Boost Software License Version Marcin Kalicinski Permission is hereby free of to any person or organization obtaining a copy of the software and accompanying documentation covered by this display
Definition: license.txt:11
ARMARX_CHECK_LESS
#define ARMARX_CHECK_LESS(lhs, rhs)
This macro evaluates whether lhs is less (<) than rhs and if it turns out to be false it will throw a...
Definition: ExpressionException.h:102
armarx::SharedMemoryScopedWriteLockPtr
std::shared_ptr< SharedMemoryScopedWriteLock > SharedMemoryScopedWriteLockPtr
Definition: SharedMemoryProvider.h:47
visionx::X11ScreenCaptureImageProvider::onStartCapture
void onStartCapture(float framesPerSecond) override
This is called when the image provider capturing has been started.
Definition: X11ScreenCaptureImageProvider.cpp:98
visionx::X11ScreenCaptureImageProvider::getImageRecordingChannelPreferences
std::vector< imrec::ChannelPreferences > getImageRecordingChannelPreferences(const Ice::Current &) override
Definition: X11ScreenCaptureImageProvider.cpp:130
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
visionx::X11ScreenCaptureImageProvider::onExitCapturingImageProvider
void onExitCapturingImageProvider() override
This is called when the Component::onExitComponent() setup is called.
Definition: X11ScreenCaptureImageProvider.cpp:55
visionx::X11ScreenCaptureImageProvider::getDefaultName
std::string getDefaultName() const override
Retrieve default name of component.
Definition: X11ScreenCaptureImageProvider.cpp:18
visionx::CapturingImageProvider::capture
virtual void capture()
Definition: CapturingImageProvider.cpp:109
visionx::X11ScreenCaptureImageProvider::onStopCapture
void onStopCapture() override
This is called when the image provider capturing has been stopped.
Definition: X11ScreenCaptureImageProvider.cpp:104
visionx::X11ScreenCaptureImageProvider::X11ScreenCaptureImageProvider
X11ScreenCaptureImageProvider()
Definition: X11ScreenCaptureImageProvider.cpp:12
visionx::X11ScreenCaptureImageProvider::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: X11ScreenCaptureImageProvider.cpp:110
ARMARX_CHECK_GREATER_EQUAL
#define ARMARX_CHECK_GREATER_EQUAL(lhs, rhs)
This macro evaluates whether lhs is greater or equal (>=) rhs and if it turns out to be false it will...
Definition: ExpressionException.h:123
armarx::ComponentPropertyDefinitions
Default component property definition container.
Definition: Component.h:69
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
IceUtil::Handle< class PropertyDefinitionContainer >
ImageUtil.h
time.h
visionx::X11ScreenCaptureImageProvider::GetDefaultName
static std::string GetDefaultName()
Definition: X11ScreenCaptureImageProvider.cpp:24
X11ScreenCaptureImageProvider.h
stopwatch::Clock
std::chrono::system_clock Clock
Definition: Stopwatch.h:10