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> ¶meter)
507 {
508 MEDIA_LOG_I("SetParameter enter");
509 }
510
GetParameter(std::shared_ptr<Meta> & parameter)511 void DemuxerFilter::GetParameter(std::shared_ptr<Meta> ¶meter)
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