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> ¶meter)
498 {
499 MEDIA_LOG_I("SetParameter enter");
500 }
501
GetParameter(std::shared_ptr<Meta> & parameter)502 void DemuxerFilter::GetParameter(std::shared_ptr<Meta> ¶meter)
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