1 /* 2 * Copyright (c) 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 #ifndef SAMPLE_QUEUE_H 16 #define SAMPLE_QUEUE_H 17 18 #include <set> 19 #include <deque> 20 #include <memory> 21 #include "buffer/avbuffer.h" 22 #include "buffer/avbuffer_queue.h" 23 #include "buffer/avbuffer_queue_define.h" 24 #include "plugin/plugin_time.h" 25 26 27 namespace OHOS { 28 namespace Media { 29 class SampleQueueCallback { 30 public: 31 virtual ~SampleQueueCallback() = default; 32 virtual Status OnSelectBitrateOk(int64_t startPts, uint32_t bitRate) = 0; 33 virtual Status OnSampleQueueBufferAvailable(int32_t queueId) = 0; 34 virtual Status OnSampleQueueBufferConsume(int32_t queueId) = 0; 35 }; 36 37 enum class SelectBitrateStatus : uint32_t { 38 NORMAL = 0, // has no selectbitrate commond 39 READY_SWITCH, // with selectbitrate commond but not satisfy switch condition 40 SWITCHING, // reach switch condition wait ResponseForSwitchDone then to convert NORMAL 41 }; 42 43 class SampleQueue : public std::enable_shared_from_this<SampleQueue> { 44 public: 45 static constexpr uint32_t MAX_SAMPLE_QUEUE_SIZE = 1; 46 static constexpr uint32_t MAX_SAMPLE_QUEUE_SIZE_ON_MUTE = 150; 47 static constexpr uint32_t DEFAULT_SAMPLE_QUEUE_SIZE = 1; 48 static constexpr uint32_t MAX_SAMPLE_BUFFER_CAP = 10 * 1024 * 1024; 49 static constexpr uint32_t DEFAULT_VIDEO_SAMPLE_BUFFER_CAP = 256 * 1024; 50 static constexpr uint32_t DEFAULT_SAMPLE_BUFFER_CAP = 4 * 1024; 51 static constexpr int64_t MIN_SWITCH_BITRATE_TIME_US = 3000000; 52 static constexpr size_t MAX_BITRATE_SWITCH_WAIT_NUMBER = 1; 53 struct Config { 54 int32_t queueId_{0}; 55 std::string queueName_{""}; 56 uint32_t queueSize_{DEFAULT_SAMPLE_QUEUE_SIZE}; 57 uint32_t bufferCap_{DEFAULT_SAMPLE_BUFFER_CAP}; 58 bool isSupportBitrateSwitch_{false}; 59 bool isFlvLiveStream_{false}; 60 bool isNeedSetLarge_{false}; 61 }; 62 SampleQueue() = default; 63 virtual ~SampleQueue() = default; 64 Status Init(const Config& config); 65 Status SetSampleQueueCallback(std::shared_ptr<SampleQueueCallback> sampleQueueCb); 66 67 sptr<AVBufferQueueProducer> GetBufferQueueProducer() const; 68 69 Status RequestBuffer(std::shared_ptr<AVBuffer>& sampleBuffer, const AVBufferConfig& config, int32_t timeoutMs); 70 Status PushBuffer(std::shared_ptr<AVBuffer>& sampleBuffer, bool available); 71 72 Status AcquireCopyToDstBuffer(std::shared_ptr<AVBuffer>& dstBuffer); 73 Status QuerySizeForNextAcquireBuffer(size_t& size); 74 75 Status Clear(); 76 77 Status ReadySwitchBitrate(uint32_t bitrate); 78 79 Status UpdateLastEndSamplePts(int64_t lastEndSamplePts); 80 81 Status ResponseForSwitchDone(int64_t startPtsOnSwitch); 82 83 void OnBufferAvailable(); 84 void OnBufferConsumer(); 85 uint64_t GetCacheDuration() const; 86 void UpdateQueueId(int32_t queueId); 87 uint32_t GetMemoryUsage(); 88 89 Status AcquireBuffer(std::shared_ptr<AVBuffer>& sampleBuffer); 90 Status ReleaseBuffer(std::shared_ptr<AVBuffer>& sampleBuffer); 91 Status SetLargerQueueSize(uint32_t size); 92 bool IsEmpty(); 93 Status AddQueueSize(uint32_t size); 94 95 private: 96 97 bool IsKeyFrame(std::shared_ptr<AVBuffer>& sampleBuffer) const; 98 bool IsEosFrame(std::shared_ptr<AVBuffer>& sampleBuffer) const; 99 Status AttachBuffer(); 100 bool IsSwitchBitrateOK(); 101 Status NotifySwitchBitrateOK(); 102 103 Status DiscardSampleAfter(int64_t startPts); 104 Status RollbackBuffer(std::shared_ptr<AVBuffer>& sampleBuffer); 105 bool IsKeyFrameAvailable(); 106 void CheckSwitchBitrateWaitList(); 107 108 Status CopyBuffer(std::shared_ptr<AVBuffer>& srcBuffer, std::shared_ptr<AVBuffer>& dstBuffer); 109 void CopyMeta(std::shared_ptr<AVBuffer>& srcBuffer, std::shared_ptr<AVBuffer>& dstBuffer); 110 Status CopyAVMemory(std::shared_ptr<AVBuffer>& srcBuffer, std::shared_ptr<AVBuffer>& dstBuffer); 111 112 std::string SetToString(std::set<int64_t> localSet); 113 std::string StringifyMeta(std::shared_ptr<Meta> &meta); 114 115 Status UpdateLastOutSamplePts(int64_t lastOutSamplePts); 116 117 Config config_{}; 118 std::weak_ptr<SampleQueueCallback> sampleQueueCb_; 119 120 std::shared_ptr<AVBufferQueue> sampleBufferQueue_; 121 sptr<AVBufferQueueProducer> sampleBufferQueueProducer_; 122 sptr<AVBufferQueueConsumer> sampleBufferQueueConsumer_; 123 124 int64_t lastEnterSamplePts_{Plugins::HST_TIME_NONE}; 125 int64_t lastOutSamplePts_{Plugins::HST_TIME_NONE}; 126 int64_t lastEndSamplePts_{Plugins::HST_TIME_NONE}; 127 int64_t startPtsToSwitch_{Plugins::HST_TIME_NONE}; 128 SelectBitrateStatus switchStatus_{SelectBitrateStatus::NORMAL}; 129 std::mutex statusMutex_; 130 131 std::mutex ptsMutex_; 132 std::set<int64_t> keyFramePtsSet_; 133 134 std::list<std::shared_ptr<AVBuffer>> rollbackBufferQueue_; 135 136 std::mutex waitListMutex_; 137 std::deque<uint32_t> switchBitrateWaitList_; 138 uint32_t nextSwitchBitrate_{0}; 139 }; 140 } // namespace Media 141 } // namespace OHOS 142 #endif // SAMPLE_QUEUE_H