blob: ec4c5270deedd9224e9b468a6792ea0935b22b91 [file] [log] [blame]
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08001#ifndef ANDROID_DVR_SERVICES_DISPLAYD_SCREENSHOT_SERVICE_H_
2#define ANDROID_DVR_SERVICES_DISPLAYD_SCREENSHOT_SERVICE_H_
3
4#include <pdx/rpc/pointer_wrapper.h>
5#include <pdx/service.h>
6#include <private/dvr/ion_buffer.h>
7
8#include <mutex>
9#include <vector>
10
11#include "hardware_composer.h"
12
13namespace android {
14namespace dvr {
15
16class ScreenshotWaiter {
17 public:
18 explicit ScreenshotWaiter(pdx::Message&& message, int layer_index)
19 : message_(std::move(message)), layer_index_(layer_index) {}
20 ScreenshotWaiter(ScreenshotWaiter&&) = default;
21
22 void Reply(const ScreenshotData& screenshot);
23 void Error(int error);
24
25 bool IsDone() const { return message_.replied(); }
26 int layer_index() const { return layer_index_; }
27
28 private:
29 pdx::Message message_;
30 int layer_index_;
31
32 ScreenshotWaiter(const ScreenshotWaiter&) = delete;
33 void operator=(const ScreenshotWaiter&) = delete;
34};
35
36// The screenshot service allows clients to obtain screenshots from displayd.
37class ScreenshotService : public pdx::ServiceBase<ScreenshotService> {
38 public:
39 ~ScreenshotService();
40
41 int HandleMessage(pdx::Message& message) override;
42
43 // Returns true if there is a pending screenshot request.
44 bool IsScreenshotRequestPending() const {
45 std::lock_guard<std::mutex> lock(mutex_);
46 return !waiters_.empty();
47 }
48
49 // If any clients are currently waiting for a screenshot, read back the
50 // contents of requested layers and send the resulting
51 // image to the clients.
52 void TakeIfNeeded(
53 std::array<Layer*, HardwareComposer::kMaxHardwareLayers>& hw_layers,
54 Compositor& compositor);
55
56 static ScreenshotService* GetInstance();
57
58 private:
59 friend BASE;
60
61 ScreenshotService();
62
63 void AddWaiter(pdx::Message&& message, int layer_index);
64
65 ScreenshotData OnTakeScreenshot(pdx::Message& message, int index);
66 int OnGetFormat(pdx::Message& message);
67
68 // Copy the given screenshot data into the message reply.
69 void Take(ScreenshotWaiter* waiter, const void* rgba_data, int32_t width,
70 int32_t height, int buffer_stride);
71
72 static ScreenshotService* instance_;
73
74 // Protects access to subsequent member variables.
75 mutable std::mutex mutex_;
76 std::vector<ScreenshotWaiter> waiters_;
77};
78
79} // namespace dvr
80} // namespace android
81
82#endif // ANDROID_DVR_SERVICES_DISPLAYD_SCREENSHOT_SERVICE_H_