1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #pragma once 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker #include <bufferpool2/BufferPoolTypes.h> 20*4d7e907cSAndroid Build Coastguard Worker #include <map> 21*4d7e907cSAndroid Build Coastguard Worker #include <memory> 22*4d7e907cSAndroid Build Coastguard Worker #include <mutex> 23*4d7e907cSAndroid Build Coastguard Worker #include <vector> 24*4d7e907cSAndroid Build Coastguard Worker #include <list> 25*4d7e907cSAndroid Build Coastguard Worker 26*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::media::bufferpool2::implementation { 27*4d7e907cSAndroid Build Coastguard Worker 28*4d7e907cSAndroid Build Coastguard Worker bool isMessageLater(uint32_t curMsgId, uint32_t prevMsgId); 29*4d7e907cSAndroid Build Coastguard Worker 30*4d7e907cSAndroid Build Coastguard Worker bool isBufferInRange(BufferId from, BufferId to, BufferId bufferId); 31*4d7e907cSAndroid Build Coastguard Worker 32*4d7e907cSAndroid Build Coastguard Worker /** 33*4d7e907cSAndroid Build Coastguard Worker * A collection of buffer status message FMQ for a buffer pool. buffer 34*4d7e907cSAndroid Build Coastguard Worker * ownership/status change messages are sent via the FMQs from the clients. 35*4d7e907cSAndroid Build Coastguard Worker */ 36*4d7e907cSAndroid Build Coastguard Worker class BufferStatusObserver { 37*4d7e907cSAndroid Build Coastguard Worker private: 38*4d7e907cSAndroid Build Coastguard Worker std::map<ConnectionId, std::unique_ptr<BufferStatusQueue>> 39*4d7e907cSAndroid Build Coastguard Worker mBufferStatusQueues; 40*4d7e907cSAndroid Build Coastguard Worker 41*4d7e907cSAndroid Build Coastguard Worker public: 42*4d7e907cSAndroid Build Coastguard Worker /** Creates a buffer status message FMQ for the specified 43*4d7e907cSAndroid Build Coastguard Worker * connection(client). 44*4d7e907cSAndroid Build Coastguard Worker * 45*4d7e907cSAndroid Build Coastguard Worker * @param connectionId connection Id of the specified client. 46*4d7e907cSAndroid Build Coastguard Worker * @param fmqDescPtr ptr of created FMQ's descriptor. 47*4d7e907cSAndroid Build Coastguard Worker * 48*4d7e907cSAndroid Build Coastguard Worker * @return OK if FMQ is created successfully. 49*4d7e907cSAndroid Build Coastguard Worker * NO_MEMORY when there is no memory. 50*4d7e907cSAndroid Build Coastguard Worker * CRITICAL_ERROR otherwise. 51*4d7e907cSAndroid Build Coastguard Worker */ 52*4d7e907cSAndroid Build Coastguard Worker BufferPoolStatus open(ConnectionId id, StatusDescriptor* _Nonnull fmqDescPtr); 53*4d7e907cSAndroid Build Coastguard Worker 54*4d7e907cSAndroid Build Coastguard Worker /** Closes a buffer status message FMQ for the specified 55*4d7e907cSAndroid Build Coastguard Worker * connection(client). 56*4d7e907cSAndroid Build Coastguard Worker * 57*4d7e907cSAndroid Build Coastguard Worker * @param connectionId connection Id of the specified client. 58*4d7e907cSAndroid Build Coastguard Worker * 59*4d7e907cSAndroid Build Coastguard Worker * @return OK if the specified connection is closed successfully. 60*4d7e907cSAndroid Build Coastguard Worker * CRITICAL_ERROR otherwise. 61*4d7e907cSAndroid Build Coastguard Worker */ 62*4d7e907cSAndroid Build Coastguard Worker BufferPoolStatus close(ConnectionId id); 63*4d7e907cSAndroid Build Coastguard Worker 64*4d7e907cSAndroid Build Coastguard Worker /** Retrieves all pending FMQ buffer status messages from clients. 65*4d7e907cSAndroid Build Coastguard Worker * 66*4d7e907cSAndroid Build Coastguard Worker * @param messages retrieved pending messages. 67*4d7e907cSAndroid Build Coastguard Worker */ 68*4d7e907cSAndroid Build Coastguard Worker void getBufferStatusChanges(std::vector<BufferStatusMessage> &messages); 69*4d7e907cSAndroid Build Coastguard Worker }; 70*4d7e907cSAndroid Build Coastguard Worker 71*4d7e907cSAndroid Build Coastguard Worker /** 72*4d7e907cSAndroid Build Coastguard Worker * A buffer status message FMQ for a buffer pool client. Buffer ownership/status 73*4d7e907cSAndroid Build Coastguard Worker * change messages are sent via the fmq to the buffer pool. 74*4d7e907cSAndroid Build Coastguard Worker */ 75*4d7e907cSAndroid Build Coastguard Worker class BufferStatusChannel { 76*4d7e907cSAndroid Build Coastguard Worker private: 77*4d7e907cSAndroid Build Coastguard Worker bool mValid; 78*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<BufferStatusQueue> mBufferStatusQueue; 79*4d7e907cSAndroid Build Coastguard Worker 80*4d7e907cSAndroid Build Coastguard Worker public: 81*4d7e907cSAndroid Build Coastguard Worker /** 82*4d7e907cSAndroid Build Coastguard Worker * Connects to a buffer status message FMQ from a descriptor of 83*4d7e907cSAndroid Build Coastguard Worker * the created FMQ. 84*4d7e907cSAndroid Build Coastguard Worker * 85*4d7e907cSAndroid Build Coastguard Worker * @param fmqDesc Descriptor of the created FMQ. 86*4d7e907cSAndroid Build Coastguard Worker */ 87*4d7e907cSAndroid Build Coastguard Worker BufferStatusChannel(const StatusDescriptor &fmqDesc); 88*4d7e907cSAndroid Build Coastguard Worker 89*4d7e907cSAndroid Build Coastguard Worker /** Returns whether the FMQ is connected successfully. */ 90*4d7e907cSAndroid Build Coastguard Worker bool isValid(); 91*4d7e907cSAndroid Build Coastguard Worker 92*4d7e907cSAndroid Build Coastguard Worker /** Returns whether the FMQ needs to be synced from the buffer pool */ 93*4d7e907cSAndroid Build Coastguard Worker bool needsSync(); 94*4d7e907cSAndroid Build Coastguard Worker 95*4d7e907cSAndroid Build Coastguard Worker /** 96*4d7e907cSAndroid Build Coastguard Worker * Posts a buffer release message to the buffer pool. 97*4d7e907cSAndroid Build Coastguard Worker * 98*4d7e907cSAndroid Build Coastguard Worker * @param connectionId connection Id of the client. 99*4d7e907cSAndroid Build Coastguard Worker * @param pending currently pending buffer release messages. 100*4d7e907cSAndroid Build Coastguard Worker * @param posted posted buffer release messages. 101*4d7e907cSAndroid Build Coastguard Worker */ 102*4d7e907cSAndroid Build Coastguard Worker void postBufferRelease( 103*4d7e907cSAndroid Build Coastguard Worker ConnectionId connectionId, 104*4d7e907cSAndroid Build Coastguard Worker std::list<BufferId> &pending, std::list<BufferId> &posted); 105*4d7e907cSAndroid Build Coastguard Worker 106*4d7e907cSAndroid Build Coastguard Worker /** 107*4d7e907cSAndroid Build Coastguard Worker * Posts a buffer status message regarding the specified buffer 108*4d7e907cSAndroid Build Coastguard Worker * transfer transaction. 109*4d7e907cSAndroid Build Coastguard Worker * 110*4d7e907cSAndroid Build Coastguard Worker * @param transactionId Id of the specified transaction. 111*4d7e907cSAndroid Build Coastguard Worker * @param bufferId buffer Id of the specified transaction. 112*4d7e907cSAndroid Build Coastguard Worker * @param status new status of the buffer. 113*4d7e907cSAndroid Build Coastguard Worker * @param connectionId connection Id of the client. 114*4d7e907cSAndroid Build Coastguard Worker * @param targetId connection Id of the receiver(only when the sender 115*4d7e907cSAndroid Build Coastguard Worker * posts a status message). 116*4d7e907cSAndroid Build Coastguard Worker * @param pending currently pending buffer release messages. 117*4d7e907cSAndroid Build Coastguard Worker * @param posted posted buffer release messages. 118*4d7e907cSAndroid Build Coastguard Worker * 119*4d7e907cSAndroid Build Coastguard Worker * @return {@code true} when the specified message is posted, 120*4d7e907cSAndroid Build Coastguard Worker * {@code false} otherwise. 121*4d7e907cSAndroid Build Coastguard Worker */ 122*4d7e907cSAndroid Build Coastguard Worker bool postBufferStatusMessage( 123*4d7e907cSAndroid Build Coastguard Worker TransactionId transactionId, 124*4d7e907cSAndroid Build Coastguard Worker BufferId bufferId, 125*4d7e907cSAndroid Build Coastguard Worker BufferStatus status, 126*4d7e907cSAndroid Build Coastguard Worker ConnectionId connectionId, 127*4d7e907cSAndroid Build Coastguard Worker ConnectionId targetId, 128*4d7e907cSAndroid Build Coastguard Worker std::list<BufferId> &pending, std::list<BufferId> &posted); 129*4d7e907cSAndroid Build Coastguard Worker 130*4d7e907cSAndroid Build Coastguard Worker /** 131*4d7e907cSAndroid Build Coastguard Worker * Posts a buffer invaliadation message to the buffer pool. 132*4d7e907cSAndroid Build Coastguard Worker * 133*4d7e907cSAndroid Build Coastguard Worker * @param connectionId connection Id of the client. 134*4d7e907cSAndroid Build Coastguard Worker * @param invalidateId invalidation ack to the buffer pool. 135*4d7e907cSAndroid Build Coastguard Worker * if invalidation id is zero, the ack will not be 136*4d7e907cSAndroid Build Coastguard Worker * posted. 137*4d7e907cSAndroid Build Coastguard Worker * @param invalidated sets {@code true} only when the invalidation ack is 138*4d7e907cSAndroid Build Coastguard Worker * posted. 139*4d7e907cSAndroid Build Coastguard Worker */ 140*4d7e907cSAndroid Build Coastguard Worker void postBufferInvalidateAck( 141*4d7e907cSAndroid Build Coastguard Worker ConnectionId connectionId, 142*4d7e907cSAndroid Build Coastguard Worker uint32_t invalidateId, 143*4d7e907cSAndroid Build Coastguard Worker bool* _Nonnull invalidated); 144*4d7e907cSAndroid Build Coastguard Worker }; 145*4d7e907cSAndroid Build Coastguard Worker 146*4d7e907cSAndroid Build Coastguard Worker /** 147*4d7e907cSAndroid Build Coastguard Worker * A buffer invalidation FMQ for a buffer pool client. Buffer invalidation 148*4d7e907cSAndroid Build Coastguard Worker * messages are received via the fmq from the buffer pool. Buffer invalidation 149*4d7e907cSAndroid Build Coastguard Worker * messages are handled as soon as possible. 150*4d7e907cSAndroid Build Coastguard Worker */ 151*4d7e907cSAndroid Build Coastguard Worker class BufferInvalidationListener { 152*4d7e907cSAndroid Build Coastguard Worker private: 153*4d7e907cSAndroid Build Coastguard Worker bool mValid; 154*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<BufferInvalidationQueue> mBufferInvalidationQueue; 155*4d7e907cSAndroid Build Coastguard Worker 156*4d7e907cSAndroid Build Coastguard Worker public: 157*4d7e907cSAndroid Build Coastguard Worker /** 158*4d7e907cSAndroid Build Coastguard Worker * Connects to a buffer invalidation FMQ from a descriptor of the created FMQ. 159*4d7e907cSAndroid Build Coastguard Worker * 160*4d7e907cSAndroid Build Coastguard Worker * @param fmqDesc Descriptor of the created FMQ. 161*4d7e907cSAndroid Build Coastguard Worker */ 162*4d7e907cSAndroid Build Coastguard Worker BufferInvalidationListener(const InvalidationDescriptor &fmqDesc); 163*4d7e907cSAndroid Build Coastguard Worker 164*4d7e907cSAndroid Build Coastguard Worker /** Retrieves all pending buffer invalidation messages from the buffer pool. 165*4d7e907cSAndroid Build Coastguard Worker * 166*4d7e907cSAndroid Build Coastguard Worker * @param messages retrieved pending messages. 167*4d7e907cSAndroid Build Coastguard Worker */ 168*4d7e907cSAndroid Build Coastguard Worker void getInvalidations(std::vector<BufferInvalidationMessage> &messages); 169*4d7e907cSAndroid Build Coastguard Worker 170*4d7e907cSAndroid Build Coastguard Worker /** Returns whether the FMQ is connected successfully. */ 171*4d7e907cSAndroid Build Coastguard Worker bool isValid(); 172*4d7e907cSAndroid Build Coastguard Worker }; 173*4d7e907cSAndroid Build Coastguard Worker 174*4d7e907cSAndroid Build Coastguard Worker /** 175*4d7e907cSAndroid Build Coastguard Worker * A buffer invalidation FMQ for a buffer pool. A buffer pool will send buffer 176*4d7e907cSAndroid Build Coastguard Worker * invalidation messages to the clients via the FMQ. The FMQ is shared among 177*4d7e907cSAndroid Build Coastguard Worker * buffer pool clients. 178*4d7e907cSAndroid Build Coastguard Worker */ 179*4d7e907cSAndroid Build Coastguard Worker class BufferInvalidationChannel { 180*4d7e907cSAndroid Build Coastguard Worker private: 181*4d7e907cSAndroid Build Coastguard Worker bool mValid; 182*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<BufferInvalidationQueue> mBufferInvalidationQueue; 183*4d7e907cSAndroid Build Coastguard Worker 184*4d7e907cSAndroid Build Coastguard Worker public: 185*4d7e907cSAndroid Build Coastguard Worker /** 186*4d7e907cSAndroid Build Coastguard Worker * Creates a buffer invalidation FMQ for a buffer pool. 187*4d7e907cSAndroid Build Coastguard Worker */ 188*4d7e907cSAndroid Build Coastguard Worker BufferInvalidationChannel(); 189*4d7e907cSAndroid Build Coastguard Worker 190*4d7e907cSAndroid Build Coastguard Worker /** Returns whether the FMQ is connected successfully. */ 191*4d7e907cSAndroid Build Coastguard Worker bool isValid(); 192*4d7e907cSAndroid Build Coastguard Worker 193*4d7e907cSAndroid Build Coastguard Worker /** 194*4d7e907cSAndroid Build Coastguard Worker * Retrieves the descriptor of a buffer invalidation FMQ. the descriptor may 195*4d7e907cSAndroid Build Coastguard Worker * be passed to the client for buffer invalidation handling. 196*4d7e907cSAndroid Build Coastguard Worker * 197*4d7e907cSAndroid Build Coastguard Worker * @param fmqDescPtr ptr of created FMQ's descriptor. 198*4d7e907cSAndroid Build Coastguard Worker */ 199*4d7e907cSAndroid Build Coastguard Worker void getDesc(InvalidationDescriptor* _Nonnull fmqDescPtr); 200*4d7e907cSAndroid Build Coastguard Worker 201*4d7e907cSAndroid Build Coastguard Worker /** Posts a buffer invalidation for invalidated buffers. 202*4d7e907cSAndroid Build Coastguard Worker * 203*4d7e907cSAndroid Build Coastguard Worker * @param msgId Invalidation message id which is used when clients send 204*4d7e907cSAndroid Build Coastguard Worker * acks back via BufferStatusMessage 205*4d7e907cSAndroid Build Coastguard Worker * @param fromId The start bufferid of the invalidated buffers(inclusive) 206*4d7e907cSAndroid Build Coastguard Worker * @param toId The end bufferId of the invalidated buffers(inclusive) 207*4d7e907cSAndroid Build Coastguard Worker */ 208*4d7e907cSAndroid Build Coastguard Worker void postInvalidation(uint32_t msgId, BufferId fromId, BufferId toId); 209*4d7e907cSAndroid Build Coastguard Worker }; 210*4d7e907cSAndroid Build Coastguard Worker 211*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::media::bufferpool2::implementation 212