1 /* 2 * Copyright (c) 2021-2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef HISTREAMER_FOUNDATION_AVBUFFER_QUEUE_IMPL_H 17 #define HISTREAMER_FOUNDATION_AVBUFFER_QUEUE_IMPL_H 18 19 #include <list> 20 #include <map> 21 #include <string> 22 #include <mutex> 23 #include <condition_variable> 24 #include "buffer/avbuffer_queue.h" 25 26 namespace OHOS { 27 namespace Media { 28 29 using AVBufferState = enum AVBufferState { 30 AVBUFFER_STATE_RELEASED, 31 AVBUFFER_STATE_REQUESTED, 32 AVBUFFER_STATE_PUSHED, 33 AVBUFFER_STATE_RETURNED, 34 AVBUFFER_STATE_ACQUIRED, 35 AVBUFFER_STATE_ATTACHED, 36 }; 37 38 using AVBufferElement = struct AVBufferElement { 39 AVBufferConfig config; 40 AVBufferState state; 41 bool isDeleting; 42 std::shared_ptr<AVBuffer> buffer; 43 }; 44 45 class AVBufferQueueProducerImpl; 46 class AVBufferQueueConsumerImpl; 47 48 // 当前调试版本,错误码统一用int32_t表示,0表示返回正确,非0表示返回错误。 49 class AVBufferQueueImpl : public AVBufferQueue, public std::enable_shared_from_this<AVBufferQueueImpl> { 50 public: 51 explicit AVBufferQueueImpl(const std::string &name); 52 AVBufferQueueImpl(uint32_t size, MemoryType type, const std::string &name, bool disableAlloc = false); 53 ~AVBufferQueueImpl() override = default; 54 AVBufferQueueImpl(const AVBufferQueueImpl&) = delete; 55 AVBufferQueueImpl operator=(const AVBufferQueueImpl&) = delete; 56 57 std::shared_ptr<AVBufferQueueProducer> GetLocalProducer() override; 58 std::shared_ptr<AVBufferQueueConsumer> GetLocalConsumer() override; 59 60 sptr<AVBufferQueueProducer> GetProducer() override; 61 sptr<AVBufferQueueConsumer> GetConsumer() override; 62 GetSurfaceAsProducer()63 inline sptr<Surface> GetSurfaceAsProducer() override { return nullptr; } GetSurfaceAsConsumer()64 inline sptr<Surface> GetSurfaceAsConsumer() override { return nullptr; } 65 66 uint32_t GetQueueSize() override; 67 Status SetQueueSize(uint32_t size) override; 68 bool IsBufferInQueue(const std::shared_ptr<AVBuffer>& buffer) override; 69 Status Clear() override; 70 71 virtual Status RequestBuffer(std::shared_ptr<AVBuffer>& buffer, 72 const AVBufferConfig& config, int32_t timeoutMs); 73 virtual Status PushBuffer(uint64_t uniqueId, bool available); 74 virtual Status PushBuffer(const std::shared_ptr<AVBuffer>& buffer, bool available); 75 virtual Status ReturnBuffer(uint64_t uniqueId, bool available); 76 virtual Status ReturnBuffer(const std::shared_ptr<AVBuffer>& buffer, bool available); 77 78 virtual Status AttachBuffer(std::shared_ptr<AVBuffer>& buffer, bool isFilled); 79 virtual Status DetachBuffer(uint64_t uniqueId); 80 virtual Status DetachBuffer(const std::shared_ptr<AVBuffer>& buffer); 81 82 virtual Status AcquireBuffer(std::shared_ptr<AVBuffer>& buffer); 83 virtual Status ReleaseBuffer(const std::shared_ptr<AVBuffer>& buffer); 84 85 virtual Status SetBrokerListener(sptr<IBrokerListener>& listener); 86 virtual Status SetProducerListener(sptr<IProducerListener>& listener); 87 virtual Status SetConsumerListener(sptr<IConsumerListener>& listener); 88 89 protected: 90 std::string name_; 91 92 std::mutex producerCreatorMutex_; 93 std::mutex consumerCreatorMutex_; 94 95 sptr<IBrokerListener> brokerListener_; 96 sptr<IProducerListener> producerListener_; 97 sptr<IConsumerListener> consumerListener_; 98 99 std::mutex producerListenerMutex_; 100 std::mutex consumerListenerMutex_; 101 std::mutex brokerListenerMutex_; 102 103 std::mutex queueMutex_; 104 105 std::weak_ptr<AVBufferQueueProducerImpl> localProducer_; 106 std::weak_ptr<AVBufferQueueConsumerImpl> localConsumer_; 107 108 wptr<AVBufferQueueProducerImpl> producer_; 109 wptr<AVBufferQueueConsumerImpl> consumer_; 110 111 private: 112 uint32_t size_; 113 MemoryType memoryType_; 114 bool disableAlloc_; 115 116 std::map<uint64_t, AVBufferElement> cachedBufferMap_; 117 118 std::list<uint64_t> freeBufferList_; // 记录已分配的且处于空闲状态的buffer uniqueId,按bufferSize升序排列 119 std::list<uint64_t> dirtyBufferList_; 120 121 std::condition_variable requestCondition; 122 123 Status CheckConfig(const AVBufferConfig& config); 124 125 bool wait_for(std::unique_lock<std::mutex>& lock, int32_t timeoutMs); 126 127 uint32_t GetCachedBufferCount() const; 128 Status RequestReuseBuffer(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 129 void InsertFreeBufferInOrder(uint64_t uniqueId); 130 Status CancelBuffer(uint64_t uniqueId); 131 Status DetachBuffer(uint64_t uniqueId, bool force); 132 Status ReleaseBuffer(uint64_t uniqueId); 133 Status PopFromFreeBufferList(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 134 Status PopFromDirtyBufferList(std::shared_ptr<AVBuffer>& buffer); 135 Status AllocBuffer(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 136 137 void DeleteBuffers(uint32_t count); 138 void DeleteCachedBufferById(uint64_t uniqueId_); 139 }; 140 141 class AVBufferQueueSurfaceWrapper : public AVBufferQueueImpl { 142 public: 143 enum: uint8_t { 144 PRODUCER_WRAPPER, 145 CONSUMER_WRAPPER, 146 BOTH_WRAPPER 147 }; 148 149 AVBufferQueueSurfaceWrapper(sptr<Surface>& surface, const std::string& name, uint8_t wrapperType); 150 151 sptr<AVBufferQueueProducer> GetProducer() override; 152 sptr<AVBufferQueueConsumer> GetConsumer() override; 153 154 sptr<Surface> GetSurfaceAsProducer() override; 155 sptr<Surface> GetSurfaceAsConsumer() override; 156 157 uint32_t GetQueueSize() override; 158 Status SetQueueSize(uint32_t size) override; 159 160 Status RequestBuffer(std::shared_ptr<AVBuffer>& buffer, 161 const AVBufferConfig& config, int32_t timeoutMs) override; 162 Status PushBuffer(uint64_t uniqueId, bool available) override; 163 Status PushBuffer(const std::shared_ptr<AVBuffer>& buffer, bool available) override; 164 Status ReturnBuffer(uint64_t uniqueId, bool available) override; 165 Status ReturnBuffer(const std::shared_ptr<AVBuffer>& buffer, bool available) override; 166 167 Status AttachBuffer(std::shared_ptr<AVBuffer>& buffer, bool isFilled) override; 168 Status DetachBuffer(uint64_t uniqueId) override; 169 Status DetachBuffer(const std::shared_ptr<AVBuffer>& buffer) override; 170 171 Status AcquireBuffer(std::shared_ptr<AVBuffer>& buffer) override; 172 Status ReleaseBuffer(const std::shared_ptr<AVBuffer>& buffer) override; 173 174 Status SetBrokerListener(sptr<IBrokerListener>& listener) override; 175 Status SetProducerListener(sptr<IProducerListener>& listener) override; 176 Status SetConsumerListener(sptr<IConsumerListener>& listener) override; 177 178 private: 179 sptr<Surface> surface_; 180 uint8_t wrapperType_; 181 182 std::list<uint64_t> freeBufferList_; 183 std::map<uint64_t, std::shared_ptr<AVBuffer>> cachedBufferMap_; 184 185 sptr<IBufferConsumerListener> surfaceConsumerListener_; 186 187 Status BindSurface(std::shared_ptr<AVBuffer>& buffer, sptr<SurfaceBuffer>& surfaceBuffer, int32_t fence); 188 Status UnbindSurface(uint64_t uniqueId, sptr<SurfaceBuffer>& surfaceBuffer, int32_t& fence, 189 BufferFlushConfig& config); 190 Status CancelBuffer(uint64_t uniqueId); 191 Status ReleaseBuffer(uint64_t uniqueId); 192 }; 193 194 } // namespace Media 195 } // namespace OHOS 196 197 #endif // HISTREAMER_FOUNDATION_AVBUFFER_QUEUE_IMPL_H 198