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> ¶meter) override; 56 void GetParameter(std::shared_ptr<Meta> ¶meter) 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