• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 MEDIA_DEMUXER_H
17 #define MEDIA_DEMUXER_H
18 
19 #include <atomic>
20 #include <limits>
21 #include <string>
22 #include <shared_mutex>
23 #include <unordered_set>
24 
25 #include "avcodec_common.h"
26 #include "buffer/avbuffer.h"
27 #include "common/media_source.h"
28 #include "common/seek_callback.h"
29 #include "demuxer/type_finder.h"
30 #include "filter/filter.h"
31 #include "meta/media_types.h"
32 #include "osal/task/autolock.h"
33 #include "osal/task/task.h"
34 #include "plugin/plugin_base.h"
35 #include "plugin/plugin_info.h"
36 #include "plugin/plugin_time.h"
37 #include "plugin/demuxer_plugin.h"
38 
39 namespace OHOS {
40 namespace Media {
41 namespace {
42     constexpr uint32_t TRACK_ID_DUMMY = std::numeric_limits<uint32_t>::max();
43     constexpr int32_t DEFAULT_DECODE_FRAMERATE_UPPER_LIMIT = 120;
44 }
45 
46 using MediaSource = OHOS::Media::Plugins::MediaSource;
47 class BaseStreamDemuxer;
48 class DemuxerPluginManager;
49 class Source;
50 
51 class AVBufferQueueProducer;
52 
53 class MediaDemuxer : public std::enable_shared_from_this<MediaDemuxer>, public Plugins::Callback {
54 public:
55     explicit MediaDemuxer();
56     ~MediaDemuxer() override;
57 
58     Status SetDataSource(const std::shared_ptr<MediaSource> &source);
59     Status SetSubtitleSource(const std::shared_ptr<MediaSource> &source);
60     void SetBundleName(const std::string& bundleName);
61     Status SetOutputBufferQueue(int32_t trackId, const sptr<AVBufferQueueProducer>& producer);
62 
63     std::shared_ptr<Meta> GetGlobalMetaInfo() const;
64     std::vector<std::shared_ptr<Meta>> GetStreamMetaInfo() const;
65     std::shared_ptr<Meta> GetUserMeta();
66 
67     Status SeekTo(int64_t seekTime, Plugins::SeekMode mode, int64_t& realSeekTime);
68     Status Reset();
69     Status Start();
70     Status Stop();
71     Status Pause();
72     Status PauseDragging();
73     Status PauseAudioAlign();
74     Status Resume();
75     Status ResumeDragging();
76     Status ResumeAudioAlign();
77     Status Flush();
78     Status Preroll();
79     Status PausePreroll();
80 
81     Status StartTask(int32_t trackId);
82     Status SelectTrack(int32_t trackId);
83     Status UnselectTrack(int32_t trackId);
84     Status ReadSample(uint32_t trackId, std::shared_ptr<AVBuffer> sample);
85     Status GetBitRates(std::vector<uint32_t> &bitRates);
86     Status SelectBitRate(uint32_t bitRate);
87     Status GetDownloadInfo(DownloadInfo& downloadInfo);
88     Status GetPlaybackInfo(PlaybackInfo& playbackInfo);
89     Status GetMediaKeySystemInfo(std::multimap<std::string, std::vector<uint8_t>> &infos);
90     void SetDrmCallback(const std::shared_ptr<OHOS::MediaAVCodec::AVDemuxerCallback> &callback);
91     void OnEvent(const Plugins::PluginEvent &event) override;
92 
93     std::map<uint32_t, sptr<AVBufferQueueProducer>> GetBufferQueueProducerMap();
94     Status PauseTaskByTrackId(int32_t trackId);
95     bool IsRenderNextVideoFrameSupported();
96 
97     void SetEventReceiver(const std::shared_ptr<Pipeline::EventReceiver> &receiver);
98     bool GetDuration(int64_t& durationMs);
99     void SetPlayerId(const std::string &playerId);
100     void SetInterruptState(bool isInterruptNeeded);
101     void SetDumpInfo(bool isDump, uint64_t instanceId);
102 
103     Status OptimizeDecodeSlow(bool isDecodeOptimizationEnabled);
104     Status SetDecoderFramerateUpperLimit(int32_t decoderFramerateUpperLimit, uint32_t trackId);
105     Status SetSpeed(float speed);
106     Status SetFrameRate(double frameRate, uint32_t trackId);
107 
108     bool IsLocalDrmInfosExisted();
109     Status DisableMediaTrack(Plugins::MediaType mediaType);
110     void OnBufferAvailable(uint32_t trackId);
111     void SetSelectBitRateFlag(bool flag, uint32_t desBitRate) override;
112     bool CanAutoSelectBitRate() override;
113     void OnDumpInfo(int32_t fd);
114 
115     Status StartReferenceParser(int64_t startTimeMs, bool isForward = true);
116     Status GetFrameLayerInfo(std::shared_ptr<AVBuffer> videoSample, FrameLayerInfo &frameLayerInfo);
117     Status GetFrameLayerInfo(uint32_t frameId, FrameLayerInfo &frameLayerInfo);
118     Status GetGopLayerInfo(uint32_t gopId, GopLayerInfo &gopLayerInfo);
119     bool IsVideoEos();
120     bool HasEosTrack();
121     Status GetIFramePos(std::vector<uint32_t> &IFramePos);
122     Status Dts2FrameId(int64_t dts, uint32_t &frameId, bool offset = true);
123     void RegisterVideoStreamReadyCallback(const std::shared_ptr<VideoStreamReadyCallback> &callback);
124     void DeregisterVideoStreamReadyCallback();
125 
126     Status GetIndexByRelativePresentationTimeUs(const uint32_t trackIndex,
127         const uint64_t relativePresentationTimeUs, uint32_t &index);
128     Status GetRelativePresentationTimeUsByIndex(const uint32_t trackIndex,
129         const uint32_t index, uint64_t &relativePresentationTimeUs);
130 
131     Status ResumeDemuxerReadLoop();
132     Status PauseDemuxerReadLoop();
133     void SetCacheLimit(uint32_t limitSize);
134     void SetEnableOnlineFdCache(bool isEnableFdCache);
135     void WaitForBufferingEnd();
136 private:
137     class AVBufferQueueProducerListener;
138     class TrackWrapper;
139 
140     struct MediaMetaData {
141         std::vector<std::shared_ptr<Meta>> trackMetas;
142         std::shared_ptr<Meta> globalMeta;
143     };
144 
145     struct MaintainBaseInfo {
146         int64_t segmentOffset = -1;
147         int64_t basePts = -1;
148         int64_t lastPts = 0;
149     };
150     bool isHttpSource_ = false;
151     std::string videoMime_{};
152 
153     void InitMediaMetaData(const Plugins::MediaInfo& mediaInfo);
154     void InitDefaultTrack(const Plugins::MediaInfo& mediaInfo, uint32_t& videoTrackId,
155         uint32_t& audioTrackId, uint32_t& subtitleTrackId, std::string& videoMime);
156     std::shared_ptr<Meta> GetTrackMeta(uint32_t trackId);
157     Status AddDemuxerCopyTask(uint32_t trackId, TaskType type);
158 
159     Status StopAllTask();
160     Status PauseAllTask();
161     Status ResumeAllTask();
162     void AccelerateTrackTask(uint32_t trackId);
163     void SetTrackNotifyFlag(uint32_t trackId, bool isNotifyNeeded);
164     void ResetInner();
165 
166     bool GetDrmInfosUpdated(const std::multimap<std::string, std::vector<uint8_t>> &newInfos,
167         std::multimap<std::string, std::vector<uint8_t>> &result);
168     Status ProcessDrmInfos();
169     void HandleSourceDrmInfoEvent(const std::multimap<std::string, std::vector<uint8_t>> &info);
170     Status ReportDrmInfos(const std::multimap<std::string, std::vector<uint8_t>> &info);
171 
172     bool HasVideo();
173     void DumpBufferToFile(uint32_t trackId, std::shared_ptr<AVBuffer> buffer);
174     bool IsBufferDroppable(std::shared_ptr<AVBuffer> sample, uint32_t trackId);
175     void CheckDropAudioFrame(std::shared_ptr<AVBuffer> sample, uint32_t trackId);
176     bool IsTrackDisabled(Plugins::MediaType mediaType);
177     bool CheckTrackEnabledById(uint32_t trackId);
178     bool HandleDashChangeStream(uint32_t trackId);
179 
180     Status SeekToTimePre();
181     Status SeekToTimeAfter();
182     bool SelectBitRateChangeStream(uint32_t trackId);
183     bool SelectTrackChangeStream(uint32_t trackId);
184     bool HandleSelectTrackChangeStream(int32_t trackId, int32_t newStreamID, int32_t& newTrackId);
185     std::shared_ptr<Plugins::DemuxerPlugin> GetCurFFmpegPlugin();
186 
187     Plugins::Seekable seekable_;
188     Plugins::Seekable subSeekable_;
189     std::string uri_;
190     std::string SubtitleUri_;
191     uint64_t mediaDataSize_ = 0;
192     uint64_t subMediaDataSize_;
193 
194     std::shared_ptr<MediaSource> mediaSource_;
195     std::shared_ptr<Source> source_;
196     std::shared_ptr<Source> subtitleSource_;
197     MediaMetaData mediaMetaData_;
198 
199     int64_t ReadLoop(uint32_t trackId);
200     Status CopyFrameToUserQueue(uint32_t trackId);
201     bool GetBufferFromUserQueue(uint32_t queueIndex, uint32_t size = 0);
202     Status InnerReadSample(uint32_t trackId, std::shared_ptr<AVBuffer>);
203     Status InnerSelectTrack(int32_t trackId);
204     Status HandleReadSample(uint32_t trackId);
205     int64_t ParserRefInfo();
206     void TryRecvParserTask();
207 
208     Status HandleSelectTrack(int32_t trackId);
209     Status HandleDashSelectTrack(int32_t trackId);
210     Status DoSelectTrack(int32_t trackId, int32_t curTrackId);
211     void HandleStopPlugin(int32_t trackId);
212     void HandleStartPlugin(int32_t trackId);
213     bool DashCheckChangeStream(uint32_t trackId);
214 
215     bool IsSubtitleMime(const std::string& mime);
216     Status InnerPrepare();
217     Status HandleAutoMaintainPts(uint32_t trackId, std::shared_ptr<AVBuffer> sample);
218     Status InitPtsInfo();
219 
220     Mutex mapMutex_{};
221     std::map<uint32_t, std::shared_ptr<TrackWrapper>> trackMap_;
222     std::map<uint32_t, sptr<AVBufferQueueProducer>> bufferQueueMap_;
223     std::map<uint32_t, std::shared_ptr<AVBuffer>> bufferMap_;
224     std::map<uint32_t, bool> eosMap_;
225     std::map<uint32_t, uint32_t> requestBufferErrorCountMap_;
226     std::atomic<bool> isThreadExit_ = true;
227     bool useBufferQueue_ = false;
228     bool isAccurateSeekForHLS_ = false;
229     int64_t videoStartTime_{0};
230 
231     std::shared_mutex drmMutex{};
232     std::multimap<std::string, std::vector<uint8_t>> localDrmInfos_;
233     std::shared_ptr<OHOS::MediaAVCodec::AVDemuxerCallback> drmCallback_;
234 
235     std::map<uint32_t, std::unique_ptr<Task>> taskMap_;
236     std::shared_ptr<Pipeline::EventReceiver> eventReceiver_;
237     int64_t lastSeekTime_{Plugins::HST_TIME_NONE};
238     bool isSeeked_{false};
239     uint32_t videoTrackId_{TRACK_ID_DUMMY};
240 
241     uint32_t audioTrackId_{TRACK_ID_DUMMY};
242     uint32_t subtitleTrackId_{TRACK_ID_DUMMY};
243     bool firstAudio_{true};
244 
245     std::atomic<bool> isStopped_ = true;
246     std::atomic<bool> isPaused_ = false;
247     std::shared_ptr<BaseStreamDemuxer> streamDemuxer_;
248     std::shared_ptr<BaseStreamDemuxer> subStreamDemuxer_;
249     std::string bundleName_ {};
250 
251     std::string playerId_;
252     int64_t duration_ {0};
253 
254     std::atomic<bool> isDecodeOptimizationEnabled_ {false};
255     std::atomic<float> speed_ {1.0f};
256     std::atomic<double> framerate_ {0.0};
257     std::atomic<int32_t> decoderFramerateUpperLimit_ {DEFAULT_DECODE_FRAMERATE_UPPER_LIMIT};
258     std::unordered_set<Plugins::MediaType> disabledMediaTracks_ {};
259     std::string subtitlePluginName_;
260     std::shared_ptr<Plugins::DemuxerPlugin> subtitlePlugin_;
261     std::shared_ptr<MediaSource> subtitleMediaSource_;
262     bool isDump_ = false;
263     std::shared_ptr<DemuxerPluginManager> demuxerPluginManager_;
264     std::atomic<bool> isSelectBitRate_ = false;
265     uint32_t targetBitRate_ = 0;
266     std::string dumpPrefix_ = "";
267 
268     std::unique_ptr<Task> parserRefInfoTask_;
269     bool isFirstParser_ = true;
270     bool isParserTaskEnd_ = false;
271     std::atomic<bool> isOnEventNoMemory_ = false;
272     std::atomic<bool> isSeekError_ = false;
273     std::shared_ptr<VideoStreamReadyCallback> VideoStreamReadyCallback_ = nullptr;
274     std::mutex draggingMutex_ {};
275 
276     std::atomic<bool> isDemuxerLoopExecuting_ {false};
277     std::atomic<bool> isFirstFrameAfterSeek_ {false};
278 
279     std::mutex prerollMutex_ {};
280     std::atomic<bool> inPreroll_ = false;
281 
282     uint32_t selectTrackTrackID_ { TRACK_ID_DUMMY };
283     std::atomic<bool> isSelectTrack_ = false;
284     std::atomic<bool> shouldCheckAudioFramePts_ = false;
285     int64_t lastAudioPts_ = 0;
286     std::atomic<bool> shouldCheckSubtitleFramePts_ = false;
287     int64_t lastSubtitlePts_ = 0;
288     std::atomic<bool> isInterruptNeeded_ {false};
289     bool isAutoMaintainPts_ = false;
290     std::map<uint32_t, std::shared_ptr<MaintainBaseInfo>> maintainBaseInfos_;
291 };
292 } // namespace Media
293 } // namespace OHOS
294 #endif // MEDIA_DEMUXER_H
295