parcelable_composer_layer.cpp revision b42f171a5a76985fde2689d90fd6d2d7e4920564
1#include "aidl/android/dvr/parcelable_composer_layer.h"
2
3#include <binder/Parcel.h>
4#include <ui/Fence.h>
5#include <ui/GraphicBuffer.h>
6#include <ui/GraphicBufferMapper.h>
7
8namespace android {
9namespace dvr {
10namespace {
11
12sp<GraphicBuffer> GetBufferFromHandle(native_handle_t* handle) {
13  uint32_t width = 0, height = 0, stride = 0, layer_count = 1;
14  uint64_t producer_usage = 0, consumer_usage = 0;
15  int32_t format = 0;
16
17  GraphicBufferMapper& mapper = GraphicBufferMapper::get();
18  // Need to register |handle| otherwise we can't read its properties.
19  if (mapper.registerBuffer(handle) != OK) {
20    ALOGE("Failed to register buffer");
21    return nullptr;
22  }
23
24  if (mapper.getDimensions(handle, &width, &height) ||
25      mapper.getStride(handle, &stride) ||
26      mapper.getFormat(handle, &format) ||
27      mapper.getProducerUsage(handle, &producer_usage) ||
28      mapper.getConsumerUsage(handle, &consumer_usage)) {
29    ALOGE("Failed to read handle properties");
30    return nullptr;
31  }
32
33  // This will only succeed if gralloc has GRALLOC1_CAPABILITY_LAYERED_BUFFERS
34  // capability. Otherwise assume a count of 1.
35  mapper.getLayerCount(handle, &layer_count);
36
37  sp<GraphicBuffer> buffer = new GraphicBuffer(handle,
38      GraphicBuffer::TAKE_HANDLE, width, height, format, layer_count,
39      producer_usage, consumer_usage, stride);
40
41  return buffer;
42}
43
44}  // namespace
45
46ParcelableComposerLayer::ParcelableComposerLayer() {}
47
48ParcelableComposerLayer::ParcelableComposerLayer(
49    const ComposerView::ComposerLayer& layer) : layer_(layer) {}
50
51ParcelableComposerLayer::~ParcelableComposerLayer() {}
52
53status_t ParcelableComposerLayer::writeToParcel(Parcel* parcel) const {
54  status_t ret = parcel->writeUint64(layer_.id);
55  if (ret != OK) return ret;
56
57  ret = parcel->writeNativeHandle(layer_.buffer->getNativeBuffer()->handle);
58  if (ret != OK) return ret;
59
60  ret = parcel->writeBool(layer_.fence->isValid());
61  if (ret != OK) return ret;
62
63  if (layer_.fence->isValid()) {
64    ret = parcel->writeFileDescriptor(layer_.fence->dup(), true);
65    if (ret != OK) return ret;
66  }
67
68  ret = parcel->writeInt32(layer_.display_frame.left);
69  if (ret != OK) return ret;
70
71  ret = parcel->writeInt32(layer_.display_frame.top);
72  if (ret != OK) return ret;
73
74  ret = parcel->writeInt32(layer_.display_frame.right);
75  if (ret != OK) return ret;
76
77  ret = parcel->writeInt32(layer_.display_frame.bottom);
78  if (ret != OK) return ret;
79
80  ret = parcel->writeFloat(layer_.crop.left);
81  if (ret != OK) return ret;
82
83  ret = parcel->writeFloat(layer_.crop.top);
84  if (ret != OK) return ret;
85
86  ret = parcel->writeFloat(layer_.crop.right);
87  if (ret != OK) return ret;
88
89  ret = parcel->writeFloat(layer_.crop.bottom);
90  if (ret != OK) return ret;
91
92  ret = parcel->writeInt32(static_cast<int32_t>(layer_.blend_mode));
93  if (ret != OK) return ret;
94
95  ret = parcel->writeFloat(layer_.alpha);
96  if (ret != OK) return ret;
97
98  ret = parcel->writeUint32(layer_.type);
99  if (ret != OK) return ret;
100
101  ret = parcel->writeUint32(layer_.app_id);
102  if (ret != OK) return ret;
103
104  return OK;
105}
106
107status_t ParcelableComposerLayer::readFromParcel(const Parcel* parcel) {
108  status_t ret = parcel->readUint64(&layer_.id);
109  if (ret != OK) return ret;
110
111  native_handle* handle = parcel->readNativeHandle();
112  if (!handle) return BAD_VALUE;
113
114  layer_.buffer = GetBufferFromHandle(handle);
115  if (!layer_.buffer.get()) return BAD_VALUE;
116
117  bool has_fence = 0;
118  ret = parcel->readBool(&has_fence);
119  if (ret != OK) return ret;
120
121  if (has_fence)
122    layer_.fence = new Fence(dup(parcel->readFileDescriptor()));
123  else
124    layer_.fence = new Fence();
125
126  ret = parcel->readInt32(&layer_.display_frame.left);
127  if (ret != OK) return ret;
128
129  ret = parcel->readInt32(&layer_.display_frame.top);
130  if (ret != OK) return ret;
131
132  ret = parcel->readInt32(&layer_.display_frame.right);
133  if (ret != OK) return ret;
134
135  ret = parcel->readInt32(&layer_.display_frame.bottom);
136  if (ret != OK) return ret;
137
138  ret = parcel->readFloat(&layer_.crop.left);
139  if (ret != OK) return ret;
140
141  ret = parcel->readFloat(&layer_.crop.top);
142  if (ret != OK) return ret;
143
144  ret = parcel->readFloat(&layer_.crop.right);
145  if (ret != OK) return ret;
146
147  ret = parcel->readFloat(&layer_.crop.bottom);
148  if (ret != OK) return ret;
149
150  ret = parcel->readInt32(reinterpret_cast<int32_t*>(&layer_.blend_mode));
151  if (ret != OK) return ret;
152
153  ret = parcel->readFloat(&layer_.alpha);
154  if (ret != OK) return ret;
155
156  ret = parcel->readUint32(&layer_.type);
157  if (ret != OK) return ret;
158
159  ret = parcel->readUint32(&layer_.app_id);
160  if (ret != OK) return ret;
161
162  return OK;
163}
164
165}  // namespace dvr
166}  // namespace android
167