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