1 /*
2  * Copyright (c) 2023-2023 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_PIPELINE_DEMUXER_FILTER_H
17 #define MEDIA_PIPELINE_DEMUXER_FILTER_H
18 
19 #include <string>
20 #include <unordered_set>
21 #include "common/seek_callback.h"
22 #include "filter/filter.h"
23 #include "media_demuxer.h"
24 #include "meta/meta.h"
25 #include "meta/media_types.h"
26 #include "osal/task/mutex.h"
27 
28 namespace OHOS {
29 namespace Media {
30 namespace Pipeline {
31 class DemuxerFilter : public Filter, public std::enable_shared_from_this<DemuxerFilter> {
32 public:
33     explicit DemuxerFilter(std::string name, FilterType type);
34     ~DemuxerFilter() override;
35 
36     void Init(const std::shared_ptr<EventReceiver> &receiver, const std::shared_ptr<FilterCallback> &callback) override;
37     Status DoPrepare() override;
38     Status DoStart() override;
39     Status DoStop() override;
40     Status DoPause() override;
41     Status DoPauseDragging() override;
42     Status DoPauseAudioAlign() override;
43     Status DoResume() override;
44     Status DoResumeDragging() override;
45     Status DoResumeAudioAlign() override;
46     Status DoFlush() override;
47     Status DoPreroll() override;
48     Status DoWaitPrerollDone(bool render) override;
49     Status Reset();
50 
51     Status PauseForSeek();
52     Status ResumeForSeek();
53     Status PrepareBeforeStart();
54 
55     void SetParameter(const std::shared_ptr<Meta> &parameter) override;
56     void GetParameter(std::shared_ptr<Meta> &parameter) 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 SeekTo(int64_t seekTime, Plugins::SeekMode mode, int64_t& realSeekTime);
62 
63     bool IsRefParserSupported();
64     Status StartReferenceParser(int64_t startTimeMs, bool isForward = true);
65     Status GetFrameLayerInfo(std::shared_ptr<AVBuffer> videoSample, FrameLayerInfo &frameLayerInfo);
66     Status GetFrameLayerInfo(uint32_t frameId, FrameLayerInfo &frameLayerInfo);
67     Status GetGopLayerInfo(uint32_t gopId, GopLayerInfo &gopLayerInfo);
68 
69     Status GetIFramePos(std::vector<uint32_t> &IFramePos);
70     Status Dts2FrameId(int64_t dts, uint32_t &frameId, bool offset = true);
71 
72     Status StartTask(int32_t trackId);
73     Status SelectTrack(int32_t trackId);
74 
75     std::vector<std::shared_ptr<Meta>> GetStreamMetaInfo() const;
76     std::shared_ptr<Meta> GetGlobalMetaInfo() const;
77 
78     Status LinkNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType) override;
79     Status UpdateNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType) override;
80     Status UnLinkNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType) override;
81     Status GetBitRates(std::vector<uint32_t>& bitRates);
82     Status SelectBitRate(uint32_t bitRate);
83     Status GetDownloadInfo(DownloadInfo& downloadInfo);
84     Status GetPlaybackInfo(PlaybackInfo& playbackInfo);
85     FilterType GetFilterType();
86 
87     void OnLinkedResult(const sptr<AVBufferQueueProducer> &outputBufferQueue, std::shared_ptr<Meta> &meta);
88     void OnUpdatedResult(std::shared_ptr<Meta> &meta);
89     void OnUnlinkedResult(std::shared_ptr<Meta> &meta);
90 
91     std::map<uint32_t, sptr<AVBufferQueueProducer>> GetBufferQueueProducerMap();
92     Status PauseTaskByTrackId(int32_t trackId);
93     bool IsRenderNextVideoFrameSupported();
94 
95     bool IsDrmProtected();
96     // drm callback
97     void OnDrmInfoUpdated(const std::multimap<std::string, std::vector<uint8_t>> &drmInfo);
98     bool GetDuration(int64_t& durationMs);
99     void SetInterruptState(bool isInterruptNeeded);
100     Status OptimizeDecodeSlow(bool isDecodeOptimizationEnabled);
101     Status SetSpeed(float speed);
102     Status DisableMediaTrack(Plugins::MediaType mediaType);
103     void SetDumpFlag(bool isdump);
104     void OnDumpInfo(int32_t fd);
105     void SetCallerInfo(uint64_t instanceId, const std::string& appName);
106     bool IsVideoEos();
107     bool HasEosTrack();
108     void RegisterVideoStreamReadyCallback(const std::shared_ptr<VideoStreamReadyCallback> &callback);
109     void DeregisterVideoStreamReadyCallback();
110     Status ResumeDemuxerReadLoop();
111     Status PauseDemuxerReadLoop();
112     void WaitForBufferingEnd();
113     int32_t GetCurrentVideoTrackId();
114     void SetIsNotPrepareBeforeStart(bool isNotPrepareBeforeStart);
115     void SetIsEnableReselectVideoTrack(bool isEnable);
116 protected:
117     Status OnLinked(StreamType inType, const std::shared_ptr<Meta> &meta,
118         const std::shared_ptr<FilterLinkCallback> &callback) override;
119 
120     Status OnUpdated(StreamType inType, const std::shared_ptr<Meta> &meta,
121         const std::shared_ptr<FilterLinkCallback> &callback) override;
122 
123     Status OnUnLinked(StreamType inType, const std::shared_ptr<FilterLinkCallback>& callback) override;
124 
125 private:
126     struct MediaMetaData {
127         std::vector<std::shared_ptr<Meta>> trackMetas;
128         std::shared_ptr<Meta> globalMeta;
129     };
130 
131     bool FindTrackId(StreamType outType, int32_t &trackId);
132     bool FindStreamType(StreamType &streamType, Plugins::MediaType mediaType, std::string mime, size_t index);
133     bool ShouldTrackSkipped(Plugins::MediaType mediaType, std::string mime, size_t index);
134     void UpdateTrackIdMap(StreamType streamType, int32_t index);
135     void FaultDemuxerEventInfoWrite(StreamType& streamType);
136     bool IsVideoMime(const std::string& mime);
137     bool IsAudioMime(const std::string& mime);
138     Status HandleTrackInfos(const std::vector<std::shared_ptr<Meta>> &trackInfos, int32_t &successNodeCount);
139     std::string CollectVideoAndAudioMime();
140     std::string uri_;
141 
142     std::atomic<bool> isLoopStarted{false};
143 
144     std::shared_ptr<Filter> nextFilter_;
145     MediaMetaData mediaMetaData_;
146     std::shared_ptr<MediaDemuxer> demuxer_;
147     std::shared_ptr<MediaSource> mediaSource_;
148     std::shared_ptr<FilterLinkCallback> onLinkedResultCallback_;
149 
150     std::map<StreamType, std::vector<int32_t>> track_id_map_;
151     Mutex mapMutex_ {};
152     std::unordered_set<Plugins::MediaType> disabledMediaTracks_ {};
153 
154     bool isDump_ = false;
155     std::string bundleName_;
156     uint64_t instanceId_ = 0;
157     std::string videoMime_;
158     std::string audioMime_;
159     bool isNotPrepareBeforeStart_ {true};
160     bool isEnableReselectVideoTrack_ {false};
161 };
162 } // namespace Pipeline
163 } // namespace Media
164 } // namespace OHOS
165 #endif // MEDIA_PIPELINE_DEMUXER_FILTER_H
166