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 #define MEDIA_PIPELINE
17 #define HST_LOG_TAG "DemuxerFilter"
18 
19 #include "avcodec_common.h"
20 #include "avcodec_trace.h"
21 #include "filter/filter_factory.h"
22 #include "common/log.h"
23 #include "osal/task/autolock.h"
24 #include "common/media_core.h"
25 #include "demuxer_filter.h"
26 #include "media_types.h"
27 #include "avcodec_sysevent.h"
28 
29 namespace {
30 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_SYSTEM_PLAYER, "DemuxerFilter" };
31 }
32 
33 namespace OHOS {
34 namespace Media {
35 namespace Pipeline {
36 using namespace MediaAVCodec;
37 using MediaType = OHOS::Media::Plugins::MediaType;
38 namespace {
39     const std::string MIME_IMAGE = "image";
40     const uint32_t DEFAULT_CACHE_LIMIT = 50 * 1024 * 1024; // 50M
41     constexpr int32_t INVALID_TRACK_ID = -1;
42 }
43 static AutoRegisterFilter<DemuxerFilter> g_registerAudioCaptureFilter(
44     "builtin.player.demuxer", FilterType::FILTERTYPE_DEMUXER,
__anon45916c530302(const std::string& name, const FilterType type) 45     [](const std::string& name, const FilterType type) {
46         return std::make_shared<DemuxerFilter>(name, FilterType::FILTERTYPE_DEMUXER);
47     }
48 );
49 
50 class DemuxerFilterLinkCallback : public FilterLinkCallback {
51 public:
DemuxerFilterLinkCallback(std::shared_ptr<DemuxerFilter> demuxerFilter)52     explicit DemuxerFilterLinkCallback(std::shared_ptr<DemuxerFilter> demuxerFilter)
53         : demuxerFilter_(demuxerFilter) {}
54 
OnLinkedResult(const sptr<AVBufferQueueProducer> & queue,std::shared_ptr<Meta> & meta)55     void OnLinkedResult(const sptr<AVBufferQueueProducer> &queue, std::shared_ptr<Meta> &meta) override
56     {
57         auto demuxerFilter = demuxerFilter_.lock();
58         FALSE_RETURN(demuxerFilter != nullptr);
59         demuxerFilter->OnLinkedResult(queue, meta);
60     }
61 
OnUnlinkedResult(std::shared_ptr<Meta> & meta)62     void OnUnlinkedResult(std::shared_ptr<Meta> &meta) override
63     {
64         auto demuxerFilter = demuxerFilter_.lock();
65         FALSE_RETURN(demuxerFilter != nullptr);
66         demuxerFilter->OnUnlinkedResult(meta);
67     }
68 
OnUpdatedResult(std::shared_ptr<Meta> & meta)69     void OnUpdatedResult(std::shared_ptr<Meta> &meta) override
70     {
71         auto demuxerFilter = demuxerFilter_.lock();
72         FALSE_RETURN(demuxerFilter != nullptr);
73         demuxerFilter->OnUpdatedResult(meta);
74     }
75 private:
76     std::weak_ptr<DemuxerFilter> demuxerFilter_;
77 };
78 
79 class DemuxerFilterDrmCallback : public OHOS::MediaAVCodec::AVDemuxerCallback {
80 public:
DemuxerFilterDrmCallback(std::shared_ptr<DemuxerFilter> demuxerFilter)81     explicit DemuxerFilterDrmCallback(std::shared_ptr<DemuxerFilter> demuxerFilter) : demuxerFilter_(demuxerFilter)
82     {
83     }
84 
~DemuxerFilterDrmCallback()85     ~DemuxerFilterDrmCallback()
86     {
87         MEDIA_LOG_I("~DemuxerFilterDrmCallback");
88     }
89 
OnDrmInfoChanged(const std::multimap<std::string,std::vector<uint8_t>> & drmInfo)90     void OnDrmInfoChanged(const std::multimap<std::string, std::vector<uint8_t>> &drmInfo) override
91     {
92         MEDIA_LOG_I("DemuxerFilterDrmCallback OnDrmInfoChanged");
93         std::shared_ptr<DemuxerFilter> callback = demuxerFilter_.lock();
94         if (callback == nullptr) {
95             MEDIA_LOG_E("OnDrmInfoChanged demuxerFilter callback is nullptr");
96             return;
97         }
98         callback->OnDrmInfoUpdated(drmInfo);
99     }
100 
101 private:
102     std::weak_ptr<DemuxerFilter> demuxerFilter_;
103 };
104 
DemuxerFilter(std::string name,FilterType type)105 DemuxerFilter::DemuxerFilter(std::string name, FilterType type) : Filter(name, type)
106 {
107     demuxer_ = std::make_shared<MediaDemuxer>();
108     AutoLock lock(mapMutex_);
109     track_id_map_.clear();
110 }
111 
~DemuxerFilter()112 DemuxerFilter::~DemuxerFilter()
113 {
114     MEDIA_LOG_I("~DemuxerFilter enter");
115 }
116 
Init(const std::shared_ptr<EventReceiver> & receiver,const std::shared_ptr<FilterCallback> & callback)117 void DemuxerFilter::Init(const std::shared_ptr<EventReceiver> &receiver,
118     const std::shared_ptr<FilterCallback> &callback)
119 {
120     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Init");
121     MEDIA_LOG_I("DemuxerFilter Init");
122     this->receiver_ = receiver;
123     this->callback_ = callback;
124     MEDIA_LOG_D("DemuxerFilter Init for drm callback");
125 
126     std::shared_ptr<OHOS::MediaAVCodec::AVDemuxerCallback> drmCallback =
127         std::make_shared<DemuxerFilterDrmCallback>(shared_from_this());
128     demuxer_->SetDrmCallback(drmCallback);
129     demuxer_->SetEventReceiver(receiver);
130     demuxer_->SetPlayerId(groupId_);
131 }
132 
SetDataSource(const std::shared_ptr<MediaSource> source)133 Status DemuxerFilter::SetDataSource(const std::shared_ptr<MediaSource> source)
134 {
135     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::SetDataSource");
136     MEDIA_LOG_D("SetDataSource entered.");
137     if (source == nullptr) {
138         MEDIA_LOG_E("Invalid source");
139         return Status::ERROR_INVALID_PARAMETER;
140     }
141     mediaSource_ = source;
142     Status ret = demuxer_->SetDataSource(mediaSource_);
143     demuxer_->SetCacheLimit(DEFAULT_CACHE_LIMIT);
144     return ret;
145 }
146 
SetSubtitleSource(const std::shared_ptr<MediaSource> source)147 Status DemuxerFilter::SetSubtitleSource(const std::shared_ptr<MediaSource> source)
148 {
149     return demuxer_->SetSubtitleSource(source);
150 }
151 
SetInterruptState(bool isInterruptNeeded)152 void DemuxerFilter::SetInterruptState(bool isInterruptNeeded)
153 {
154     demuxer_->SetInterruptState(isInterruptNeeded);
155 }
156 
SetBundleName(const std::string & bundleName)157 void DemuxerFilter::SetBundleName(const std::string& bundleName)
158 {
159     if (demuxer_ != nullptr) {
160         MEDIA_LOG_D("SetBundleName bundleName: " PUBLIC_LOG_S, bundleName.c_str());
161         demuxer_->SetBundleName(bundleName);
162     }
163 }
164 
SetCallerInfo(uint64_t instanceId,const std::string & appName)165 void DemuxerFilter::SetCallerInfo(uint64_t instanceId, const std::string& appName)
166 {
167     instanceId_ = instanceId;
168     bundleName_ = appName;
169 }
170 
RegisterVideoStreamReadyCallback(const std::shared_ptr<VideoStreamReadyCallback> & callback)171 void DemuxerFilter::RegisterVideoStreamReadyCallback(const std::shared_ptr<VideoStreamReadyCallback> &callback)
172 {
173     MEDIA_LOG_I("RegisterVideoStreamReadyCallback step into");
174     if (callback != nullptr) {
175         demuxer_->RegisterVideoStreamReadyCallback(callback);
176     }
177 }
178 
DeregisterVideoStreamReadyCallback()179 void DemuxerFilter::DeregisterVideoStreamReadyCallback()
180 {
181     MEDIA_LOG_I("DeregisterVideoStreamReadyCallback step into");
182     demuxer_->DeregisterVideoStreamReadyCallback();
183 }
184 
DoPrepare()185 Status DemuxerFilter::DoPrepare()
186 {
187     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Prepare");
188     FALSE_RETURN_V_MSG_E(mediaSource_ != nullptr, Status::ERROR_INVALID_PARAMETER, "No valid media source");
189     std::vector<std::shared_ptr<Meta>> trackInfos = demuxer_->GetStreamMetaInfo();
190     MEDIA_LOG_I("trackCount: %{public}zu", trackInfos.size());
191     if (trackInfos.size() == 0) {
192         MEDIA_LOG_E("Doprepare: trackCount is invalid.");
193         receiver_->OnEvent({"demuxer_filter", EventType::EVENT_ERROR, MSERR_DEMUXER_FAILED});
194         return Status::ERROR_INVALID_PARAMETER;
195     }
196     int32_t successNodeCount = 0;
197     Status ret = HandleTrackInfos(trackInfos, successNodeCount);
198     if (ret != Status::OK) {
199         return ret;
200     }
201     if (successNodeCount == 0) {
202         receiver_->OnEvent({"demuxer_filter", EventType::EVENT_ERROR, MSERR_UNSUPPORT_CONTAINER_TYPE});
203         return Status::ERROR_UNSUPPORTED_FORMAT;
204     }
205     return Status::OK;
206 }
207 
HandleTrackInfos(const std::vector<std::shared_ptr<Meta>> & trackInfos,int32_t & successNodeCount)208 Status DemuxerFilter::HandleTrackInfos(const std::vector<std::shared_ptr<Meta>> &trackInfos, int32_t &successNodeCount)
209 {
210     Status ret = Status::OK;
211     bool hasVideoFilter = false;
212     for (size_t index = 0; index < trackInfos.size(); index++) {
213         std::shared_ptr<Meta> meta = trackInfos[index];
214         FALSE_RETURN_V_MSG_E(meta != nullptr, Status::ERROR_INVALID_PARAMETER, "meta is invalid, index: %zu", index);
215         std::string mime;
216         if (!meta->GetData(Tag::MIME_TYPE, mime)) {
217             MEDIA_LOG_E("mimeType not found, index: %zu", index);
218             continue;
219         }
220         if (mime.find("invalid") == 0) {
221             MEDIA_LOG_E_SHORT("mimeType is invalid, index: %zu", index);
222             continue;
223         }
224         Plugins::MediaType mediaType;
225         if (!meta->GetData(Tag::MEDIA_TYPE, mediaType)) {
226             MEDIA_LOG_E("mediaType not found, index: %zu", index);
227             continue;
228         }
229         if (ShouldTrackSkipped(mediaType, mime, index)) {
230             continue;
231         }
232         StreamType streamType;
233         if (!FindStreamType(streamType, mediaType, mime, index)) {
234             return Status::ERROR_INVALID_PARAMETER;
235         }
236         UpdateTrackIdMap(streamType, static_cast<int32_t>(index));
237         if (callback_ == nullptr) {
238             MEDIA_LOG_W("callback is nullptr");
239             continue;
240         }
241         if (streamType == StreamType::STREAMTYPE_ENCODED_VIDEO && hasVideoFilter) {
242             continue;
243         } else if (streamType == StreamType::STREAMTYPE_ENCODED_VIDEO &&
244             isEnableReselectVideoTrack_ && demuxer_->IsHasMultiVideoTrack()) {
245             hasVideoFilter = true;
246         }
247         ret = callback_->OnCallback(shared_from_this(), FilterCallBackCommand::NEXT_FILTER_NEEDED, streamType);
248         if (ret != Status::OK) {
249             FaultDemuxerEventInfoWrite(streamType);
250         }
251         FALSE_RETURN_V_MSG_E(ret == Status::OK, ret, "OnCallback Link Filter Fail.");
252         successNodeCount++;
253     }
254     return ret;
255 }
256 
FaultDemuxerEventInfoWrite(StreamType & streamType)257 void DemuxerFilter::FaultDemuxerEventInfoWrite(StreamType& streamType)
258 {
259     MEDIA_LOG_I("FaultDemuxerEventInfoWrite enter.");
260     struct DemuxerFaultInfo demuxerInfo;
261     demuxerInfo.appName = bundleName_;
262     demuxerInfo.instanceId = std::to_string(instanceId_);
263     demuxerInfo.callerType = "player_framework";
264     demuxerInfo.sourceType = static_cast<int8_t>(mediaSource_->GetSourceType());
265     demuxerInfo.containerFormat = CollectVideoAndAudioMime();
266     demuxerInfo.streamType = std::to_string(static_cast<int32_t>(streamType));
267     demuxerInfo.errMsg = "OnCallback Link Filter Fail.";
268     FaultDemuxerEventWrite(demuxerInfo);
269 }
270 
CollectVideoAndAudioMime()271 std::string DemuxerFilter::CollectVideoAndAudioMime()
272 {
273     MEDIA_LOG_I("CollectVideoAndAudioInfo entered.");
274     std::string mime;
275     std::string videoMime = "";
276     std::string audioMime = "";
277     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
278     for (const auto& trackInfo : metaInfo) {
279         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
280             MEDIA_LOG_W("Get MIME fail");
281             continue;
282         }
283         if (IsVideoMime(mime)) {
284             videoMime += (mime + ",");
285         } else if (IsAudioMime(mime)) {
286             audioMime += (mime + ",");
287         }
288     }
289     return videoMime + " : " + audioMime;
290 }
291 
IsVideoMime(const std::string & mime)292 bool DemuxerFilter::IsVideoMime(const std::string& mime)
293 {
294     return mime.find("video/") == 0;
295 }
296 
IsAudioMime(const std::string & mime)297 bool DemuxerFilter::IsAudioMime(const std::string& mime)
298 {
299     return mime.find("audio/") == 0;
300 }
301 
UpdateTrackIdMap(StreamType streamType,int32_t index)302 void DemuxerFilter::UpdateTrackIdMap(StreamType streamType, int32_t index)
303 {
304     AutoLock lock(mapMutex_);
305     auto it = track_id_map_.find(streamType);
306     if (it != track_id_map_.end()) {
307         it->second.push_back(index);
308     } else {
309         std::vector<int32_t> vec = {index};
310         track_id_map_.insert({streamType, vec});
311     }
312 }
313 
PrepareBeforeStart()314 Status DemuxerFilter::PrepareBeforeStart()
315 {
316     if (isLoopStarted.load()) {
317         MEDIA_LOG_I("Loop is started. Not need start again.");
318         return Status::OK;
319     }
320     SetIsNotPrepareBeforeStart(false);
321     return Filter::Start();
322 }
323 
DoStart()324 Status DemuxerFilter::DoStart()
325 {
326     if (isLoopStarted.load()) {
327         MEDIA_LOG_I("Loop is started. Resume only.");
328         return DoResume();
329     }
330     MEDIA_LOG_I("Loop is not started. PrepareBeforeStart firstly.");
331     isLoopStarted = true;
332     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Start");
333     return demuxer_->Start();
334 }
335 
DoStop()336 Status DemuxerFilter::DoStop()
337 {
338     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Stop");
339     MEDIA_LOG_I("Stop in");
340     isLoopStarted = false;
341     return demuxer_->Stop();
342 }
343 
DoPause()344 Status DemuxerFilter::DoPause()
345 {
346     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Pause");
347     MEDIA_LOG_I("Pause in");
348     return demuxer_->Pause();
349 }
350 
DoPauseDragging()351 Status DemuxerFilter::DoPauseDragging()
352 {
353     MEDIA_LOG_I("DoPauseDragging in");
354     return demuxer_->PauseDragging();
355 }
356 
DoPauseAudioAlign()357 Status DemuxerFilter::DoPauseAudioAlign()
358 {
359     MEDIA_LOG_I("DoPauseAudioAlign in");
360     return demuxer_->PauseAudioAlign();
361 }
362 
PauseForSeek()363 Status DemuxerFilter::PauseForSeek()
364 {
365     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::PauseForSeek");
366     MEDIA_LOG_I("PauseForSeek in");
367     // demuxer pause first for auido render immediatly
368     demuxer_->Pause();
369     auto it = nextFiltersMap_.find(StreamType::STREAMTYPE_ENCODED_VIDEO);
370     if (it != nextFiltersMap_.end() && it->second.size() == 1) {
371         auto filter = it->second.back();
372         if (filter != nullptr) {
373             MEDIA_LOG_I("filter pause");
374             return filter->Pause();
375         }
376     }
377     return Status::ERROR_INVALID_OPERATION;
378 }
379 
DoResume()380 Status DemuxerFilter::DoResume()
381 {
382     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Resume");
383     MEDIA_LOG_I("Resume in");
384     return demuxer_->Resume();
385 }
386 
DoResumeDragging()387 Status DemuxerFilter::DoResumeDragging()
388 {
389     MEDIA_LOG_I("DoResumeDragging in");
390     return demuxer_->ResumeDragging();
391 }
392 
DoResumeAudioAlign()393 Status DemuxerFilter::DoResumeAudioAlign()
394 {
395     MEDIA_LOG_I("DoResumeAudioAlign in");
396     return demuxer_->ResumeAudioAlign();
397 }
398 
ResumeForSeek()399 Status DemuxerFilter::ResumeForSeek()
400 {
401     FALSE_RETURN_V_MSG(isNotPrepareBeforeStart_, Status::OK, "Current is not need resumeForSeek");
402     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::ResumeForSeek");
403     MEDIA_LOG_I("ResumeForSeek in size: %{public}zu", nextFiltersMap_.size());
404     auto it = nextFiltersMap_.find(StreamType::STREAMTYPE_ENCODED_VIDEO);
405     if (it != nextFiltersMap_.end() && it->second.size() == 1) {
406         auto filter = it->second.back();
407         if (filter != nullptr) {
408             MEDIA_LOG_I("filter resume");
409             filter->Resume();
410         }
411     }
412     return demuxer_->Resume();
413 }
414 
DoFlush()415 Status DemuxerFilter::DoFlush()
416 {
417     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Flush");
418     MEDIA_LOG_D("Flush entered");
419     return demuxer_->Flush();
420 }
421 
DoPreroll()422 Status DemuxerFilter::DoPreroll()
423 {
424     MEDIA_LOG_I("DoPreroll in");
425     Status ret = demuxer_->Preroll();
426     isLoopStarted.store(true);
427     return ret;
428 }
429 
DoWaitPrerollDone(bool render)430 Status DemuxerFilter::DoWaitPrerollDone(bool render)
431 {
432     (void)render;
433     MEDIA_LOG_I("DoWaitPrerollDone in.");
434     return demuxer_->PausePreroll();
435 }
436 
Reset()437 Status DemuxerFilter::Reset()
438 {
439     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Reset");
440     MEDIA_LOG_I("Reset in");
441     {
442         AutoLock lock(mapMutex_);
443         track_id_map_.clear();
444     }
445     return demuxer_->Reset();
446 }
447 
IsRefParserSupported()448 bool DemuxerFilter::IsRefParserSupported()
449 {
450     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::IsRefParserSupported");
451     MEDIA_LOG_D("IsRefParserSupported entered");
452     return demuxer_->IsRefParserSupported();
453 }
454 
StartReferenceParser(int64_t startTimeMs,bool isForward)455 Status DemuxerFilter::StartReferenceParser(int64_t startTimeMs, bool isForward)
456 {
457     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::StartReferenceParser");
458     MEDIA_LOG_D("StartReferenceParser entered");
459     return demuxer_->StartReferenceParser(startTimeMs, isForward);
460 }
461 
GetFrameLayerInfo(std::shared_ptr<AVBuffer> videoSample,FrameLayerInfo & frameLayerInfo)462 Status DemuxerFilter::GetFrameLayerInfo(std::shared_ptr<AVBuffer> videoSample, FrameLayerInfo &frameLayerInfo)
463 {
464     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::GetFrameLayerInfo");
465     MEDIA_LOG_D("GetFrameLayerInfo entered");
466     return demuxer_->GetFrameLayerInfo(videoSample, frameLayerInfo);
467 }
468 
GetFrameLayerInfo(uint32_t frameId,FrameLayerInfo & frameLayerInfo)469 Status DemuxerFilter::GetFrameLayerInfo(uint32_t frameId, FrameLayerInfo &frameLayerInfo)
470 {
471     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::GetFrameLayerInfo");
472     MEDIA_LOG_D("GetFrameLayerInfo entered");
473     return demuxer_->GetFrameLayerInfo(frameId, frameLayerInfo);
474 }
475 
GetGopLayerInfo(uint32_t gopId,GopLayerInfo & gopLayerInfo)476 Status DemuxerFilter::GetGopLayerInfo(uint32_t gopId, GopLayerInfo &gopLayerInfo)
477 {
478     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::GetGopLayerInfo");
479     MEDIA_LOG_D("GetGopLayerInfo entered");
480     return demuxer_->GetGopLayerInfo(gopId, gopLayerInfo);
481 }
482 
GetIFramePos(std::vector<uint32_t> & IFramePos)483 Status DemuxerFilter::GetIFramePos(std::vector<uint32_t> &IFramePos)
484 {
485     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::GetIFramePos");
486     MEDIA_LOG_D("GetIFramePos entered");
487     return demuxer_->GetIFramePos(IFramePos);
488 }
489 
Dts2FrameId(int64_t dts,uint32_t & frameId,bool offset)490 Status DemuxerFilter::Dts2FrameId(int64_t dts, uint32_t &frameId, bool offset)
491 {
492     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::Dts2FrameId");
493     MEDIA_LOG_D("Dts2FrameId entered");
494     return demuxer_->Dts2FrameId(dts, frameId, offset);
495 }
496 
SetParameter(const std::shared_ptr<Meta> & parameter)497 void DemuxerFilter::SetParameter(const std::shared_ptr<Meta> &parameter)
498 {
499     MEDIA_LOG_I("SetParameter enter");
500 }
501 
GetParameter(std::shared_ptr<Meta> & parameter)502 void DemuxerFilter::GetParameter(std::shared_ptr<Meta> &parameter)
503 {
504     MEDIA_LOG_I("GetParameter enter");
505 }
506 
SetDumpFlag(bool isDump)507 void DemuxerFilter::SetDumpFlag(bool isDump)
508 {
509     isDump_ = isDump;
510     if (demuxer_ != nullptr) {
511         demuxer_->SetDumpInfo(isDump_, instanceId_);
512     }
513 }
514 
GetBufferQueueProducerMap()515 std::map<uint32_t, sptr<AVBufferQueueProducer>> DemuxerFilter::GetBufferQueueProducerMap()
516 {
517     return demuxer_->GetBufferQueueProducerMap();
518 }
519 
PauseTaskByTrackId(int32_t trackId)520 Status DemuxerFilter::PauseTaskByTrackId(int32_t trackId)
521 {
522     return demuxer_->PauseTaskByTrackId(trackId);
523 }
524 
SeekTo(int64_t seekTime,Plugins::SeekMode mode,int64_t & realSeekTime)525 Status DemuxerFilter::SeekTo(int64_t seekTime, Plugins::SeekMode mode, int64_t& realSeekTime)
526 {
527     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::SeekTo");
528     MEDIA_LOG_D("SeekTo in");
529     return demuxer_->SeekTo(seekTime, mode, realSeekTime);
530 }
531 
StartTask(int32_t trackId)532 Status DemuxerFilter::StartTask(int32_t trackId)
533 {
534     return demuxer_->StartTask(trackId);
535 }
536 
SelectTrack(int32_t trackId)537 Status DemuxerFilter::SelectTrack(int32_t trackId)
538 {
539     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::SelectTrack");
540     MEDIA_LOG_I("SelectTrack called");
541     return demuxer_->SelectTrack(trackId);
542 }
543 
GetStreamMetaInfo() const544 std::vector<std::shared_ptr<Meta>> DemuxerFilter::GetStreamMetaInfo() const
545 {
546     return demuxer_->GetStreamMetaInfo();
547 }
548 
GetGlobalMetaInfo() const549 std::shared_ptr<Meta> DemuxerFilter::GetGlobalMetaInfo() const
550 {
551     return demuxer_->GetGlobalMetaInfo();
552 }
553 
LinkNext(const std::shared_ptr<Filter> & nextFilter,StreamType outType)554 Status DemuxerFilter::LinkNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType)
555 {
556     int32_t trackId = -1;
557     if (!FindTrackId(outType, trackId)) {
558         MEDIA_LOG_E("FindTrackId failed.");
559         return Status::ERROR_INVALID_PARAMETER;
560     }
561     std::vector<std::shared_ptr<Meta>> trackInfos = demuxer_->GetStreamMetaInfo();
562     if (outType == StreamType::STREAMTYPE_ENCODED_VIDEO && isEnableReselectVideoTrack_
563         && demuxer_->IsHasMultiVideoTrack()) {
564         trackId = static_cast<int32_t>(demuxer_->GetTargetVideoTrackId(trackInfos));
565     }
566     MEDIA_LOG_I_SHORT("LinkNext track id: %{public}d", trackId);
567     std::shared_ptr<Meta> meta = trackInfos[trackId];
568     for (MapIt iter = meta->begin(); iter != meta->end(); iter++) {
569         MEDIA_LOG_D("Link " PUBLIC_LOG_S, iter->first.c_str());
570     }
571     std::string mimeType;
572     meta->GetData(Tag::MIME_TYPE, mimeType);
573     MEDIA_LOG_I("LinkNext mimeType " PUBLIC_LOG_S, mimeType.c_str());
574 
575     nextFilter_ = nextFilter;
576     nextFiltersMap_[outType].push_back(nextFilter_);
577     MEDIA_LOG_I("LinkNext NextFilter FilterType " PUBLIC_LOG_D32, nextFilter_->GetFilterType());
578     meta->SetData(Tag::REGULAR_TRACK_ID, trackId);
579     std::shared_ptr<FilterLinkCallback> filterLinkCallback
580         = std::make_shared<DemuxerFilterLinkCallback>(shared_from_this());
581     return nextFilter->OnLinked(outType, meta, filterLinkCallback);
582 }
583 
GetBitRates(std::vector<uint32_t> & bitRates)584 Status DemuxerFilter::GetBitRates(std::vector<uint32_t>& bitRates)
585 {
586     if (mediaSource_ == nullptr) {
587         MEDIA_LOG_E("GetBitRates failed, mediaSource = nullptr");
588     }
589     return demuxer_->GetBitRates(bitRates);
590 }
591 
GetDownloadInfo(DownloadInfo & downloadInfo)592 Status DemuxerFilter::GetDownloadInfo(DownloadInfo& downloadInfo)
593 {
594     if (demuxer_ == nullptr) {
595         return Status::ERROR_INVALID_OPERATION;
596     }
597     return demuxer_->GetDownloadInfo(downloadInfo);
598 }
599 
GetPlaybackInfo(PlaybackInfo & playbackInfo)600 Status DemuxerFilter::GetPlaybackInfo(PlaybackInfo& playbackInfo)
601 {
602     if (demuxer_ == nullptr) {
603         return Status::ERROR_INVALID_OPERATION;
604     }
605     return demuxer_->GetPlaybackInfo(playbackInfo);
606 }
607 
SelectBitRate(uint32_t bitRate)608 Status DemuxerFilter::SelectBitRate(uint32_t bitRate)
609 {
610     if (mediaSource_ == nullptr) {
611         MEDIA_LOG_E("SelectBitRate failed, mediaSource = nullptr");
612     }
613     return demuxer_->SelectBitRate(bitRate);
614 }
615 
FindTrackId(StreamType outType,int32_t & trackId)616 bool DemuxerFilter::FindTrackId(StreamType outType, int32_t &trackId)
617 {
618     AutoLock lock(mapMutex_);
619     auto it = track_id_map_.find(outType);
620     if (it != track_id_map_.end()) {
621         trackId = it->second.front();
622         it->second.erase(it->second.begin());
623         if (it->second.empty()) {
624             track_id_map_.erase(it);
625         }
626         return true;
627     }
628     return false;
629 }
630 
FindStreamType(StreamType & streamType,Plugins::MediaType mediaType,std::string mime,size_t index)631 bool DemuxerFilter::FindStreamType(StreamType &streamType, Plugins::MediaType mediaType, std::string mime, size_t index)
632 {
633     MEDIA_LOG_I("mediaType is %{public}d", static_cast<int32_t>(mediaType));
634     if (mediaType == Plugins::MediaType::SUBTITLE) {
635         streamType = StreamType::STREAMTYPE_SUBTITLE;
636     } else if (mediaType == Plugins::MediaType::AUDIO) {
637         if (mime == std::string(MimeType::AUDIO_RAW)) {
638             streamType = StreamType::STREAMTYPE_RAW_AUDIO;
639         } else {
640             streamType = StreamType::STREAMTYPE_ENCODED_AUDIO;
641         }
642     } else if (mediaType == Plugins::MediaType::VIDEO) {
643         streamType = StreamType::STREAMTYPE_ENCODED_VIDEO;
644     } else {
645         MEDIA_LOG_E("streamType not found, index: %zu", index);
646         return false;
647     }
648     return true;
649 }
650 
ShouldTrackSkipped(Plugins::MediaType mediaType,std::string mime,size_t index)651 bool DemuxerFilter::ShouldTrackSkipped(Plugins::MediaType mediaType, std::string mime, size_t index)
652 {
653     if (mime.substr(0, MIME_IMAGE.size()).compare(MIME_IMAGE) == 0) {
654         MEDIA_LOG_W("is image track, continue");
655         return true;
656     } else if (!disabledMediaTracks_.empty() && disabledMediaTracks_.find(mediaType) != disabledMediaTracks_.end()) {
657         MEDIA_LOG_W("mediaType disabled, index: %zu", index);
658         return true;
659     } else if (mediaType == Plugins::MediaType::TIMEDMETA) {
660         return true;
661     }
662     return false;
663 }
664 
UpdateNext(const std::shared_ptr<Filter> & nextFilter,StreamType outType)665 Status DemuxerFilter::UpdateNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType)
666 {
667     return Status::OK;
668 }
669 
UnLinkNext(const std::shared_ptr<Filter> & nextFilter,StreamType outType)670 Status DemuxerFilter::UnLinkNext(const std::shared_ptr<Filter> &nextFilter, StreamType outType)
671 {
672     return Status::OK;
673 }
674 
GetFilterType()675 FilterType DemuxerFilter::GetFilterType()
676 {
677     return filterType_;
678 }
679 
OnLinked(StreamType inType,const std::shared_ptr<Meta> & meta,const std::shared_ptr<FilterLinkCallback> & callback)680 Status DemuxerFilter::OnLinked(StreamType inType, const std::shared_ptr<Meta> &meta,
681     const std::shared_ptr<FilterLinkCallback> &callback)
682 {
683     onLinkedResultCallback_ = callback;
684     return Status::OK;
685 }
686 
OnUpdated(StreamType inType,const std::shared_ptr<Meta> & meta,const std::shared_ptr<FilterLinkCallback> & callback)687 Status DemuxerFilter::OnUpdated(StreamType inType, const std::shared_ptr<Meta> &meta,
688     const std::shared_ptr<FilterLinkCallback> &callback)
689 {
690     return Status::OK;
691 }
692 
OnUnLinked(StreamType inType,const std::shared_ptr<FilterLinkCallback> & callback)693 Status DemuxerFilter::OnUnLinked(StreamType inType, const std::shared_ptr<FilterLinkCallback>& callback)
694 {
695     return Status::OK;
696 }
697 
OnLinkedResult(const sptr<AVBufferQueueProducer> & outputBufferQueue,std::shared_ptr<Meta> & meta)698 void DemuxerFilter::OnLinkedResult(const sptr<AVBufferQueueProducer> &outputBufferQueue, std::shared_ptr<Meta> &meta)
699 {
700     if (meta == nullptr) {
701         MEDIA_LOG_E("meta is invalid.");
702         return;
703     }
704     int32_t trackId;
705     if (!meta->GetData(Tag::REGULAR_TRACK_ID, trackId)) {
706         MEDIA_LOG_E("trackId not found");
707         return;
708     }
709     demuxer_->SetOutputBufferQueue(trackId, outputBufferQueue);
710     if (trackId < 0) {
711         return;
712     }
713     uint32_t trackIdU32 = static_cast<uint32_t>(trackId);
714     int32_t decoderFramerateUpperLimit = 0;
715     if (meta->GetData(Tag::VIDEO_DECODER_RATE_UPPER_LIMIT, decoderFramerateUpperLimit)) {
716         demuxer_->SetDecoderFramerateUpperLimit(decoderFramerateUpperLimit, trackIdU32);
717     }
718     double framerate;
719     if (meta->GetData(Tag::VIDEO_FRAME_RATE, framerate)) {
720         demuxer_->SetFrameRate(framerate, trackIdU32);
721     }
722 }
723 
OnUpdatedResult(std::shared_ptr<Meta> & meta)724 void DemuxerFilter::OnUpdatedResult(std::shared_ptr<Meta> &meta)
725 {
726 }
727 
OnUnlinkedResult(std::shared_ptr<Meta> & meta)728 void DemuxerFilter::OnUnlinkedResult(std::shared_ptr<Meta> &meta)
729 {
730 }
731 
IsDrmProtected()732 bool DemuxerFilter::IsDrmProtected()
733 {
734     MEDIA_LOG_I("IsDrmProtected");
735     return demuxer_->IsLocalDrmInfosExisted();
736 }
737 
OnDrmInfoUpdated(const std::multimap<std::string,std::vector<uint8_t>> & drmInfo)738 void DemuxerFilter::OnDrmInfoUpdated(const std::multimap<std::string, std::vector<uint8_t>> &drmInfo)
739 {
740     MEDIA_LOG_I("OnDrmInfoUpdated");
741     if (this->receiver_ != nullptr) {
742         this->receiver_->OnEvent({"demuxer_filter", EventType::EVENT_DRM_INFO_UPDATED, drmInfo});
743     } else {
744         MEDIA_LOG_E("OnDrmInfoUpdated failed receiver is nullptr");
745     }
746 }
747 
GetDuration(int64_t & durationMs)748 bool DemuxerFilter::GetDuration(int64_t& durationMs)
749 {
750     return demuxer_->GetDuration(durationMs);
751 }
752 
OptimizeDecodeSlow(bool isDecodeOptimizationEnabled)753 Status DemuxerFilter::OptimizeDecodeSlow(bool isDecodeOptimizationEnabled)
754 {
755     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, Status::ERROR_INVALID_OPERATION, "OptimizeDecodeSlow failed.");
756     return demuxer_->OptimizeDecodeSlow(isDecodeOptimizationEnabled);
757 }
758 
SetSpeed(float speed)759 Status DemuxerFilter::SetSpeed(float speed)
760 {
761     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, Status::ERROR_INVALID_OPERATION, "SetSpeed failed.");
762     return demuxer_->SetSpeed(speed);
763 }
764 
DisableMediaTrack(Plugins::MediaType mediaType)765 Status DemuxerFilter::DisableMediaTrack(Plugins::MediaType mediaType)
766 {
767     disabledMediaTracks_.emplace(mediaType);
768     return demuxer_->DisableMediaTrack(mediaType);
769 }
770 
OnDumpInfo(int32_t fd)771 void DemuxerFilter::OnDumpInfo(int32_t fd)
772 {
773     MEDIA_LOG_D("DemuxerFilter::OnDumpInfo called.");
774     if (demuxer_ != nullptr) {
775         demuxer_->OnDumpInfo(fd);
776     }
777 }
778 
IsRenderNextVideoFrameSupported()779 bool DemuxerFilter::IsRenderNextVideoFrameSupported()
780 {
781     MEDIA_LOG_D("DemuxerFilter::OnDumpInfo called.");
782     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, false, "demuxer_ is nullptr");
783     return demuxer_->IsRenderNextVideoFrameSupported();
784 }
785 
ResumeDemuxerReadLoop()786 Status DemuxerFilter::ResumeDemuxerReadLoop()
787 {
788     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::ResumeDemuxerReadLoop");
789     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, Status::ERROR_INVALID_OPERATION, "ResumeDemuxerReadLoop failed.");
790     MEDIA_LOG_I("ResumeDemuxerReadLoop start.");
791     return demuxer_->ResumeDemuxerReadLoop();
792 }
793 
PauseDemuxerReadLoop()794 Status DemuxerFilter::PauseDemuxerReadLoop()
795 {
796     MediaAVCodec::AVCodecTrace trace("DemuxerFilter::PauseDemuxerReadLoop");
797     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, Status::ERROR_INVALID_OPERATION, "PauseDemuxerReadLoop failed.");
798     MEDIA_LOG_I("PauseDemuxerReadLoop start.");
799     return demuxer_->PauseDemuxerReadLoop();
800 }
801 
IsVideoEos()802 bool DemuxerFilter::IsVideoEos()
803 {
804     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, false, "demuxer_ is nullptr");
805     return demuxer_->IsVideoEos();
806 }
807 
HasEosTrack()808 bool DemuxerFilter::HasEosTrack()
809 {
810     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, false, "demuxer_ is nullptr");
811     return demuxer_->HasEosTrack();
812 }
813 
WaitForBufferingEnd()814 void DemuxerFilter::WaitForBufferingEnd()
815 {
816     FALSE_RETURN_MSG(demuxer_ != nullptr, "demuxer_ is nullptr");
817     demuxer_->WaitForBufferingEnd();
818 }
819 
GetCurrentVideoTrackId()820 int32_t DemuxerFilter::GetCurrentVideoTrackId()
821 {
822     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr, INVALID_TRACK_ID, "demuxer_ is nullptr");
823     return demuxer_->GetCurrentVideoTrackId();
824 }
825 
SetIsNotPrepareBeforeStart(bool isNotPrepareBeforeStart)826 void DemuxerFilter::SetIsNotPrepareBeforeStart(bool isNotPrepareBeforeStart)
827 {
828     isNotPrepareBeforeStart_ = isNotPrepareBeforeStart;
829 }
830 
SetIsEnableReselectVideoTrack(bool isEnable)831 void DemuxerFilter::SetIsEnableReselectVideoTrack(bool isEnable)
832 {
833     isEnableReselectVideoTrack_ = isEnable;
834     demuxer_->SetIsEnableReselectVideoTrack(isEnable);
835 }
836 } // namespace Pipeline
837 } // namespace Media
838 } // namespace OHOS
839