1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V1_0_ACCESSOR_H 18 #define ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V1_0_ACCESSOR_H 19 20 #include <android/hardware/media/bufferpool/1.0/IAccessor.h> 21 #include <bufferpool/BufferPoolTypes.h> 22 #include <hidl/MQDescriptor.h> 23 #include <hidl/Status.h> 24 #include "BufferStatus.h" 25 26 #include <set> 27 28 namespace android { 29 namespace hardware { 30 namespace media { 31 namespace bufferpool { 32 namespace V1_0 { 33 namespace implementation { 34 35 using ::android::hardware::hidl_array; 36 using ::android::hardware::hidl_memory; 37 using ::android::hardware::hidl_string; 38 using ::android::hardware::hidl_vec; 39 using ::android::hardware::Return; 40 using ::android::hardware::Void; 41 using ::android::sp; 42 43 struct Accessor; 44 struct Connection; 45 46 /** 47 * Receives death notifications from remote connections. 48 * On death notifications, the connections are closed and used resources 49 * are released. 50 */ 51 struct ConnectionDeathRecipient : public hardware::hidl_death_recipient { 52 /** 53 * Registers a newly connected connection from remote processes. 54 */ 55 void add(int64_t connectionId, const sp<Accessor> &accessor); 56 57 /** 58 * Removes a connection. 59 */ 60 void remove(int64_t connectionId); 61 62 void addCookieToConnection(uint64_t cookie, int64_t connectionId); 63 64 virtual void serviceDied( 65 uint64_t /* cookie */, 66 const wp<::android::hidl::base::V1_0::IBase>& /* who */ 67 ) override; 68 69 private: 70 std::mutex mLock; 71 std::map<uint64_t, std::set<int64_t>> mCookieToConnections; 72 std::map<int64_t, uint64_t> mConnectionToCookie; 73 std::map<int64_t, const wp<Accessor>> mAccessors; 74 }; 75 76 /** 77 * A buffer pool accessor which enables a buffer pool to communicate with buffer 78 * pool clients. 1:1 correspondense holds between a buffer pool and an accessor. 79 */ 80 struct Accessor : public IAccessor { 81 // Methods from ::android::hardware::media::bufferpool::V1_0::IAccessor follow. 82 Return<void> connect(connect_cb _hidl_cb) override; 83 84 /** 85 * Creates a buffer pool accessor which uses the specified allocator. 86 * 87 * @param allocator buffer allocator. 88 */ 89 explicit Accessor(const std::shared_ptr<BufferPoolAllocator> &allocator); 90 91 /** Destructs a buffer pool accessor. */ 92 ~Accessor(); 93 94 /** Returns whether the accessor is valid. */ 95 bool isValid(); 96 97 /** Allocates a buffer from a buffer pool. 98 * 99 * @param connectionId the connection id of the client. 100 * @param params the allocation parameters. 101 * @param bufferId the id of the allocated buffer. 102 * @param handle the native handle of the allocated buffer. 103 * 104 * @return OK when a buffer is successfully allocated. 105 * NO_MEMORY when there is no memory. 106 * CRITICAL_ERROR otherwise. 107 */ 108 ResultStatus allocate( 109 ConnectionId connectionId, 110 const std::vector<uint8_t>& params, 111 BufferId *bufferId, 112 const native_handle_t** handle); 113 114 /** 115 * Fetches a buffer for the specified transaction. 116 * 117 * @param connectionId the id of receiving connection(client). 118 * @param transactionId the id of the transfer transaction. 119 * @param bufferId the id of the buffer to be fetched. 120 * @param handle the native handle of the fetched buffer. 121 * 122 * @return OK when a buffer is successfully fetched. 123 * NO_MEMORY when there is no memory. 124 * CRITICAL_ERROR otherwise. 125 */ 126 ResultStatus fetch( 127 ConnectionId connectionId, 128 TransactionId transactionId, 129 BufferId bufferId, 130 const native_handle_t** handle); 131 132 /** 133 * Makes a connection to the buffer pool. The buffer pool client uses the 134 * created connection in order to communicate with the buffer pool. An 135 * FMQ for buffer status message is also created for the client. 136 * 137 * @param connection created connection 138 * @param pConnectionId the id of the created connection 139 * @param fmqDescPtr FMQ descriptor for shared buffer status message 140 * queue between a buffer pool and the client. 141 * @param local true when a connection request comes from local process, 142 * false otherwise. 143 * 144 * @return OK when a connection is successfully made. 145 * NO_MEMORY when there is no memory. 146 * CRITICAL_ERROR otherwise. 147 */ 148 ResultStatus connect( 149 sp<Connection> *connection, ConnectionId *pConnectionId, 150 const QueueDescriptor** fmqDescPtr, bool local); 151 152 /** 153 * Closes the specified connection to the client. 154 * 155 * @param connectionId the id of the connection. 156 * 157 * @return OK when the connection is closed. 158 * CRITICAL_ERROR otherwise. 159 */ 160 ResultStatus close(ConnectionId connectionId); 161 162 /** 163 * Processes pending buffer status messages and perfoms periodic cache 164 * cleaning. 165 * 166 * @param clearCache if clearCache is true, it frees all buffers waiting 167 * to be recycled. 168 */ 169 void cleanUp(bool clearCache); 170 171 /** 172 * Gets a hidl_death_recipient for remote connection death. 173 */ 174 static sp<ConnectionDeathRecipient> getConnectionDeathRecipient(); 175 176 private: 177 class Impl; 178 std::unique_ptr<Impl> mImpl; 179 }; 180 181 } // namespace implementation 182 } // namespace V1_0 183 } // namespace bufferpool 184 } // namespace media 185 } // namespace hardware 186 } // namespace android 187 188 #endif // ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V1_0_ACCESSOR_H 189