Home | History | Annotate | Download | only in 2.0
      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_V2_0_BUFFERSTATUS_H
     18 #define ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V2_0_BUFFERSTATUS_H
     19 
     20 #include <android/hardware/media/bufferpool/2.0/types.h>
     21 #include <bufferpool/BufferPoolTypes.h>
     22 #include <fmq/MessageQueue.h>
     23 #include <hidl/MQDescriptor.h>
     24 #include <hidl/Status.h>
     25 #include <memory>
     26 #include <mutex>
     27 #include <vector>
     28 #include <list>
     29 
     30 namespace android {
     31 namespace hardware {
     32 namespace media {
     33 namespace bufferpool {
     34 namespace V2_0 {
     35 namespace implementation {
     36 
     37 /** Returns monotonic timestamp in Us since fixed point in time. */
     38 int64_t getTimestampNow();
     39 
     40 bool isMessageLater(uint32_t curMsgId, uint32_t prevMsgId);
     41 
     42 bool isBufferInRange(BufferId from, BufferId to, BufferId bufferId);
     43 
     44 /**
     45  * A collection of buffer status message FMQ for a buffer pool. buffer
     46  * ownership/status change messages are sent via the FMQs from the clients.
     47  */
     48 class BufferStatusObserver {
     49 private:
     50     std::map<ConnectionId, std::unique_ptr<BufferStatusQueue>>
     51             mBufferStatusQueues;
     52 
     53 public:
     54     /** Creates a buffer status message FMQ for the specified
     55      * connection(client).
     56      *
     57      * @param connectionId  connection Id of the specified client.
     58      * @param fmqDescPtr    double ptr of created FMQ's descriptor.
     59      *
     60      * @return OK if FMQ is created successfully.
     61      *         NO_MEMORY when there is no memory.
     62      *         CRITICAL_ERROR otherwise.
     63      */
     64     ResultStatus open(ConnectionId id, const StatusDescriptor** fmqDescPtr);
     65 
     66     /** Closes a buffer status message FMQ for the specified
     67      * connection(client).
     68      *
     69      * @param connectionId  connection Id of the specified client.
     70      *
     71      * @return OK if the specified connection is closed successfully.
     72      *         CRITICAL_ERROR otherwise.
     73      */
     74     ResultStatus close(ConnectionId id);
     75 
     76     /** Retrieves all pending FMQ buffer status messages from clients.
     77      *
     78      * @param messages  retrieved pending messages.
     79      */
     80     void getBufferStatusChanges(std::vector<BufferStatusMessage> &messages);
     81 };
     82 
     83 /**
     84  * A buffer status message FMQ for a buffer pool client. Buffer ownership/status
     85  * change messages are sent via the fmq to the buffer pool.
     86  */
     87 class BufferStatusChannel {
     88 private:
     89     bool mValid;
     90     std::unique_ptr<BufferStatusQueue> mBufferStatusQueue;
     91 
     92 public:
     93     /**
     94      * Connects to a buffer status message FMQ from a descriptor of
     95      * the created FMQ.
     96      *
     97      * @param fmqDesc   Descriptor of the created FMQ.
     98      */
     99     BufferStatusChannel(const StatusDescriptor &fmqDesc);
    100 
    101     /** Returns whether the FMQ is connected successfully. */
    102     bool isValid();
    103 
    104     /** Returns whether the FMQ needs to be synced from the buffer pool */
    105     bool needsSync();
    106 
    107     /**
    108      * Posts a buffer release message to the buffer pool.
    109      *
    110      * @param connectionId  connection Id of the client.
    111      * @param pending       currently pending buffer release messages.
    112      * @param posted        posted buffer release messages.
    113      */
    114     void postBufferRelease(
    115             ConnectionId connectionId,
    116             std::list<BufferId> &pending, std::list<BufferId> &posted);
    117 
    118     /**
    119      * Posts a buffer status message regarding the specified buffer
    120      * transfer transaction.
    121      *
    122      * @param transactionId Id of the specified transaction.
    123      * @param bufferId      buffer Id of the specified transaction.
    124      * @param status        new status of the buffer.
    125      * @param connectionId  connection Id of the client.
    126      * @param targetId      connection Id of the receiver(only when the sender
    127      *                      posts a status message).
    128      * @param pending       currently pending buffer release messages.
    129      * @param posted        posted buffer release messages.
    130      *
    131      * @return {@code true} when the specified message is posted,
    132      *         {@code false} otherwise.
    133      */
    134     bool postBufferStatusMessage(
    135             TransactionId transactionId,
    136             BufferId bufferId,
    137             BufferStatus status,
    138             ConnectionId connectionId,
    139             ConnectionId targetId,
    140             std::list<BufferId> &pending, std::list<BufferId> &posted);
    141 
    142     /**
    143      * Posts a buffer invaliadation messge to the buffer pool.
    144      *
    145      * @param connectionId  connection Id of the client.
    146      * @param invalidateId  invalidation ack to the buffer pool.
    147      *                      if invalidation id is zero, the ack will not be
    148      *                      posted.
    149      * @param invalidated   sets {@code true} only when the invalidation ack is
    150      *                      posted.
    151      */
    152     void postBufferInvalidateAck(
    153             ConnectionId connectionId,
    154             uint32_t invalidateId,
    155             bool *invalidated);
    156 };
    157 
    158 /**
    159  * A buffer invalidation FMQ for a buffer pool client. Buffer invalidation
    160  * messages are received via the fmq from the buffer pool. Buffer invalidation
    161  * messages are handled as soon as possible.
    162  */
    163 class BufferInvalidationListener {
    164 private:
    165     bool mValid;
    166     std::unique_ptr<BufferInvalidationQueue> mBufferInvalidationQueue;
    167 
    168 public:
    169     /**
    170      * Connects to a buffer invalidation FMQ from a descriptor of the created FMQ.
    171      *
    172      * @param fmqDesc   Descriptor of the created FMQ.
    173      */
    174     BufferInvalidationListener(const InvalidationDescriptor &fmqDesc);
    175 
    176     /** Retrieves all pending buffer invalidation messages from the buffer pool.
    177      *
    178      * @param messages  retrieved pending messages.
    179      */
    180     void getInvalidations(std::vector<BufferInvalidationMessage> &messages);
    181 
    182     /** Returns whether the FMQ is connected succesfully. */
    183     bool isValid();
    184 };
    185 
    186 /**
    187  * A buffer invalidation FMQ for a buffer pool. A buffer pool will send buffer
    188  * invalidation messages to the clients via the FMQ. The FMQ is shared among
    189  * buffer pool clients.
    190  */
    191 class BufferInvalidationChannel {
    192 private:
    193     bool mValid;
    194     std::unique_ptr<BufferInvalidationQueue> mBufferInvalidationQueue;
    195 
    196 public:
    197     /**
    198      * Creates a buffer invalidation FMQ for a buffer pool.
    199      */
    200     BufferInvalidationChannel();
    201 
    202     /** Returns whether the FMQ is connected succesfully. */
    203     bool isValid();
    204 
    205     /**
    206      * Retrieves the descriptor of a buffer invalidation FMQ. the descriptor may
    207      * be passed to the client for buffer invalidation handling.
    208      *
    209      * @param fmqDescPtr    double ptr of created FMQ's descriptor.
    210      */
    211     void getDesc(const InvalidationDescriptor **fmqDescPtr);
    212 
    213     /** Posts a buffer invalidation for invalidated buffers.
    214      *
    215      * @param msgId     Invalidation message id which is used when clients send
    216      *                  acks back via BufferStatusMessage
    217      * @param fromId    The start bufferid of the invalidated buffers(inclusive)
    218      * @param toId      The end bufferId of the invalidated buffers(inclusive)
    219      */
    220     void postInvalidation(uint32_t msgId, BufferId fromId, BufferId toId);
    221 };
    222 
    223 }  // namespace implementation
    224 }  // namespace V2_0
    225 }  // namespace bufferpool
    226 }  // namespace media
    227 }  // namespace hardware
    228 }  // namespace android
    229 
    230 #endif  // ANDROID_HARDWARE_MEDIA_BUFFERPOOL_V2_0_BUFFERSTATUS_H
    231