blob: 022a9ccd0b378de9564a744c8956e7686530c073 [file] [log] [blame]
Fan Xuf35719a2018-10-10 11:38:31 -07001#include <log/log.h>
2#include <private/dvr/IBufferHub.h>
3
4namespace android {
5namespace dvr {
6
Fan Xu6df8c2a2018-10-10 15:53:21 -07007class BpBufferHub : public BpInterface<IBufferHub> {
8 public:
9 explicit BpBufferHub(const sp<IBinder>& impl)
10 : BpInterface<IBufferHub>(impl) {}
11
12 sp<IBufferClient> createBuffer(uint32_t width, uint32_t height,
13 uint32_t layer_count, uint32_t format,
14 uint64_t usage,
15 uint64_t user_metadata_size) override;
Fan Xu3a96ccd2018-10-23 13:05:11 -070016
17 status_t importBuffer(uint64_t token, sp<IBufferClient>* outClient) override;
Fan Xu6df8c2a2018-10-10 15:53:21 -070018};
19
Fan Xuf35719a2018-10-10 11:38:31 -070020IMPLEMENT_META_INTERFACE(BufferHub, "android.dvr.IBufferHub");
21
Fan Xu6df8c2a2018-10-10 15:53:21 -070022// Transaction code
23enum {
24 CREATE_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Fan Xu3a96ccd2018-10-23 13:05:11 -070025 IMPORT_BUFFER,
Fan Xu6df8c2a2018-10-10 15:53:21 -070026};
27
28sp<IBufferClient> BpBufferHub::createBuffer(uint32_t width, uint32_t height,
29 uint32_t layer_count,
30 uint32_t format, uint64_t usage,
31 uint64_t user_metadata_size) {
32 Parcel data, reply;
33 status_t ret = NO_ERROR;
34 ret |= data.writeInterfaceToken(IBufferHub::getInterfaceDescriptor());
35 ret |= data.writeUint32(width);
36 ret |= data.writeUint32(height);
37 ret |= data.writeUint32(layer_count);
38 ret |= data.writeUint32(format);
39 ret |= data.writeUint64(usage);
40 ret |= data.writeUint64(user_metadata_size);
41
42 if (ret != NO_ERROR) {
43 ALOGE("BpBufferHub::createBuffer: failed to write into parcel");
44 return nullptr;
45 }
46
47 ret = remote()->transact(CREATE_BUFFER, data, &reply);
48 if (ret == NO_ERROR) {
49 return interface_cast<IBufferClient>(reply.readStrongBinder());
50 } else {
51 ALOGE("BpBufferHub::createBuffer: failed to transact; errno=%d", ret);
52 return nullptr;
53 }
54}
55
Fan Xu3a96ccd2018-10-23 13:05:11 -070056status_t BpBufferHub::importBuffer(uint64_t token,
57 sp<IBufferClient>* outClient) {
58 Parcel data, reply;
59 status_t ret = NO_ERROR;
60 ret |= data.writeInterfaceToken(IBufferHub::getInterfaceDescriptor());
61 ret |= data.writeUint64(token);
62 if (ret != NO_ERROR) {
63 ALOGE("BpBufferHub::importBuffer: failed to write into parcel");
64 return ret;
65 }
66
67 ret = remote()->transact(IMPORT_BUFFER, data, &reply);
68 if (ret == NO_ERROR) {
69 *outClient = interface_cast<IBufferClient>(reply.readStrongBinder());
70 return NO_ERROR;
71 } else {
72 ALOGE("BpBufferHub::importBuffer: failed to transact; errno=%d", ret);
73 return ret;
74 }
75}
76
Fan Xuf35719a2018-10-10 11:38:31 -070077status_t BnBufferHub::onTransact(uint32_t code, const Parcel& data,
78 Parcel* reply, uint32_t flags) {
79 switch (code) {
Fan Xu6df8c2a2018-10-10 15:53:21 -070080 case CREATE_BUFFER: {
81 CHECK_INTERFACE(IBufferHub, data, reply);
82 uint32_t width = data.readUint32();
83 uint32_t height = data.readUint32();
84 uint32_t layer_count = data.readUint32();
85 uint32_t format = data.readUint32();
86 uint64_t usage = data.readUint64();
87 uint64_t user_metadata_size = data.readUint64();
88 sp<IBufferClient> ret = createBuffer(width, height, layer_count, format,
89 usage, user_metadata_size);
90 return reply->writeStrongBinder(IInterface::asBinder(ret));
Fan Xud94e2ee2018-10-19 14:42:45 -070091 }
Fan Xu3a96ccd2018-10-23 13:05:11 -070092 case IMPORT_BUFFER: {
93 CHECK_INTERFACE(IBufferHub, data, reply);
94 uint64_t token = data.readUint64();
95 sp<IBufferClient> client;
96 status_t ret = importBuffer(token, &client);
97 if (ret == NO_ERROR) {
98 return reply->writeStrongBinder(IInterface::asBinder(client));
99 } else {
100 return ret;
101 }
102 }
Fan Xuf35719a2018-10-10 11:38:31 -0700103 default:
Fan Xu6df8c2a2018-10-10 15:53:21 -0700104 // Should not reach except binder defined transactions such as dumpsys
Fan Xuf35719a2018-10-10 11:38:31 -0700105 return BBinder::onTransact(code, data, reply, flags);
106 }
107}
108
109} // namespace dvr
110} // namespace android