Home | History | Annotate | Download | only in bufferpool
      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