• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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