1 #include "include/dvr/dvr_hardware_composer_client.h"
2
3 #include <android/dvr/IVrComposer.h>
4 #include <android/dvr/BnVrComposerCallback.h>
5 #include <android/hardware_buffer.h>
6 #include <binder/IServiceManager.h>
7 #include <private/android/AHardwareBufferHelpers.h>
8
9 #include <memory>
10
11 struct DvrHwcFrame {
12 android::dvr::ComposerView::Frame frame;
13 };
14
15 namespace {
16
17 class HwcCallback : public android::dvr::BnVrComposerCallback {
18 public:
19 explicit HwcCallback(DvrHwcOnFrameCallback callback,
20 void* client_state);
21 ~HwcCallback() override;
22
23 std::unique_ptr<DvrHwcFrame> DequeueFrame();
24
25 private:
26 // android::dvr::BnVrComposerCallback:
27 android::binder::Status onNewFrame(
28 const android::dvr::ParcelableComposerFrame& frame,
29 android::dvr::ParcelableUniqueFd* fence) override;
30
31 DvrHwcOnFrameCallback callback_;
32 void* client_state_;
33
34 HwcCallback(const HwcCallback&) = delete;
35 void operator=(const HwcCallback&) = delete;
36 };
37
HwcCallback(DvrHwcOnFrameCallback callback,void * client_state)38 HwcCallback::HwcCallback(DvrHwcOnFrameCallback callback, void* client_state)
39 : callback_(callback), client_state_(client_state) {}
40
~HwcCallback()41 HwcCallback::~HwcCallback() {}
42
onNewFrame(const android::dvr::ParcelableComposerFrame & frame,android::dvr::ParcelableUniqueFd * fence)43 android::binder::Status HwcCallback::onNewFrame(
44 const android::dvr::ParcelableComposerFrame& frame,
45 android::dvr::ParcelableUniqueFd* fence) {
46 std::unique_ptr<DvrHwcFrame> dvr_frame(new DvrHwcFrame());
47 dvr_frame->frame = frame.frame();
48
49 fence->set_fence(android::base::unique_fd(callback_(client_state_,
50 dvr_frame.release())));
51 return android::binder::Status::ok();
52 }
53
54 } // namespace
55
56 struct DvrHwcClient {
57 android::sp<android::dvr::IVrComposer> composer;
58 android::sp<HwcCallback> callback;
59 };
60
dvrHwcClientCreate(DvrHwcOnFrameCallback callback,void * data)61 DvrHwcClient* dvrHwcClientCreate(DvrHwcOnFrameCallback callback, void* data) {
62 std::unique_ptr<DvrHwcClient> client(new DvrHwcClient());
63
64 android::sp<android::IServiceManager> sm(android::defaultServiceManager());
65 client->composer = android::interface_cast<android::dvr::IVrComposer>(
66 sm->getService(android::dvr::IVrComposer::SERVICE_NAME()));
67 if (!client->composer.get())
68 return nullptr;
69
70 client->callback = new HwcCallback(callback, data);
71 android::binder::Status status = client->composer->registerObserver(
72 client->callback);
73 if (!status.isOk())
74 return nullptr;
75
76 return client.release();
77 }
78
dvrHwcClientDestroy(DvrHwcClient * client)79 void dvrHwcClientDestroy(DvrHwcClient* client) {
80 delete client;
81 }
82
dvrHwcFrameDestroy(DvrHwcFrame * frame)83 void dvrHwcFrameDestroy(DvrHwcFrame* frame) {
84 delete frame;
85 }
86
dvrHwcFrameGetDisplayId(DvrHwcFrame * frame)87 DvrHwcDisplay dvrHwcFrameGetDisplayId(DvrHwcFrame* frame) {
88 return frame->frame.display_id;
89 }
90
dvrHwcFrameGetDisplayWidth(DvrHwcFrame * frame)91 int32_t dvrHwcFrameGetDisplayWidth(DvrHwcFrame* frame) {
92 return frame->frame.display_width;
93 }
94
dvrHwcFrameGetDisplayHeight(DvrHwcFrame * frame)95 int32_t dvrHwcFrameGetDisplayHeight(DvrHwcFrame* frame) {
96 return frame->frame.display_height;
97 }
98
dvrHwcFrameGetDisplayRemoved(DvrHwcFrame * frame)99 bool dvrHwcFrameGetDisplayRemoved(DvrHwcFrame* frame) {
100 return frame->frame.removed;
101 }
102
dvrHwcFrameGetLayerCount(DvrHwcFrame * frame)103 size_t dvrHwcFrameGetLayerCount(DvrHwcFrame* frame) {
104 return frame->frame.layers.size();
105 }
106
dvrHwcFrameGetActiveConfig(DvrHwcFrame * frame)107 uint32_t dvrHwcFrameGetActiveConfig(DvrHwcFrame* frame) {
108 return static_cast<uint32_t>(frame->frame.active_config);
109 }
110
dvrHwcFrameGetColorMode(DvrHwcFrame * frame)111 uint32_t dvrHwcFrameGetColorMode(DvrHwcFrame* frame) {
112 return static_cast<uint32_t>(frame->frame.color_mode);
113 }
114
dvrHwcFrameGetColorTransform(DvrHwcFrame * frame,float * out_matrix,int32_t * out_hint)115 void dvrHwcFrameGetColorTransform(DvrHwcFrame* frame, float* out_matrix,
116 int32_t* out_hint) {
117 *out_hint = frame->frame.color_transform_hint;
118 memcpy(out_matrix, frame->frame.color_transform,
119 sizeof(frame->frame.color_transform));
120 }
121
dvrHwcFrameGetPowerMode(DvrHwcFrame * frame)122 uint32_t dvrHwcFrameGetPowerMode(DvrHwcFrame* frame) {
123 return static_cast<uint32_t>(frame->frame.power_mode);
124 }
125
dvrHwcFrameGetVsyncEnabled(DvrHwcFrame * frame)126 uint32_t dvrHwcFrameGetVsyncEnabled(DvrHwcFrame* frame) {
127 return static_cast<uint32_t>(frame->frame.vsync_enabled);
128 }
129
dvrHwcFrameGetLayerId(DvrHwcFrame * frame,size_t layer_index)130 DvrHwcLayer dvrHwcFrameGetLayerId(DvrHwcFrame* frame, size_t layer_index) {
131 return frame->frame.layers[layer_index].id;
132 }
133
dvrHwcFrameGetLayerBuffer(DvrHwcFrame * frame,size_t layer_index)134 AHardwareBuffer* dvrHwcFrameGetLayerBuffer(DvrHwcFrame* frame,
135 size_t layer_index) {
136 AHardwareBuffer* buffer = android::AHardwareBuffer_from_GraphicBuffer(
137 frame->frame.layers[layer_index].buffer.get());
138 AHardwareBuffer_acquire(buffer);
139 return buffer;
140 }
141
dvrHwcFrameGetLayerFence(DvrHwcFrame * frame,size_t layer_index)142 int dvrHwcFrameGetLayerFence(DvrHwcFrame* frame, size_t layer_index) {
143 return frame->frame.layers[layer_index].fence->dup();
144 }
145
dvrHwcFrameGetLayerDisplayFrame(DvrHwcFrame * frame,size_t layer_index)146 DvrHwcRecti dvrHwcFrameGetLayerDisplayFrame(DvrHwcFrame* frame,
147 size_t layer_index) {
148 return DvrHwcRecti{
149 frame->frame.layers[layer_index].display_frame.left,
150 frame->frame.layers[layer_index].display_frame.top,
151 frame->frame.layers[layer_index].display_frame.right,
152 frame->frame.layers[layer_index].display_frame.bottom,
153 };
154 }
155
dvrHwcFrameGetLayerCrop(DvrHwcFrame * frame,size_t layer_index)156 DvrHwcRectf dvrHwcFrameGetLayerCrop(DvrHwcFrame* frame, size_t layer_index) {
157 return DvrHwcRectf{
158 frame->frame.layers[layer_index].crop.left,
159 frame->frame.layers[layer_index].crop.top,
160 frame->frame.layers[layer_index].crop.right,
161 frame->frame.layers[layer_index].crop.bottom,
162 };
163 }
164
dvrHwcFrameGetLayerBlendMode(DvrHwcFrame * frame,size_t layer_index)165 DvrHwcBlendMode dvrHwcFrameGetLayerBlendMode(DvrHwcFrame* frame,
166 size_t layer_index) {
167 return static_cast<DvrHwcBlendMode>(
168 frame->frame.layers[layer_index].blend_mode);
169 }
170
dvrHwcFrameGetLayerAlpha(DvrHwcFrame * frame,size_t layer_index)171 float dvrHwcFrameGetLayerAlpha(DvrHwcFrame* frame, size_t layer_index) {
172 return frame->frame.layers[layer_index].alpha;
173 }
174
dvrHwcFrameGetLayerType(DvrHwcFrame * frame,size_t layer_index)175 uint32_t dvrHwcFrameGetLayerType(DvrHwcFrame* frame, size_t layer_index) {
176 return frame->frame.layers[layer_index].type;
177 }
178
dvrHwcFrameGetLayerApplicationId(DvrHwcFrame * frame,size_t layer_index)179 uint32_t dvrHwcFrameGetLayerApplicationId(DvrHwcFrame* frame,
180 size_t layer_index) {
181 return frame->frame.layers[layer_index].app_id;
182 }
183
dvrHwcFrameGetLayerZOrder(DvrHwcFrame * frame,size_t layer_index)184 uint32_t dvrHwcFrameGetLayerZOrder(DvrHwcFrame* frame, size_t layer_index) {
185 return frame->frame.layers[layer_index].z_order;
186 }
187
dvrHwcFrameGetLayerCursor(DvrHwcFrame * frame,size_t layer_index,int32_t * out_x,int32_t * out_y)188 void dvrHwcFrameGetLayerCursor(DvrHwcFrame* frame, size_t layer_index,
189 int32_t* out_x, int32_t* out_y) {
190 *out_x = frame->frame.layers[layer_index].cursor_x;
191 *out_y = frame->frame.layers[layer_index].cursor_y;
192 }
193
dvrHwcFrameGetLayerTransform(DvrHwcFrame * frame,size_t layer_index)194 uint32_t dvrHwcFrameGetLayerTransform(DvrHwcFrame* frame, size_t layer_index) {
195 return frame->frame.layers[layer_index].transform;
196 }
197
dvrHwcFrameGetLayerDataspace(DvrHwcFrame * frame,size_t layer_index)198 uint32_t dvrHwcFrameGetLayerDataspace(DvrHwcFrame* frame, size_t layer_index) {
199 return frame->frame.layers[layer_index].dataspace;
200 }
201
dvrHwcFrameGetLayerColor(DvrHwcFrame * frame,size_t layer_index)202 uint32_t dvrHwcFrameGetLayerColor(DvrHwcFrame* frame, size_t layer_index) {
203 const auto& color = frame->frame.layers[layer_index].color;
204 return color.r | (static_cast<uint32_t>(color.g) << 8) |
205 (static_cast<uint32_t>(color.b) << 16) |
206 (static_cast<uint32_t>(color.a) << 24);
207 }
208
dvrHwcFrameGetLayerNumVisibleRegions(DvrHwcFrame * frame,size_t layer_index)209 uint32_t dvrHwcFrameGetLayerNumVisibleRegions(DvrHwcFrame* frame,
210 size_t layer_index) {
211 return frame->frame.layers[layer_index].visible_regions.size();
212 }
213
dvrHwcFrameGetLayerVisibleRegion(DvrHwcFrame * frame,size_t layer_index,size_t index)214 DvrHwcRecti dvrHwcFrameGetLayerVisibleRegion(DvrHwcFrame* frame,
215 size_t layer_index, size_t index) {
216 return DvrHwcRecti{
217 frame->frame.layers[layer_index].visible_regions[index].left,
218 frame->frame.layers[layer_index].visible_regions[index].top,
219 frame->frame.layers[layer_index].visible_regions[index].right,
220 frame->frame.layers[layer_index].visible_regions[index].bottom,
221 };
222 }
223
dvrHwcFrameGetLayerNumDamagedRegions(DvrHwcFrame * frame,size_t layer_index)224 uint32_t dvrHwcFrameGetLayerNumDamagedRegions(DvrHwcFrame* frame,
225 size_t layer_index) {
226 return frame->frame.layers[layer_index].damaged_regions.size();
227 }
228
dvrHwcFrameGetLayerDamagedRegion(DvrHwcFrame * frame,size_t layer_index,size_t index)229 DvrHwcRecti dvrHwcFrameGetLayerDamagedRegion(DvrHwcFrame* frame,
230 size_t layer_index, size_t index) {
231 return DvrHwcRecti{
232 frame->frame.layers[layer_index].damaged_regions[index].left,
233 frame->frame.layers[layer_index].damaged_regions[index].top,
234 frame->frame.layers[layer_index].damaged_regions[index].right,
235 frame->frame.layers[layer_index].damaged_regions[index].bottom,
236 };
237 }
238