xref: /aosp_15_r20/hardware/interfaces/media/bufferpool/aidl/default/BufferStatus.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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