blob: 5980873ad181e0df7883afb0779337293ed2bdcc [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;
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080033 status_t ret = OK;
Fan Xu6df8c2a2018-10-10 15:53:21 -070034 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
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080042 if (ret != OK) {
Fan Xu6df8c2a2018-10-10 15:53:21 -070043 ALOGE("BpBufferHub::createBuffer: failed to write into parcel");
44 return nullptr;
45 }
46
47 ret = remote()->transact(CREATE_BUFFER, data, &reply);
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080048 if (ret == OK) {
Fan Xu6df8c2a2018-10-10 15:53:21 -070049 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;
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080059 status_t ret = OK;
Fan Xu3a96ccd2018-10-23 13:05:11 -070060 ret |= data.writeInterfaceToken(IBufferHub::getInterfaceDescriptor());
61 ret |= data.writeUint64(token);
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080062 if (ret != OK) {
Fan Xu3a96ccd2018-10-23 13:05:11 -070063 ALOGE("BpBufferHub::importBuffer: failed to write into parcel");
64 return ret;
65 }
66
67 ret = remote()->transact(IMPORT_BUFFER, data, &reply);
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080068 if (ret == OK) {
Fan Xu3a96ccd2018-10-23 13:05:11 -070069 *outClient = interface_cast<IBufferClient>(reply.readStrongBinder());
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080070 return OK;
Fan Xu3a96ccd2018-10-23 13:05:11 -070071 } 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);
Tianyu Jiang932fb4f2018-11-15 11:09:58 -080097 if (ret == OK) {
Fan Xu3a96ccd2018-10-23 13:05:11 -070098 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