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 RemoveBrokerListener(sptr<IBrokerListener>& listener); 87 virtual Status SetProducerListener(sptr<IProducerListener>& listener); 88 virtual Status SetConsumerListener(sptr<IConsumerListener>& listener); 89 90 Status SetQueueSizeAndAttachBuffer(uint32_t size, std::shared_ptr<AVBuffer>& buffer, bool isFilled) override; 91 protected: 92 std::string name_; 93 94 std::mutex producerCreatorMutex_; 95 std::mutex consumerCreatorMutex_; 96 97 std::vector<sptr<IBrokerListener>> brokerListeners_; 98 sptr<IProducerListener> producerListener_; 99 sptr<IConsumerListener> consumerListener_; 100 101 std::mutex producerListenerMutex_; 102 std::mutex consumerListenerMutex_; 103 std::mutex brokerListenerMutex_; 104 105 std::mutex queueMutex_; 106 107 std::weak_ptr<AVBufferQueueProducerImpl> localProducer_; 108 std::weak_ptr<AVBufferQueueConsumerImpl> localConsumer_; 109 110 wptr<AVBufferQueueProducerImpl> producer_; 111 wptr<AVBufferQueueConsumerImpl> consumer_; 112 113 private: 114 Status AttachAvailableBufferLocked(std::shared_ptr<AVBuffer>& buffer); 115 Status PushBufferOnFilled(uint64_t uniqueId, bool isFilled); 116 void SetQueueSizeBeforeAttachBufferLocked(uint32_t size); 117 uint32_t size_; 118 MemoryType memoryType_; 119 bool disableAlloc_; 120 121 std::map<uint64_t, AVBufferElement> cachedBufferMap_; 122 123 std::list<uint64_t> freeBufferList_; // 记录已分配的且处于空闲状态的buffer uniqueId,按bufferSize升序排列 124 std::list<uint64_t> dirtyBufferList_; 125 126 std::condition_variable requestCondition; 127 128 Status CheckConfig(const AVBufferConfig& config); 129 130 bool wait_for(std::unique_lock<std::mutex>& lock, int32_t timeoutMs); 131 132 uint32_t GetCachedBufferCount() const; 133 Status RequestReuseBuffer(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 134 void InsertFreeBufferInOrder(uint64_t uniqueId); 135 Status CancelBuffer(uint64_t uniqueId); 136 Status DetachBuffer(uint64_t uniqueId, bool force); 137 Status ReleaseBuffer(uint64_t uniqueId); 138 Status PopFromFreeBufferList(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 139 Status PopFromDirtyBufferList(std::shared_ptr<AVBuffer>& buffer); 140 Status AllocBuffer(std::shared_ptr<AVBuffer>& buffer, const AVBufferConfig& config); 141 142 void DeleteBuffers(uint32_t count); 143 void DeleteCachedBufferById(uint64_t uniqueId_); 144 }; 145 146 } // namespace Media 147 } // namespace OHOS 148 149 #endif // HISTREAMER_FOUNDATION_AVBUFFER_QUEUE_IMPL_H 150