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(uint32_t queueId) = 0; 34 virtual Status OnSampleQueueBufferConsume(uint32_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 DEFAULT_SAMPLE_QUEUE_SIZE = 1; 47 static constexpr uint32_t MAX_SAMPLE_BUFFER_CAP = 10 * 1024 * 1024; 48 static constexpr uint32_t DEFAULT_VIDEO_SAMPLE_BUFFER_CAP = 1 * 1024 * 1024; 49 static constexpr uint32_t DEFAULT_SAMPLE_BUFFER_CAP = 4 * 1024; 50 static constexpr int64_t MIN_SWITCH_BITRATE_TIME_US = 3000000; 51 static constexpr size_t MAX_BITRATE_SWITCH_WAIT_NUMBER = 1; 52 struct Config { 53 uint32_t queueId_{0}; 54 std::string queueName_{""}; 55 uint32_t queueSize_{DEFAULT_SAMPLE_QUEUE_SIZE}; 56 uint32_t bufferCap_{DEFAULT_SAMPLE_BUFFER_CAP}; 57 bool isSupportBitrateSwitch_{false}; 58 bool isFlvLiveStream_{false}; 59 }; 60 SampleQueue() = default; 61 virtual ~SampleQueue() = default; 62 Status Init(const Config& config); 63 Status SetSampleQueueCallback(std::shared_ptr<SampleQueueCallback> sampleQueueCb); 64 65 sptr<AVBufferQueueProducer> GetBufferQueueProducer() const; 66 67 Status RequestBuffer(std::shared_ptr<AVBuffer>& sampleBuffer, const AVBufferConfig& config, int32_t timeoutMs); 68 Status PushBuffer(std::shared_ptr<AVBuffer>& sampleBuffer, bool available); 69 70 Status AcquireCopyToDstBuffer(std::shared_ptr<AVBuffer>& dstBuffer); 71 Status QuerySizeForNextAcquireBuffer(size_t& size); 72 73 Status Clear(); 74 75 Status ReadySwitchBitrate(uint32_t bitrate); 76 77 Status UpdateLastEndSamplePts(int64_t lastEndSamplePts); 78 79 Status ResponseForSwitchDone(int64_t startPtsOnSwitch); 80 81 void OnBufferAvailable(); 82 void OnBufferConsumer(); 83 uint64_t GetCacheDuration() const; 84 void UpdateQueueId(uint32_t queueId); 85 86 private: 87 Status AcquireBuffer(std::shared_ptr<AVBuffer>& sampleBuffer); 88 Status ReleaseBuffer(std::shared_ptr<AVBuffer>& sampleBuffer); 89 90 bool IsKeyFrame(std::shared_ptr<AVBuffer>& sampleBuffer) const; 91 bool IsEosFrame(std::shared_ptr<AVBuffer>& sampleBuffer) const; 92 Status AttachBuffer(); 93 bool IsSwitchBitrateOK(); 94 Status NotifySwitchBitrateOK(); 95 96 Status DiscardSampleAfter(int64_t startPts); 97 Status RollbackBuffer(std::shared_ptr<AVBuffer>& sampleBuffer); 98 bool IsKeyFrameAvailable(); 99 void CheckSwitchBitrateWaitList(); 100 101 Status CopyBuffer(std::shared_ptr<AVBuffer>& srcBuffer, std::shared_ptr<AVBuffer>& dstBuffer); 102 void CopyMeta(std::shared_ptr<AVBuffer>& srcBuffer, std::shared_ptr<AVBuffer>& dstBuffer); 103 Status CopyAVMemory(std::shared_ptr<AVBuffer>& srcBuffer, std::shared_ptr<AVBuffer>& dstBuffer); 104 105 std::string SetToString(std::set<int64_t> localSet); 106 std::string StringifyMeta(std::shared_ptr<Meta> &meta); 107 108 Status UpdateLastOutSamplePts(int64_t lastOutSamplePts); 109 110 Config config_{}; 111 std::weak_ptr<SampleQueueCallback> sampleQueueCb_; 112 113 std::shared_ptr<AVBufferQueue> sampleBufferQueue_; 114 sptr<AVBufferQueueProducer> sampleBufferQueueProducer_; 115 sptr<AVBufferQueueConsumer> sampleBufferQueueConsumer_; 116 117 int64_t lastEnterSamplePts_{Plugins::HST_TIME_NONE}; 118 int64_t lastOutSamplePts_{Plugins::HST_TIME_NONE}; 119 int64_t lastEndSamplePts_{Plugins::HST_TIME_NONE}; 120 int64_t startPtsToSwitch_{Plugins::HST_TIME_NONE}; 121 SelectBitrateStatus switchStatus_{SelectBitrateStatus::NORMAL}; 122 std::mutex statusMutex_; 123 124 std::mutex ptsMutex_; 125 std::set<int64_t> keyFramePtsSet_; 126 127 std::list<std::shared_ptr<AVBuffer>> rollbackBufferQueue_; 128 129 std::mutex waitListMutex_; 130 std::deque<uint32_t> switchBitrateWaitList_; 131 uint32_t nextSwitchBitrate_{0}; 132 }; 133 } // namespace Media 134 } // namespace OHOS 135 #endif // SAMPLE_QUEUE_H