1 /* 2 * Copyright (c) 2021-2025 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 virtual Status SetLargerQueueSize(uint32_t size) override; 69 bool IsBufferInQueue(const std::shared_ptr<AVBuffer>& buffer) override; 70 Status Clear() override; 71 Status ClearBufferIf(std::function<bool(const std::shared_ptr<AVBuffer>&)> pred) override; 72 73 virtual Status RequestBuffer(std::shared_ptr<AVBuffer>& buffer, 74 const AVBufferConfig& config, int32_t timeoutMs); 75 virtual Status RequestBufferWaitUs(std::shared_ptr<AVBuffer>& buffer, 76 const AVBufferConfig& config, int64_t timeoutUs); 77 virtual Status PushBuffer(uint64_t uniqueId, bool available); 78 virtual Status PushBuffer(const std::shared_ptr<AVBuffer>& buffer, bool available); 79 virtual Status ReturnBuffer(uint64_t uniqueId, bool available); 80 virtual Status ReturnBuffer(const std::shared_ptr<AVBuffer>& buffer, bool available); 81 82 virtual Status AttachBuffer(std::shared_ptr<AVBuffer>& buffer, bool isFilled); 83 virtual Status DetachBuffer(uint64_t uniqueId); 84 virtual Status DetachBuffer(const std::shared_ptr<AVBuffer>& buffer); 85 86 virtual Status AcquireBuffer(std::shared_ptr<AVBuffer>& buffer); 87 virtual Status ReleaseBuffer(const std::shared_ptr<AVBuffer>& buffer); 88 89 virtual Status SetBrokerListener(sptr<IBrokerListener>& listener); 90 virtual Status RemoveBrokerListener(sptr<IBrokerListener>& listener); 91 virtual Status SetProducerListener(sptr<IProducerListener>& listener); 92 virtual Status SetConsumerListener(sptr<IConsumerListener>& listener); 93 94 virtual uint32_t GetMemoryUsage() override; 95 96 Status SetQueueSizeAndAttachBuffer(uint32_t size, std::shared_ptr<AVBuffer>& buffer, bool isFilled) override; 97 98 uint32_t GetFilledBufferSize() override; 99 100 protected: 101 std::string name_; 102 103 std::mutex producerCreatorMutex_; 104 std::mutex consumerCreatorMutex_; 105 106 std::vector<sptr<IBrokerListener>> brokerListeners_; 107 sptr<IProducerListener> producerListener_; 108 sptr<IConsumerListener> consumerListener_; 109 110 std::mutex producerListenerMutex_; 111 std::mutex consumerListenerMutex_; 112 std::mutex brokerListenerMutex_; 113 114 std::mutex queueMutex_; 115 116 std::weak_ptr<AVBufferQueueProducerImpl> localProducer_; 117 std::weak_ptr<AVBufferQueueConsumerImpl> localConsumer_; 118 119 wptr<AVBufferQueueProducerImpl> producer_; 120 wptr<AVBufferQueueConsumerImpl> consumer_; 121 122 private: 123 void TotalMemoryCalculation(bool isAdd, int32_t capacity); 124 Status AttachAvailableBufferLocked(std::shared_ptr<AVBuffer>& buffer); 125 Status PushBufferOnFilled(uint64_t uniqueId, bool isFilled); 126 void SetQueueSizeBeforeAttachBufferLocked(uint32_t size); 127 uint32_t size_; 128 MemoryType memoryType_; 129 bool disableAlloc_; 130 131 std::map<uint64_t, AVBufferElement> cachedBufferMap_; 132 133 std::list<uint64_t> freeBufferList_; // 记录已分配的且处于空闲状态的buffer uniqueId,按bufferSize升序排列 134 std::list<uint64_t> dirtyBufferList_; 135 136 std::atomic<uint32_t> memoryUsage_ = 0; 137 138 std::condition_variable requestCondition; 139 140 Status CheckConfig(const AVBufferConfig& config); 141 142 bool wait_for(std::unique_lock<std::mutex>& lock, int64_t timeoutUs); 143 144 uint32_t GetCachedBufferCount() const; 145 Status RequestReuseBuffer(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 146 void InsertFreeBufferInOrder(uint64_t uniqueId); 147 Status CancelBuffer(uint64_t uniqueId); 148 Status DetachBuffer(uint64_t uniqueId, bool force); 149 Status ReleaseBuffer(uint64_t uniqueId); 150 Status PopFromFreeBufferList(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 151 Status PopFromDirtyBufferList(std::shared_ptr<AVBuffer>& buffer); 152 Status AllocBuffer(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 153 154 void DeleteBuffers(uint32_t count); 155 void DeleteCachedBufferById(uint64_t uniqueId_); 156 }; 157 158 } // namespace Media 159 } // namespace OHOS 160 161 #endif // HISTREAMER_FOUNDATION_AVBUFFER_QUEUE_IMPL_H 162