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