• 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 HST_LOG_TAG "HiPlayer"
17 
18 #include "hiplayer_impl.h"
19 
20 #include <chrono>
21 #include <shared_mutex>
22 
23 #include "audio_device_descriptor.h"
24 #include "common/log.h"
25 #include "common/media_source.h"
26 #include "directory_ex.h"
27 #include "filter/filter_factory.h"
28 #include "media_errors.h"
29 #include "osal/task/jobutils.h"
30 #include "osal/task/pipeline_threadpool.h"
31 #include "osal/task/task.h"
32 #include "osal/utils/dump_buffer.h"
33 #include "plugin/plugin_time.h"
34 #include "media_dfx.h"
35 #include "media_utils.h"
36 #include "meta_utils.h"
37 #include "meta/media_types.h"
38 #include "param_wrapper.h"
39 #include "osal/utils/steady_clock.h"
40 #include "scoped_timer.h"
41 
42 namespace {
43 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_SYSTEM_PLAYER, "HiPlayer" };
44 const float MAX_MEDIA_VOLUME = 1.0f; // standard interface volume is between 0 to 1.
45 const int32_t AUDIO_SINK_MAX_LATENCY = 400; // audio sink write latency ms
46 const int32_t FRAME_RATE_UNIT_MULTIPLE = 100; // the unit of frame rate is frames per 100s
47 const int32_t PLAYING_SEEK_WAIT_TIME = 200; // wait up to 200 ms for new frame after seek in playing.
48 const int32_t FLV_LIVE_PREPARE_WAIT_TIME = 30000; // wait max 30s for flv live stream with play water line.
49 const int64_t PLAY_RANGE_DEFAULT_VALUE = -1; // play range default value.
50 const int64_t SAMPLE_AMPLITUDE_INTERVAL = 100;
51 const int64_t REPORT_PROGRESS_INTERVAL = 100; // progress interval is 100ms
52 const double FRAME_RATE_DEFAULT = -1.0;
53 const double FRAME_RATE_FOR_SEEK_PERFORMANCE = 2000.0;
54 const double TIME_CONVERSION_UNIT  = 1000;
55 const double CHECK_DELAY_INTERVAL  = 200;
56 constexpr int32_t BUFFERING_LOG_FREQUENCY = 5;
57 constexpr int32_t NOTIFY_BUFFERING_END_PARAM = 0;
58 constexpr int64_t FIRST_FRAME_FRAME_REPORT_DELAY_MS = 50;
59 constexpr double PAUSE_LONG_TIME_FACTOR = 5;
60 constexpr int64_t DEMUXER_INIT_WARNING_MS = 50;
61 static const std::unordered_set<OHOS::AudioStandard::StreamUsage> FOCUS_EVENT_USAGE_SET = {
62     OHOS::AudioStandard::StreamUsage::STREAM_USAGE_UNKNOWN,
63     OHOS::AudioStandard::StreamUsage::STREAM_USAGE_MEDIA,
64     OHOS::AudioStandard::StreamUsage::STREAM_USAGE_MUSIC,
65     OHOS::AudioStandard::StreamUsage::STREAM_USAGE_MOVIE,
66     OHOS::AudioStandard::StreamUsage::STREAM_USAGE_GAME,
67     OHOS::AudioStandard::StreamUsage::STREAM_USAGE_AUDIOBOOK,
68 };
69 const std::string TOTAL_MEMORY_SIZE = "TOTAL_MEMORY_SIZE";
70 const std::string DEMUXER_PLUGIN = "DEMUXER_PLUGIN";
71 constexpr uint32_t MEMORY_REPORT_LIMITE = 100 * 1024; // 100MB
72 constexpr uint32_t MAX_DEMUXER_MEMORY_USAGE = 50 * 1024; // 50MB
73 constexpr uint32_t MEMORY_B_TO_KB = 1024;
74 static const std::unordered_map<std::string, uint32_t> MEMORY_USAGE_REPORT_LIMITS = {
75     { DEMUXER_PLUGIN, MAX_DEMUXER_MEMORY_USAGE }
76 };
77 }
78 
79 namespace OHOS {
80 namespace Media {
81 using namespace Pipeline;
82 using namespace OHOS::Media::Plugins;
83 class PlayerEventReceiver : public EventReceiver {
84 public:
PlayerEventReceiver(HiPlayerImpl * hiPlayerImpl,std::string playerId)85     explicit PlayerEventReceiver(HiPlayerImpl* hiPlayerImpl, std::string playerId)
86     {
87         MEDIA_LOG_I("PlayerEventReceiver ctor called.");
88         std::unique_lock<std::shared_mutex> lk(cbMutex_);
89         hiPlayerImpl_ = hiPlayerImpl;
90         task_ = std::make_unique<Task>("PlayerEventReceiver", playerId, TaskType::GLOBAL,
91             OHOS::Media::TaskPriority::HIGH, false);
92     }
93 
OnEvent(const Event & event)94     void OnEvent(const Event &event) override
95     {
96         MEDIA_LOG_DD("PlayerEventReceiver OnEvent.");
97         task_->SubmitJobOnce([this, event] {
98             std::shared_lock<std::shared_mutex> lk(cbMutex_);
99             FALSE_RETURN(hiPlayerImpl_ != nullptr);
100             hiPlayerImpl_->OnEvent(event);
101         });
102     }
103 
OnDfxEvent(const DfxEvent & event)104     void OnDfxEvent(const DfxEvent &event) override
105     {
106         MEDIA_LOG_DD("PlayerEventReceiver OnDfxEvent.");
107         std::shared_lock<std::shared_mutex> lk(cbMutex_);
108         FALSE_RETURN(hiPlayerImpl_ != nullptr);
109         hiPlayerImpl_->HandleDfxEvent(event);
110     }
111 
NotifyRelease()112     void NotifyRelease() override
113     {
114         MEDIA_LOG_D("PlayerEventReceiver NotifyRelease.");
115         std::unique_lock<std::shared_mutex> lk(cbMutex_);
116         hiPlayerImpl_ = nullptr;
117     }
118 
OnMemoryUsageEvent(const DfxEvent & event)119     void OnMemoryUsageEvent(const DfxEvent& event) override
120     {
121         MEDIA_LOG_D("PlayerEventReceiver OnMemoryUsageEvent.");
122         task_->SubmitJobOnce([this, event] {
123             std::shared_lock<std::shared_mutex> lk(cbMutex_);
124             FALSE_RETURN(hiPlayerImpl_ != nullptr);
125             hiPlayerImpl_->HandleMemoryUsageEvent(event);
126         });
127     }
128 
129 private:
130     std::shared_mutex cbMutex_ {};
131     HiPlayerImpl* hiPlayerImpl_;
132     std::unique_ptr<Task> task_;
133 };
134 
135 class PlayerFilterCallback : public FilterCallback {
136 public:
PlayerFilterCallback(HiPlayerImpl * hiPlayerImpl)137     explicit PlayerFilterCallback(HiPlayerImpl* hiPlayerImpl)
138     {
139         MEDIA_LOG_I("PlayerFilterCallback ctor called.");
140         std::unique_lock<std::shared_mutex> lk(cbMutex_);
141         hiPlayerImpl_ = hiPlayerImpl;
142     }
143 
OnCallback(const std::shared_ptr<Filter> & filter,FilterCallBackCommand cmd,StreamType outType)144     Status OnCallback(const std::shared_ptr<Filter>& filter, FilterCallBackCommand cmd, StreamType outType) override
145     {
146         MEDIA_LOG_D("PlayerFilterCallback OnCallback.");
147         std::shared_lock<std::shared_mutex> lk(cbMutex_);
148         FALSE_RETURN_V(hiPlayerImpl_ != nullptr, Status::OK); // hiPlayerImpl_ is destructed
149         return hiPlayerImpl_->OnCallback(filter, cmd, outType);
150     }
151 
NotifyRelease()152     void NotifyRelease() override
153     {
154         MEDIA_LOG_D("PlayerEventReceiver NotifyRelease.");
155         std::unique_lock<std::shared_mutex> lk(cbMutex_);
156         hiPlayerImpl_ = nullptr;
157     }
158 
159 private:
160     std::shared_mutex cbMutex_ {};
161     HiPlayerImpl* hiPlayerImpl_;
162 };
163 
HiPlayerImpl(int32_t appUid,int32_t appPid,uint32_t appTokenId,uint64_t appFullTokenId)164 HiPlayerImpl::HiPlayerImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId, uint64_t appFullTokenId)
165     : appUid_(appUid), appPid_(appPid), appTokenId_(appTokenId), appFullTokenId_(appFullTokenId)
166 {
167     MEDIA_LOG_D("hiPlayerImpl ctor appUid " PUBLIC_LOG_D32 " appPid " PUBLIC_LOG_D32
168         " appTokenId %{private}" PRIu32 " appFullTokenId %{private}" PRIu64,
169         appUid_, appPid_, appTokenId_, appFullTokenId_);
170     playerId_ = std::string("HiPlayer_") + std::to_string(OHOS::Media::Pipeline::Pipeline::GetNextPipelineId());
171     pipeline_ = std::make_shared<OHOS::Media::Pipeline::Pipeline>();
172     syncManager_ = std::make_shared<MediaSyncManager>();
173     callbackLooper_.SetPlayEngine(this, playerId_);
174     liveController_.CreateTask(playerId_);
175     bundleName_ = GetClientBundleName(appUid);
176     dfxAgent_ = std::make_shared<DfxAgent>(playerId_, bundleName_);
177 }
178 
~HiPlayerImpl()179 HiPlayerImpl::~HiPlayerImpl()
180 {
181     MEDIA_LOG_D("~HiPlayerImpl dtor called");
182     if (demuxer_) {
183         pipeline_->RemoveHeadFilter(demuxer_);
184     }
185     if (dfxAgent_ != nullptr) {
186         dfxAgent_.reset();
187     }
188     if (playerEventReceiver_ != nullptr) {
189         playerEventReceiver_->NotifyRelease();
190     }
191     if (playerFilterCallback_ != nullptr) {
192         playerFilterCallback_->NotifyRelease();
193     }
194     PipeLineThreadPool::GetInstance().DestroyThread(playerId_);
195 }
196 
ReleaseInner()197 void HiPlayerImpl::ReleaseInner()
198 {
199     pipeline_->Stop();
200     audioSink_.reset();
201 #ifdef SUPPORT_VIDEO
202     if (videoDecoder_) {
203         interruptMonitor_->DeregisterListener(videoDecoder_);
204         videoDecoder_.reset();
205     }
206 #endif
207     if (subtitleSink_) {
208         subtitleSink_.reset();
209     }
210     syncManager_.reset();
211     if (demuxer_) {
212         pipeline_->RemoveHeadFilter(demuxer_);
213     }
214 }
215 
Init()216 Status HiPlayerImpl::Init()
217 {
218     MediaTrace trace("HiPlayerImpl::Init");
219     MEDIA_LOG_I("Init start");
220     auto playerEventReceiver = std::make_shared<PlayerEventReceiver>(this, playerId_);
221     auto playerFilterCallback = std::make_shared<PlayerFilterCallback>(this);
222     auto interruptMonitor = std::make_shared<InterruptMonitor>();
223     FALSE_RETURN_V_MSG_E(playerEventReceiver != nullptr && playerFilterCallback != nullptr &&
224         interruptMonitor != nullptr, Status::ERROR_NO_MEMORY, "fail to init hiplayImpl");
225     playerEventReceiver_ = playerEventReceiver;
226     playerFilterCallback_ = playerFilterCallback;
227     interruptMonitor_ = interruptMonitor;
228     MEDIA_LOG_D("pipeline init");
229     pipeline_->Init(playerEventReceiver_, playerFilterCallback_, playerId_);
230     MEDIA_LOG_D("pipeline Init out");
231     for (std::pair<std::string, bool>& item: completeState_) {
232         item.second = false;
233     }
234     GetDumpFlag();
235     return Status::OK;
236 }
237 
GetDumpFlag()238 void HiPlayerImpl::GetDumpFlag()
239 {
240     const std::string dumpTag = "sys.media.player.dump.enable";
241     std::string dumpEnable;
242     int32_t dumpRes = OHOS::system::GetStringParameter(dumpTag, dumpEnable, "false");
243     isDump_ = (dumpEnable == "true");
244     MEDIA_LOG_D_SHORT("get dump flag, dumpRes: %{public}d, isDump_: %{public}d", dumpRes, isDump_);
245 }
246 
SetDefaultAudioRenderInfo(const std::vector<std::shared_ptr<Meta>> & trackInfos)247 void HiPlayerImpl::SetDefaultAudioRenderInfo(const std::vector<std::shared_ptr<Meta>> &trackInfos)
248 {
249     MEDIA_LOG_D_SHORT("SetDefaultAudioRenderInfo");
250     bool hasVideoTrack = false;
251     for (size_t index = 0; index < trackInfos.size(); index++) {
252         std::shared_ptr<Meta> meta = trackInfos[index];
253         if (meta == nullptr) {
254             continue;
255         }
256         std::string trackMime;
257         if (!meta->GetData(Tag::MIME_TYPE, trackMime)) {
258             continue;
259         }
260         if (trackMime.find("video/") == 0) {
261             hasVideoTrack = true;
262         }
263     }
264     Plugins::AudioRenderInfo audioRenderInfo;
265     if (hasVideoTrack) {
266         audioRenderInfo = {AudioStandard::CONTENT_TYPE_MOVIE, AudioStandard::STREAM_USAGE_MOVIE, 0};
267     } else {
268         audioRenderInfo = {AudioStandard::CONTENT_TYPE_MUSIC, AudioStandard::STREAM_USAGE_MUSIC, 0};
269     }
270     if (audioRenderInfo_ == nullptr) {
271         audioRenderInfo_ = std::make_shared<Meta>();
272         audioRenderInfo_->SetData(Tag::AUDIO_RENDER_INFO, audioRenderInfo);
273     }
274 }
275 
GetRealPath(const std::string & url,std::string & realUrlPath) const276 int32_t HiPlayerImpl::GetRealPath(const std::string &url, std::string &realUrlPath) const
277 {
278     std::string fileHead = "file://";
279     std::string tempUrlPath;
280 
281     if (url.find(fileHead) == 0 && url.size() > fileHead.size()) {
282         tempUrlPath = url.substr(fileHead.size());
283     } else {
284         tempUrlPath = url;
285     }
286     if (tempUrlPath.find("..") != std::string::npos) {
287         MEDIA_LOG_E("invalid url. The Url (%{private}s) path may be invalid.", tempUrlPath.c_str());
288         return MSERR_FILE_ACCESS_FAILED;
289     }
290     bool ret = PathToRealPath(tempUrlPath, realUrlPath);
291     if (!ret) {
292         MEDIA_LOG_E("invalid url. The Url (%{private}s) path may be invalid.", url.c_str());
293         return MSERR_OPEN_FILE_FAILED;
294     }
295     if (access(realUrlPath.c_str(), R_OK) != 0) {
296         return MSERR_FILE_ACCESS_FAILED;
297     }
298     return MSERR_OK;
299 }
300 
IsFileUrl(const std::string & url) const301 bool HiPlayerImpl::IsFileUrl(const std::string &url) const
302 {
303     return url.find("://") == std::string::npos || url.find("file://") == 0;
304 }
305 
IsNetworkUrl(const std::string & url) const306 bool HiPlayerImpl::IsNetworkUrl(const std::string &url) const
307 {
308     return url.find("http") == 0 || url.find("https") == 0;
309 }
310 
IsValidPlayRange(int64_t start,int64_t end) const311 bool HiPlayerImpl::IsValidPlayRange(int64_t start, int64_t end) const
312 {
313     if (start < PLAY_RANGE_DEFAULT_VALUE || end < PLAY_RANGE_DEFAULT_VALUE || end == 0) {
314         return false;
315     }
316     if (pipelineStates_ == PlayerStates::PLAYER_INITIALIZED) {
317         return true;
318     }
319     if ((end == PLAY_RANGE_DEFAULT_VALUE) && (start < durationMs_.load())) {
320         return true;
321     }
322     if (start >= end || start >= durationMs_.load() || end > durationMs_.load()) {
323         return false;
324     }
325     return true;
326 }
327 
IsInValidSeekTime(int32_t seekPos)328 bool HiPlayerImpl::IsInValidSeekTime(int32_t seekPos)
329 {
330     if (endTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE) {
331         return false;
332     }
333     int64_t seekTime = static_cast<int64_t>(seekPos);
334     if (startTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE) {
335         if (seekTime > endTimeWithMode_) {
336             endTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
337             pipeline_->SetPlayRange(startTimeWithMode_, endTimeWithMode_);
338         }
339         return false;
340     }
341     return seekTime < startTimeWithMode_ || seekTime > endTimeWithMode_;
342 }
343 
GetPlayStartTime()344 int64_t HiPlayerImpl::GetPlayStartTime()
345 {
346     if (playRangeStartTime_ > PLAY_RANGE_DEFAULT_VALUE) {
347         return playRangeStartTime_;
348     }
349     int64_t rePlayStartTime = 0;
350     if (startTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE && endTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE) {
351         rePlayStartTime = startTimeWithMode_;
352     }
353     return rePlayStartTime;
354 }
355 
SetInstancdId(uint64_t instanceId)356 void HiPlayerImpl::SetInstancdId(uint64_t instanceId)
357 {
358     instanceId_ = instanceId;
359     if (dfxAgent_ != nullptr) {
360         dfxAgent_->SetInstanceId(std::to_string(instanceId_));
361     }
362 }
363 
SetApiVersion(int32_t apiVersion)364 void HiPlayerImpl::SetApiVersion(int32_t apiVersion)
365 {
366     apiVersion_ = apiVersion;
367 }
368 
SetSource(const std::string & uri)369 int32_t HiPlayerImpl::SetSource(const std::string& uri)
370 {
371     MediaTrace trace("HiPlayerImpl::SetSource uri");
372     MEDIA_LOG_D("HiPlayerImpl SetSource uri");
373     CreateMediaInfo(CallType::AVPLAYER, appUid_, instanceId_);
374     playStatisticalInfo_.sourceUrl = "private";
375     playStatisticalInfo_.sourceType = static_cast<int32_t>(SourceType::SOURCE_TYPE_URI);
376     url_ = uri;
377     PlayerDfxSourceType sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_UNKNOWN;
378     if (IsFileUrl(uri)) {
379         std::string realUriPath;
380         int32_t result = GetRealPath(uri, realUriPath);
381         if (result != MSERR_OK) {
382             CollectionErrorInfo(result, "SetSource error: GetRealPath error");
383             return result;
384         }
385         url_ = "file://" + realUriPath;
386         sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_URL_FILE;
387         SetPerfRecEnabled(true);
388     }
389     if (IsNetworkUrl(uri)) {
390         isNetWorkPlay_ = true;
391         sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_URL_NETWORK;
392     }
393     if (url_.find("fd://") == 0) {
394         sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_URL_FD;
395         SetPerfRecEnabled(true);
396     }
397     if (dfxAgent_ != nullptr) {
398         dfxAgent_->SetSourceType(sourceType);
399     }
400     hasExtSub_ = false;
401     pipelineStates_ = PlayerStates::PLAYER_INITIALIZED;
402     int ret = TransStatus(Status::OK);
403     playStatisticalInfo_.errCode = ret;
404     ResetEnableCameraPostProcess();
405     return ret;
406 }
407 
SetMediaSource(const std::shared_ptr<AVMediaSource> & mediaSource,AVPlayStrategy strategy)408 int32_t HiPlayerImpl::SetMediaSource(const std::shared_ptr<AVMediaSource> &mediaSource, AVPlayStrategy strategy)
409 {
410     MediaTrace trace("HiPlayerImpl::SetMediaSource.");
411     MEDIA_LOG_I("SetMediaSource entered media source stream");
412     if (mediaSource == nullptr) {
413         CollectionErrorInfo(MSERR_INVALID_VAL, "mediaSource is nullptr");
414         return MSERR_INVALID_VAL;
415     }
416     header_ = mediaSource->header;
417 
418     playMediaStreamVec_ = mediaSource->GetAVPlayMediaStreamList();
419     url_ = playMediaStreamVec_.empty() ? mediaSource->url : playMediaStreamVec_[0].url;
420     sourceLoader_ = mediaSource->sourceLoader_;
421 
422     preferedWidth_ = strategy.preferredWidth;
423     preferedHeight_ = strategy.preferredHeight;
424     bufferDuration_ = strategy.preferredBufferDuration;
425     preferHDR_ = strategy.preferredHdr;
426     renderFirstFrame_ = strategy.showFirstFrameOnPrepare;
427     mutedMediaType_ = strategy.mutedMediaType;
428     audioLanguage_ = strategy.preferredAudioLanguage;
429     subtitleLanguage_ = strategy.preferredSubtitleLanguage;
430     enableCameraPostprocessing_ = strategy.enableCameraPostprocessing;
431     videoPostProcessorType_ = strategy.enableSuperResolution ? VideoPostProcessorType::SUPER_RESOLUTION
432                                 : VideoPostProcessorType::NONE;
433     isPostProcessorOn_ = strategy.enableSuperResolution;
434 
435     mimeType_ = mediaSource->GetMimeType();
436     SetFlvLiveParams(strategy);
437     FALSE_RETURN_V(IsLivingMaxDelayTimeValid(), TransStatus(Status::ERROR_INVALID_PARAMETER));
438     if (mimeType_ != AVMimeTypes::APPLICATION_M3U8 && IsFileUrl(url_)) {
439         std::string realUriPath;
440         int32_t result = GetRealPath(url_, realUriPath);
441         if (result != MSERR_OK) {
442             CollectionErrorInfo(result, "SetSource error: GetRealPath error");
443             return result;
444         }
445         url_ = "file://" + realUriPath;
446     }
447 
448     PlayerDfxSourceType sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_MEDIASOURCE_LOCAL;
449     if (IsNetworkUrl(url_)) {
450         isNetWorkPlay_ = true;
451         sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_MEDIASOURCE_NETWORK;
452     }
453     if (dfxAgent_ != nullptr) {
454         dfxAgent_->SetSourceType(sourceType);
455     }
456 
457     pipelineStates_ = PlayerStates::PLAYER_INITIALIZED;
458     int ret = TransStatus(Status::OK);
459     playStatisticalInfo_.errCode = ret;
460     return ret;
461 }
462 
SetSource(const std::shared_ptr<IMediaDataSource> & dataSrc)463 int32_t HiPlayerImpl::SetSource(const std::shared_ptr<IMediaDataSource>& dataSrc)
464 {
465     MediaTrace trace("HiPlayerImpl::SetSource dataSrc");
466     MEDIA_LOG_I("SetSource in source stream");
467     if (dataSrc == nullptr) {
468         MEDIA_LOG_E("SetSource error: dataSrc is null");
469     }
470     if (dfxAgent_ != nullptr) {
471         dfxAgent_->SetSourceType(PlayerDfxSourceType::DFX_SOURCE_TYPE_DATASRC);
472     }
473     playStatisticalInfo_.sourceType = static_cast<int32_t>(SourceType::SOURCE_TYPE_STREAM);
474     dataSrc_ = dataSrc;
475     hasExtSub_ = false;
476     pipelineStates_ = PlayerStates::PLAYER_INITIALIZED;
477     int ret = TransStatus(Status::OK);
478     playStatisticalInfo_.errCode = ret;
479     ResetEnableCameraPostProcess();
480     return ret;
481 }
482 
AddSubSource(const std::string & url)483 int32_t HiPlayerImpl::AddSubSource(const std::string &url)
484 {
485     MediaTrace trace("HiPlayerImpl::AddSubSource uri");
486     MEDIA_LOG_I("AddSubSource entered source uri: %{private}s", url.c_str());
487     subUrl_ = url;
488     if (IsFileUrl(url)) {
489         std::string realUriPath;
490         int32_t result = GetRealPath(url, realUriPath);
491         if (result != MSERR_OK) {
492             MEDIA_LOG_E("AddSubSource error: GetRealPath error");
493             return result;
494         }
495         subUrl_ = "file://" + realUriPath;
496     }
497 
498     hasExtSub_ = true;
499     return TransStatus(Status::OK);
500 }
501 
ResetIfSourceExisted()502 void HiPlayerImpl::ResetIfSourceExisted()
503 {
504     FALSE_RETURN(demuxer_ != nullptr);
505     MEDIA_LOG_I("Source is existed, reset the relatived objects");
506     ReleaseInner();
507     if (pipeline_ != nullptr) {
508         pipeline_.reset();
509     }
510     if (audioDecoder_ != nullptr) {
511         audioDecoder_.reset();
512     }
513 
514     pipeline_ = std::make_shared<OHOS::Media::Pipeline::Pipeline>();
515     if (pipeline_ != nullptr) {
516         pipeline_->Init(playerEventReceiver_, playerFilterCallback_, playerId_);
517     }
518     syncManager_ = std::make_shared<MediaSyncManager>();
519     MEDIA_LOG_I("Reset the relatived objects end");
520 }
521 
Prepare()522 int32_t HiPlayerImpl::Prepare()
523 {
524     return TransStatus(Status::OK);
525 }
526 
SetPlayRange(int64_t start,int64_t end)527 int32_t HiPlayerImpl::SetPlayRange(int64_t start, int64_t end)
528 {
529     if (!IsValidPlayRange(start, end)) {
530         MEDIA_LOG_E("SetPlayRange failed! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
531                     start, end);
532         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
533         return TransStatus(Status::ERROR_INVALID_OPERATION);
534     }
535     playRangeStartTime_ = start;
536     playRangeEndTime_ = end;
537 
538     if (pipeline_ != nullptr) {
539         pipeline_->SetPlayRange(playRangeStartTime_, playRangeEndTime_);
540     }
541 
542     MEDIA_LOG_I("SetPlayRange success! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
543                 playRangeStartTime_, playRangeEndTime_);
544     return TransStatus(Status::OK);
545 }
546 
SetPlayRangeWithMode(int64_t start,int64_t end,PlayerSeekMode mode)547 int32_t HiPlayerImpl::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
548 {
549     Status rtv = Status::OK;
550     if (!IsValidPlayRange(start, end)) {
551         MEDIA_LOG_E("SetPlayRangeWithMode failed! start: " PUBLIC_LOG_D64 ", end: "
552             PUBLIC_LOG_D64, start, end);
553         rtv = Status::ERROR_INVALID_PARAMETER;
554         OnEvent({"engine", EventType::EVENT_ERROR, TransStatus(rtv)});
555         return TransStatus(rtv);
556     }
557     startTimeWithMode_ = start;
558     endTimeWithMode_ = end;
559     playRangeSeekMode_ = mode;
560     isSetPlayRange_ = true;
561     if (pipelineStates_ == PlayerStates::PLAYER_INITIALIZED ||
562         pipelineStates_ == PlayerStates::PLAYER_STOPPED) {
563         MEDIA_LOG_I("current state is initialized/stopped SetPlayRangeWithMode start: "
564              PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64, startTimeWithMode_, endTimeWithMode_);
565         return TransStatus(rtv);
566     }
567     if (pipeline_ != nullptr && demuxer_ != nullptr) {
568         pipeline_->SetPlayRange(startTimeWithMode_, endTimeWithMode_);
569         int64_t seekTimeMs = 0;
570         if (startTimeWithMode_ > PLAY_RANGE_DEFAULT_VALUE) {
571             seekTimeMs = startTimeWithMode_;
572         }
573         MEDIA_LOG_I("seek to start time: " PUBLIC_LOG_D64, seekTimeMs);
574         pipeline_->Flush();
575         rtv = doSeek(seekTimeMs, playRangeSeekMode_);
576         if (rtv != Status::OK) {
577             UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
578             MEDIA_LOG_E("seek failed to start time: " PUBLIC_LOG_D64, seekTimeMs);
579             return TransStatus(rtv);
580         }
581         if (demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
582             rtv = pipeline_->Preroll(true);
583         }
584         if (pipelineStates_ == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
585             isDoCompletedSeek_ = true;
586             OnStateChanged(PlayerStateId::PAUSE);
587         }
588         Format format;
589         callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, static_cast<int32_t>(seekTimeMs), format);
590     }
591     MEDIA_LOG_I("SetPlayRangeWithMode start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
592                 startTimeWithMode_, endTimeWithMode_);
593     return TransStatus(rtv);
594 }
595 
GetPlayRangeStartTime()596 int64_t HiPlayerImpl::GetPlayRangeStartTime()
597 {
598     return startTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE ? startTimeWithMode_ : playRangeStartTime_;
599 }
600 
GetPlayRangeEndTime()601 int64_t HiPlayerImpl::GetPlayRangeEndTime()
602 {
603     return endTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE ? endTimeWithMode_ : playRangeEndTime_;
604 }
605 
GetPlayRangeSeekMode()606 int32_t HiPlayerImpl::GetPlayRangeSeekMode()
607 {
608     return playRangeSeekMode_;
609 }
610 
SetRenderFirstFrame(bool display)611 int32_t HiPlayerImpl::SetRenderFirstFrame(bool display)
612 {
613     MEDIA_LOG_I("SetRenderFirstFrame in, display: " PUBLIC_LOG_D32, display);
614     renderFirstFrame_ = display;
615     return TransStatus(Status::OK);
616 }
617 
SetIsCalledBySystemApp(bool isCalledBySystemApp)618 int32_t HiPlayerImpl::SetIsCalledBySystemApp(bool isCalledBySystemApp)
619 {
620     MEDIA_LOG_I("SetIsCalledBySystemApp in, isCalledBySystemApp: " PUBLIC_LOG_D32, isCalledBySystemApp);
621     isCalledBySystemApp_ = isCalledBySystemApp;
622     return TransStatus(Status::OK);
623 }
624 
SetStartFrameRateOptEnabled(bool enabled)625 int32_t HiPlayerImpl::SetStartFrameRateOptEnabled(bool enabled)
626 {
627     MEDIA_LOG_I("enabled: " PUBLIC_LOG_D32, enabled);
628     isEnableStartFrameRateOpt_ = enabled;
629     return TransStatus(Status::OK);
630 }
631 
PrepareAsync()632 int32_t HiPlayerImpl::PrepareAsync()
633 {
634     MediaTrace trace("HiPlayerImpl::PrepareAsync");
635     MEDIA_LOG_D("HiPlayerImpl PrepareAsync");
636     if (!(pipelineStates_ == PlayerStates::PLAYER_INITIALIZED || pipelineStates_ == PlayerStates::PLAYER_STOPPED)) {
637         CollectionErrorInfo(MSERR_INVALID_OPERATION, "PrepareAsync pipelineStates not initialized or stopped");
638         return MSERR_INVALID_OPERATION;
639     }
640     auto ret = Init();
641     if (ret != Status::OK || isInterruptNeeded_.load()) {
642         return HandleErrorRet(Status::ERROR_UNSUPPORTED_FORMAT, "PrepareAsync error: init error");
643     }
644     isBufferingEnd_ = false;
645     DoSetMediaSource(ret);
646     if (mutedMediaType_ == OHOS::Media::MediaType::MEDIA_TYPE_VID) {
647         MEDIA_LOG_I("HiPlayerImpl::PrepareAsync, do setMute true");
648         demuxer_->SetMediaMuted(OHOS::Media::MediaType::MEDIA_TYPE_VID, true);
649     }
650     if (ret != Status::OK && !isInterruptNeeded_.load()) {
651         OnEvent({"engine", EventType::EVENT_ERROR, MSERR_UNSUPPORT_CONTAINER_TYPE});
652         return HandleErrorRet(Status::ERROR_UNSUPPORTED_FORMAT, "PrepareAsync error: DoSetSource error");
653     }
654     FALSE_RETURN_V(!BreakIfInterruptted(), TransStatus(Status::OK));
655     NotifyBufferingUpdate(PlayerKeys::PLAYER_BUFFERING_START, 0);
656     MEDIA_LOG_I("PrepareAsync:current pipeline state: " PUBLIC_LOG_S, StringnessPlayerState(pipelineStates_).c_str());
657     OnStateChanged(PlayerStateId::PREPARING);
658     ret = pipeline_->Prepare();
659     if (ret != Status::OK) {
660         MEDIA_LOG_E("PrepareAsync failed with error " PUBLIC_LOG_D32, ret);
661         return HandleErrorRet(ret, "pipeline PrepareAsync failed");
662     }
663     SetFlvObs();
664     InitDuration();
665     SetSeiMessageListener();
666     UpdateMediaFirstPts();
667     ret = DoSetPlayRange();
668     FALSE_RETURN_V_MSG_E(ret == Status::OK, TransStatus(ret), "DoSetPlayRange failed");
669     if (demuxer_ != nullptr && demuxer_->IsRenderNextVideoFrameSupported() && IsAppEnableRenderFirstFrame(appUid_)) {
670         ret = pipeline_->Preroll(renderFirstFrame_);
671         if (ret != Status::OK) {
672             return HandleErrorRet(ret, "PrepareFrame failed.");
673         }
674     }
675     UpdatePlayerStateAndNotify();
676     MEDIA_LOG_I("PrepareAsync End");
677     return TransStatus(ret);
678 }
679 
CollectionErrorInfo(int32_t errCode,const std::string & errMsg)680 void HiPlayerImpl::CollectionErrorInfo(int32_t errCode, const std::string& errMsg)
681 {
682     MEDIA_LOG_E("Error: " PUBLIC_LOG_S, errMsg.c_str());
683     playStatisticalInfo_.errCode = errCode;
684     playStatisticalInfo_.errMsg = errMsg;
685 }
686 
HandleErrorRet(Status ret,const std::string & errMsg)687 int32_t HiPlayerImpl::HandleErrorRet(Status ret, const std::string& errMsg)
688 {
689     auto errCode = TransStatus(ret);
690     CollectionErrorInfo(errCode, errMsg);
691     return errCode;
692 }
693 
DoSetMediaSource(Status & ret)694 void HiPlayerImpl::DoSetMediaSource(Status& ret)
695 {
696     if (dataSrc_ != nullptr) {
697         ret = DoSetSource(std::make_shared<MediaSource>(dataSrc_));
698     } else if (sourceLoader_ != nullptr) {
699         auto mediaSource = std::make_shared<MediaSource>(url_, header_);
700         if (mediaSource == nullptr) {
701             MEDIA_LOG_I("mediaSource == nullptr");
702             ret = Status::ERROR_NO_MEMORY;
703             return;
704         }
705         mediaSource->SetSourceLoader(sourceLoader_);
706         ret = DoSetSource(mediaSource);
707     } else {
708         if (!header_.empty()) {
709             MEDIA_LOG_I("DoSetSource header");
710             ret = DoSetSource(std::make_shared<MediaSource>(url_, header_));
711         } else {
712             MEDIA_LOG_I("DoSetSource url");
713             ret = DoSetSource(std::make_shared<MediaSource>(url_));
714         }
715     }
716 }
717 
DoSetPlayRange()718 Status HiPlayerImpl::DoSetPlayRange()
719 {
720     Status ret = Status::OK;
721     int64_t rangeStartTime = GetPlayRangeStartTime();
722     int64_t rangeEndTime = GetPlayRangeEndTime();
723     if (!IsValidPlayRange(rangeStartTime, rangeEndTime)) {
724         MEDIA_LOG_E("DoSetPlayRange failed! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
725                     rangeStartTime, rangeEndTime);
726         ret = Status::ERROR_INVALID_PARAMETER;
727         OnEvent({"engine", EventType::EVENT_ERROR, TransStatus(ret)});
728         return ret;
729     }
730     if ((pipeline_ != nullptr) && (rangeEndTime > PLAY_RANGE_DEFAULT_VALUE)) {
731         pipeline_->SetPlayRange(rangeStartTime, rangeEndTime);
732     }
733     if ((pipeline_ != nullptr) && (rangeStartTime > PLAY_RANGE_DEFAULT_VALUE)) {
734         MEDIA_LOG_I("seek to start time: " PUBLIC_LOG_D64, rangeStartTime);
735         pipeline_ -> Flush();
736         ret = doSeek(rangeStartTime, playRangeSeekMode_);
737         if (ret != Status::OK) {
738             UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
739             MEDIA_LOG_E("seek failed to start time: " PUBLIC_LOG_D64, rangeStartTime);
740             return ret;
741         }
742         Format format;
743         callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, static_cast<int32_t>(rangeStartTime), format);
744     }
745     return ret;
746 }
747 
UpdatePlayerStateAndNotify()748 void HiPlayerImpl::UpdatePlayerStateAndNotify()
749 {
750     NotifyBufferingUpdate(PlayerKeys::PLAYER_BUFFERING_END, 0);
751     if (durationMs_ <= 0) {
752         HandleIsLiveStreamEvent(true);
753     }
754     NotifyDurationUpdate(PlayerKeys::PLAYER_CACHED_DURATION, durationMs_.load());
755     InitVideoWidthAndHeight();
756     NotifyResolutionChange();
757     NotifyPositionUpdate();
758     DoInitializeForHttp();
759     OnStateChanged(PlayerStateId::READY);
760 }
761 
UpdateMediaFirstPts()762 void HiPlayerImpl::UpdateMediaFirstPts()
763 {
764     FALSE_RETURN(syncManager_ != nullptr);
765     std::string mime;
766     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
767     int64_t startTime = 0;
768     for (const auto& trackInfo : metaInfo) {
769         if (trackInfo == nullptr || !(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
770             MEDIA_LOG_W("TrackInfo is null or get mime fail");
771             continue;
772         }
773         if (!(mime.find("audio/") == 0 || mime.find("video/") == 0)) {
774             MEDIA_LOG_W("Not audio or video track");
775             continue;
776         }
777         if (trackInfo->GetData(Tag::MEDIA_START_TIME, startTime)) {
778             syncManager_->SetMediaStartPts(startTime);
779         }
780     }
781     startTime = syncManager_->GetMediaStartPts();
782     if (startTime != HST_TIME_NONE) {
783         mediaStartPts_ = startTime;
784     }
785 }
786 
BreakIfInterruptted()787 bool HiPlayerImpl::BreakIfInterruptted()
788 {
789     if (isInterruptNeeded_.load()) {
790         OnStateChanged(PlayerStateId::READY);
791         return true;
792     }
793     return false;
794 }
795 
SetInterruptState(bool isInterruptNeeded)796 void HiPlayerImpl::SetInterruptState(bool isInterruptNeeded)
797 {
798     MEDIA_LOG_I("Hiplayer SetInterrupt %{public}d", isInterruptNeeded);
799     isInterruptNeeded_ = isInterruptNeeded;
800     if (interruptMonitor_) {
801         interruptMonitor_->SetInterruptState(isInterruptNeeded);
802     }
803     if (isDrmProtected_) {
804         std::unique_lock<std::mutex> drmLock(drmMutex_);
805         stopWaitingDrmConfig_ = true;
806         drmConfigCond_.notify_all();
807     }
808     if (isFlvLive_ && bufferDurationForPlaying_ > 0) {
809         flvLiveCond_.notify_all();
810     }
811 }
812 
SelectBitRate(uint32_t bitRate,bool isAutoSelect)813 int32_t HiPlayerImpl::SelectBitRate(uint32_t bitRate, bool isAutoSelect)
814 {
815     MEDIA_LOG_D("HiPlayerImpl:: Select BitRate %{public}d", bitRate);
816     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr,
817         MSERR_INVALID_OPERATION, "SelectBitRate failed, demuxer_ is null");
818     Status ret = demuxer_->SelectBitRate(bitRate, isAutoSelect);
819     if (ret == Status::OK) {
820         Format bitRateFormat;
821         callbackLooper_.OnInfo(INFO_TYPE_BITRATEDONE, bitRate, bitRateFormat);
822         MEDIA_LOG_I("SelectBitRate success");
823         return MSERR_OK;
824     }
825     MEDIA_LOG_I("SelectBitRate failed");
826     return MSERR_INVALID_OPERATION;
827 }
828 
DoInitializeForHttp()829 void HiPlayerImpl::DoInitializeForHttp()
830 {
831     if (!isNetWorkPlay_) {
832         MEDIA_LOG_E("DoInitializeForHttp failed, not network play");
833         return;
834     }
835     std::vector<uint32_t> vBitRates;
836     MEDIA_LOG_D_SHORT("DoInitializeForHttp");
837     auto ret = demuxer_->GetBitRates(vBitRates);
838     if (ret == Status::OK && vBitRates.size() > 0) {
839         int mSize = static_cast<int>(vBitRates.size());
840         const int size = mSize;
841         uint32_t* bitrates = vBitRates.data();
842         Format bitRateFormat;
843         (void)bitRateFormat.PutBuffer(std::string(PlayerKeys::PLAYER_AVAILABLE_BITRATES),
844             static_cast<uint8_t *>(static_cast<void *>(bitrates)), size * sizeof(uint32_t));
845         callbackLooper_.OnInfo(INFO_TYPE_BITRATE_COLLECT, 0, bitRateFormat);
846         MEDIA_LOG_I("OnInfo INFO_TYPE_BITRATE_COLLEC");
847     } else {
848         MEDIA_LOG_D("GetBitRates failed, ret %{public}d", ret);
849     }
850 }
851 
Play()852 int32_t HiPlayerImpl::Play()
853 {
854     MediaTrace trace("HiPlayerImpl::Play");
855     MEDIA_LOG_I("Play entered.");
856     startTime_ = GetCurrentMillisecond();
857     playStartTime_ = GetCurrentMillisecond();
858     eosInLoopForFrozen_ = false;
859     int32_t ret = MSERR_INVALID_VAL;
860     if (!IsValidPlayRange(playRangeStartTime_, playRangeEndTime_)) {
861         MEDIA_LOG_E("SetPlayRange failed! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
862                     playRangeStartTime_, playRangeEndTime_);
863         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
864         return TransStatus(Status::ERROR_INVALID_OPERATION);
865     }
866     ApplyAudioHapticsSyncId();
867     if (pipelineStates_ == PlayerStates::PLAYER_PLAYBACK_COMPLETE || pipelineStates_ == PlayerStates::PLAYER_STOPPED) {
868         isStreaming_ = true;
869         ret = ((GetPlayRangeStartTime() > PLAY_RANGE_DEFAULT_VALUE) ?
870             TransStatus(Seek(GetPlayStartTime(), playRangeSeekMode_, false)) :
871             TransStatus(Seek(0, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false)));
872         callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
873         callbackLooper_.StartCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
874     } else if (pipelineStates_ == PlayerStates::PLAYER_PAUSED) {
875         DoPausedPlay(ret);
876     } else {
877         if (playRangeStartTime_ > PLAY_RANGE_DEFAULT_VALUE) {
878             ret = TransStatus(Seek(playRangeStartTime_, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false));
879         }
880         callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
881         callbackLooper_.StartCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
882         syncManager_->Resume();
883         ret = TransStatus(pipeline_->Start());
884         if (ret != MSERR_OK) {
885             UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
886         }
887     }
888     StartFlvCheckLiveDelayTime();
889     if (ret == MSERR_OK) {
890         if (!isInitialPlay_) {
891             OnStateChanged(PlayerStateId::PLAYING);
892         } else {
893             MEDIA_LOG_D_SHORT("InitialPlay, pending to change state of playing");
894         }
895     } else {
896         CollectionErrorInfo(ret, "Play failed");
897     }
898     return ret;
899 }
900 
DoPausedPlay(int32_t & ret)901 void HiPlayerImpl::DoPausedPlay(int32_t &ret)
902 {
903     if (playRangeStartTime_ > PLAY_RANGE_DEFAULT_VALUE) {
904         ret = TransStatus(Seek(playRangeStartTime_, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false));
905     }
906     callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
907     callbackLooper_.StartCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
908     ret = TransStatus(Resume());
909     return;
910 }
911 
Pause(bool isSystemOperation)912 int32_t HiPlayerImpl::Pause(bool isSystemOperation)
913 {
914     MediaTrace trace("HiPlayerImpl::Pause");
915     MEDIA_LOG_I("Pause in");
916     FALSE_RETURN_V_MSG_E(pipelineStates_ != PlayerStates::PLAYER_PLAYBACK_COMPLETE,
917         TransStatus(Status::OK), "completed not allow pause");
918     Status ret = Status::OK;
919     ret = pipeline_->Pause();
920     syncManager_->Pause();
921     if (ret != Status::OK) {
922         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
923     }
924     if (videoDecoder_ != nullptr) {
925         videoDecoder_->NotifyPause();
926     }
927     callbackLooper_.StopReportMediaProgress();
928     StopFlvCheckLiveDelayTime();
929     callbackLooper_.StopCollectMaxAmplitude();
930     callbackLooper_.ManualReportMediaProgressOnce();
931     {
932         AutoLock lock(interruptMutex_);
933         OnStateChanged(PlayerStateId::PAUSE, isSystemOperation);
934         if (isSystemOperation) {
935             ReportAudioInterruptEvent();
936         }
937     }
938     UpdatePlayTotalDuration();
939     return TransStatus(ret);
940 }
941 
Freeze(bool & isNoNeedToFreeze)942 int32_t HiPlayerImpl::Freeze(bool &isNoNeedToFreeze)
943 {
944     MediaTrace trace("HiPlayerImpl::Freeze");
945     MEDIA_LOG_I("Freeze in");
946     std::unique_lock<std::mutex> lock(freezeMutex_);
947 
948     if (pipelineStates_ != PlayerStates::PLAYER_STARTED && pipelineStates_ != PlayerStates::PLAYER_PREPARED) {
949         MEDIA_LOG_I("can not freeze, current state = %{public}d", static_cast<int32_t>(pipelineStates_));
950         PauseSourceDownload();
951         return TransStatus(Status::OK);
952     }
953 
954     if (eosInLoopForFrozen_ || pipelineStates_ == PlayerStates::PLAYER_PREPARED) {
955         MEDIA_LOG_I("can not freeze in loop mode, current state = %{public}d", static_cast<int32_t>(pipelineStates_));
956         isNoNeedToFreeze = true;
957         eosInLoopForFrozen_ = false;
958         return TransStatus(Status::OK);
959     }
960 
961     callbackLooper_.StopReportMediaProgress();
962     StopFlvCheckLiveDelayTime();
963     callbackLooper_.StopCollectMaxAmplitude();
964     Status ret = Status::OK;
965     ret = demuxer_->Freeze();
966     syncManager_->Pause();
967     PauseSourceDownload();
968     if (audioSink_ != nullptr) {
969         audioSink_->FreezeAudioSink();
970     }
971 
972     if (ret != Status::OK) {
973         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
974         return TransStatus(ret);
975     }
976     UpdateStateNoLock(PlayerStates::PLAYER_FROZEN, false, false);
977     return TransStatus(Status::OK);
978 }
979 
UnFreeze()980 int32_t HiPlayerImpl::UnFreeze()
981 {
982     MediaTrace trace("HiPlayerImpl::UnFreeze");
983     MEDIA_LOG_I("UnFreeze in");
984     std::unique_lock<std::mutex> lock(freezeMutex_);
985 
986     if (pipelineStates_ != PlayerStates::PLAYER_FROZEN) {
987         MEDIA_LOG_I("can not unfreeze, current state = %{public}d", static_cast<int32_t>(pipelineStates_));
988         if (audioSink_ != nullptr) {
989             audioSink_->UnFreezeAudioSink();
990         }
991         if (isForzenSeekRecv_) {
992             pipeline_ -> Flush();
993         }
994         isForzenSeekRecv_ = false;
995         return TransStatus(Status::OK);
996     }
997     if (isForzenSeekRecv_) {
998         Seek(frozenSeekTime_, frozenSeekMode_, true, true);
999         isForzenSeekRecv_ = false;
1000     }
1001 
1002     if (audioSink_ != nullptr) {
1003         audioSink_->UnFreezeAudioSink();
1004     }
1005 
1006     callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
1007     callbackLooper_.StartCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
1008     Status ret = Status::OK;
1009     syncManager_->Resume();
1010     ret = demuxer_->UnFreeze();
1011     startTime_ = GetCurrentMillisecond();
1012     StartFlvCheckLiveDelayTime();
1013     if (ret != Status::OK) {
1014         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
1015         return TransStatus(ret);
1016     }
1017     UpdateStateNoLock(PlayerStates::PLAYER_STARTED, false, false);
1018     return TransStatus(ret);
1019 }
1020 
PauseSourceDownload()1021 int32_t HiPlayerImpl::PauseSourceDownload()
1022 {
1023     FALSE_RETURN_V_NOLOG(!isDownloadPaused_, MSERR_OK);
1024     demuxer_->StopBufferring(true);
1025     isDownloadPaused_ = true;
1026     return MSERR_OK;
1027 }
1028 
ResumeSourceDownload()1029 int32_t HiPlayerImpl::ResumeSourceDownload()
1030 {
1031     FALSE_RETURN_V_NOLOG(isDownloadPaused_, MSERR_OK);
1032     demuxer_->StopBufferring(false);
1033     isDownloadPaused_ = false;
1034     return MSERR_OK;
1035 }
1036 
ReportAudioInterruptEvent()1037 void HiPlayerImpl::ReportAudioInterruptEvent()
1038 {
1039     isHintPauseReceived_ = false;
1040     if (!interruptNotifyPlay_.load()) {
1041         isSaveInterruptEventNeeded_.store(false);
1042         return;
1043     }
1044     MEDIA_LOG_I("alreay receive an interrupt end event");
1045     interruptNotifyPlay_.store(false);
1046     Format format;
1047     int32_t hintType = interruptEvent_.hintType;
1048     int32_t forceType = interruptEvent_.forceType;
1049     int32_t eventType = interruptEvent_.eventType;
1050     (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_TYPE, eventType);
1051     (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_FORCE, forceType);
1052     (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_HINT, hintType);
1053     callbackLooper_.OnInfo(INFO_TYPE_INTERRUPT_EVENT, hintType, format);
1054 }
1055 
PauseDemuxer()1056 int32_t HiPlayerImpl::PauseDemuxer()
1057 {
1058     MediaTrace trace("HiPlayerImpl::PauseDemuxer");
1059     MEDIA_LOG_I("PauseDemuxer in");
1060     callbackLooper_.StopReportMediaProgress();
1061     callbackLooper_.StopCollectMaxAmplitude();
1062     StopFlvCheckLiveDelayTime();
1063     syncManager_->Pause();
1064     Status ret = demuxer_->PauseDemuxerReadLoop();
1065     return TransStatus(ret);
1066 }
1067 
ResumeDemuxer()1068 int32_t HiPlayerImpl::ResumeDemuxer()
1069 {
1070     MediaTrace trace("HiPlayerImpl::ResumeDemuxer");
1071     MEDIA_LOG_I("ResumeDemuxer in");
1072     FALSE_RETURN_V_MSG_E(pipelineStates_ != PlayerStates::PLAYER_STATE_ERROR,
1073         TransStatus(Status::OK), "PLAYER_STATE_ERROR not allow ResumeDemuxer");
1074     callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
1075     StartFlvCheckLiveDelayTime();
1076     callbackLooper_.StartCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
1077     syncManager_->Resume();
1078     Status ret = demuxer_->ResumeDemuxerReadLoop();
1079     return TransStatus(ret);
1080 }
1081 
GetCurrentMillisecond()1082 int64_t HiPlayerImpl::GetCurrentMillisecond()
1083 {
1084     auto duration = std::chrono::steady_clock::now().time_since_epoch();
1085     return std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
1086 }
1087 
Stop()1088 int32_t HiPlayerImpl::Stop()
1089 {
1090     MediaTrace trace("HiPlayerImpl::Stop");
1091     MEDIA_LOG_I("Stop entered.");
1092 
1093     AutoLock lock(handleCompleteMutex_);
1094     UpdatePlayStatistics();
1095     callbackLooper_.StopReportMediaProgress();
1096     StopFlvCheckLiveDelayTime();
1097     callbackLooper_.StopCollectMaxAmplitude();
1098     if (draggingPlayerAgent_ != nullptr) {
1099         draggingPlayerAgent_->Release();
1100         draggingPlayerAgent_ = nullptr;
1101     }
1102 
1103     // close demuxer first to avoid concurrent problem
1104     auto ret = Status::ERROR_UNKNOWN;
1105     if (pipeline_ != nullptr) {
1106         ret = pipeline_->Stop();
1107     }
1108     syncManager_->Stop();
1109     if (audioDecoder_ != nullptr) {
1110         audioDecoder_->Flush();
1111     }
1112     #ifdef SUPPORT_VIDEO
1113         if (videoDecoder_) {
1114             videoDecoder_->Stop();
1115             videoDecoder_->Flush();
1116         }
1117     #endif
1118     if (audioSink_ != nullptr) {
1119         audioSink_->Flush();
1120     }
1121     if (subtitleSink_ != nullptr) {
1122         subtitleSink_->Flush();
1123     }
1124     for (std::pair<std::string, bool>& item: completeState_) {
1125         item.second = false;
1126     }
1127 
1128     ResetPlayRangeParameter();
1129     if (pipelineStates_ != PlayerStates::PLAYER_PREPARED) {
1130         AppendPlayerMediaInfo();
1131     }
1132     OnStateChanged(PlayerStateId::STOPPED);
1133     ReportMediaInfo(instanceId_);
1134     GetMediaInfoContainInstanceNum();
1135     return TransStatus(ret);
1136 }
1137 
ResetPlayRangeParameter()1138 void HiPlayerImpl::ResetPlayRangeParameter()
1139 {
1140     playRangeStartTime_ = PLAY_RANGE_DEFAULT_VALUE;
1141     playRangeEndTime_ = PLAY_RANGE_DEFAULT_VALUE;
1142     startTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
1143     endTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
1144     isSetPlayRange_ = false;
1145     playRangeSeekMode_ = PlayerSeekMode::SEEK_PREVIOUS_SYNC;
1146 }
1147 
UpdatePlayStatistics()1148 void HiPlayerImpl::UpdatePlayStatistics()
1149 {
1150     MEDIA_LOG_D_SHORT("HiPlayerImpl UpdatePlayStatistics");
1151     playStatisticalInfo_.isDrmProtected = isDrmProtected_;
1152     if (demuxer_ != nullptr) {
1153         DownloadInfo downLoadInfo;
1154         auto ret = demuxer_->GetDownloadInfo(downLoadInfo);
1155         if (ret == Status::OK) {
1156             MEDIA_LOG_D_SHORT("GetDownloadInfo success");
1157             playStatisticalInfo_.avgDownloadRate = downLoadInfo.avgDownloadRate;
1158             playStatisticalInfo_.avgDownloadSpeed = downLoadInfo.avgDownloadSpeed;
1159             playStatisticalInfo_.totalDownLoadBits = downLoadInfo.totalDownLoadBits;
1160             playStatisticalInfo_.isTimeOut = downLoadInfo.isTimeOut;
1161         } else {
1162             MEDIA_LOG_E("GetDownloadInfo failed with error " PUBLIC_LOG_D32, ret);
1163         }
1164     } else {
1165         MEDIA_LOG_E("GetDownloadInfo failed demuxer is null");
1166     }
1167     if (videoDecoder_ != nullptr) {
1168         auto ret = videoDecoder_->GetLagInfo(playStatisticalInfo_.lagTimes, playStatisticalInfo_.maxLagDuration,
1169             playStatisticalInfo_.avgLagDuration);
1170         if (ret == Status::OK) {
1171             MEDIA_LOG_I("GetLagInfo success");
1172         } else {
1173             MEDIA_LOG_E("GetLagInfo failed with error " PUBLIC_LOG_D32, ret);
1174         }
1175     } else {
1176         MEDIA_LOG_E("GetLagInfo failed videoDecoder is null error");
1177     }
1178 }
1179 
IsStatisticalInfoValid()1180 inline bool HiPlayerImpl::IsStatisticalInfoValid()
1181 {
1182     return playStatisticalInfo_.playDuration >= 0 && playStatisticalInfo_.startLatency >= 0;
1183 }
1184 
UpdatePlayTotalDuration()1185 void HiPlayerImpl::UpdatePlayTotalDuration()
1186 {
1187     int64_t startTime = startTime_.load();
1188     FALSE_RETURN_NOLOG(startTime != -1);
1189     startTime_ = -1;
1190     playTotalDuration_ += GetCurrentMillisecond() - startTime;
1191 }
1192 
AppendPlayerMediaInfo()1193 void HiPlayerImpl::AppendPlayerMediaInfo()
1194 {
1195     MEDIA_LOG_D_SHORT("AppendPlayerMediaInfo entered.");
1196     UpdatePlayTotalDuration();
1197     playStatisticalInfo_.playDuration = static_cast<int32_t>(playTotalDuration_);
1198     playStatisticalInfo_.maxSeekLatency = static_cast<int32_t>(maxSeekLatency_);
1199     playStatisticalInfo_.maxAccurateSeekLatency = static_cast<int32_t>(maxAccurateSeekLatency_);
1200     playStatisticalInfo_.maxSurfaceSwapLatency = static_cast<int32_t>(maxSurfaceSwapLatency_);
1201     playStatisticalInfo_.containerMime = playStatisticalInfo_.videoMime + " : " + playStatisticalInfo_.audioMime;
1202     FALSE_RETURN_MSG(IsStatisticalInfoValid(), "statistical info is invalid, don't report to bigdata");
1203 
1204     std::shared_ptr<Meta> meta = std::make_shared<Meta>();
1205     meta->SetData(Tag::AV_PLAYER_ERR_CODE, playStatisticalInfo_.errCode);
1206     meta->SetData(Tag::AV_PLAYER_ERR_MSG, playStatisticalInfo_.errMsg);
1207     meta->SetData(Tag::AV_PLAYER_PLAY_DURATION, playStatisticalInfo_.playDuration);
1208     meta->SetData(Tag::AV_PLAYER_SOURCE_TYPE, playStatisticalInfo_.sourceType);
1209     meta->SetData(Tag::MEDIA_FILE_URI, playStatisticalInfo_.sourceUrl);
1210     meta->SetData(Tag::AV_PLAYER_AVG_DOWNLOAD_RATE, playStatisticalInfo_.avgDownloadRate);
1211     meta->SetData(Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED, playStatisticalInfo_.avgDownloadSpeed);
1212     meta->SetData(Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, playStatisticalInfo_.totalDownLoadBits);
1213     meta->SetData(Tag::AV_PLAYER_DOWNLOAD_TIME_OUT, playStatisticalInfo_.isTimeOut);
1214     meta->SetData(Tag::AV_PLAYER_CONTAINER_MIME, playStatisticalInfo_.containerMime);
1215     meta->SetData(Tag::AV_PLAYER_VIDEO_MIME, playStatisticalInfo_.videoMime);
1216     meta->SetData(Tag::AV_PLAYER_VIDEO_RESOLUTION, playStatisticalInfo_.videoResolution);
1217     meta->SetData(Tag::AV_PLAYER_VIDEO_BITRATE, playStatisticalInfo_.videoBitrate);
1218     meta->SetData(Tag::AV_PLAYER_VIDEO_FRAMERATE, playStatisticalInfo_.videoFrameRate);
1219     meta->SetData(Tag::AV_PLAYER_HDR_TYPE, playStatisticalInfo_.hdrType);
1220     meta->SetData(Tag::AV_PLAYER_AUDIO_MIME, playStatisticalInfo_.audioMime);
1221     meta->SetData(Tag::AUDIO_SAMPLE_RATE, playStatisticalInfo_.audioSampleRate);
1222     meta->SetData(Tag::AUDIO_CHANNEL_COUNT, playStatisticalInfo_.audioChannelCount);
1223     meta->SetData(Tag::AV_PLAYER_AUDIO_BITRATE, playStatisticalInfo_.audioBitrate);
1224     meta->SetData(Tag::AV_PLAYER_IS_DRM_PROTECTED, playStatisticalInfo_.isDrmProtected);
1225     meta->SetData(Tag::AV_PLAYER_START_LATENCY, playStatisticalInfo_.startLatency);
1226     meta->SetData(Tag::AV_PLAYER_MAX_SEEK_LATENCY, playStatisticalInfo_.maxSeekLatency);
1227     meta->SetData(Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY, playStatisticalInfo_.maxAccurateSeekLatency);
1228     meta->SetData(Tag::AV_PLAYER_LAG_TIMES, playStatisticalInfo_.lagTimes);
1229     meta->SetData(Tag::AV_PLAYER_MAX_LAG_DURATION, playStatisticalInfo_.maxLagDuration);
1230     meta->SetData(Tag::AV_PLAYER_AVG_LAG_DURATION, playStatisticalInfo_.avgLagDuration);
1231     meta->SetData(Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, playStatisticalInfo_.maxSurfaceSwapLatency);
1232     AppendMediaInfo(meta, instanceId_);
1233 }
1234 
Reset()1235 int32_t HiPlayerImpl::Reset()
1236 {
1237     MediaTrace trace("HiPlayerImpl::Reset");
1238     if (pipelineStates_ == PlayerStates::PLAYER_STOPPED) {
1239         return TransStatus(Status::OK);
1240     }
1241     singleLoop_ = false;
1242     auto ret = Stop();
1243     if (syncManager_ != nullptr) {
1244         syncManager_->ResetMediaStartPts();
1245         syncManager_->Reset();
1246     }
1247     if (dfxAgent_ != nullptr) {
1248         dfxAgent_->SetSourceType(PlayerDfxSourceType::DFX_SOURCE_TYPE_UNKNOWN);
1249         dfxAgent_->ResetAgent();
1250     }
1251     OnStateChanged(PlayerStateId::STOPPED);
1252     return ret;
1253 }
1254 
SeekToCurrentTime(int32_t mSeconds,PlayerSeekMode mode)1255 int32_t HiPlayerImpl::SeekToCurrentTime(int32_t mSeconds, PlayerSeekMode mode)
1256 {
1257     MEDIA_LOG_I("SeekToCurrentTime in. mSeconds : " PUBLIC_LOG_D32 ", seekMode : " PUBLIC_LOG_D32,
1258                 mSeconds, static_cast<int32_t>(mode));
1259     return Seek(mSeconds, mode);
1260 }
1261 
Seek(int64_t mSeconds,PlayerSeekMode mode,bool notifySeekDone,bool isUnFreezeSeek)1262 Status HiPlayerImpl::Seek(int64_t mSeconds, PlayerSeekMode mode, bool notifySeekDone, bool isUnFreezeSeek)
1263 {
1264     MediaTrace trace("HiPlayerImpl::Seek");
1265     MEDIA_LOG_I("Seek entered. mSeconds : " PUBLIC_LOG_D64 ", seekMode : " PUBLIC_LOG_D32,
1266                 mSeconds, static_cast<int32_t>(mode));
1267     int64_t seekStartTime = GetCurrentMillisecond();
1268     if (audioSink_ != nullptr) {
1269         audioSink_->SetIsTransitent(true);
1270     }
1271     FALSE_RETURN_V_MSG_E(durationMs_.load() > 0, Status::ERROR_INVALID_PARAMETER,
1272         "Seek, invalid operation, source is unseekable or invalid");
1273     isSeek_ = true;
1274     int64_t seekPos = std::max(static_cast<int64_t>(0), std::min(mSeconds, static_cast<int64_t>(durationMs_.load())));
1275     auto rtv = seekPos >= 0 ? Status::OK : Status::ERROR_INVALID_PARAMETER;
1276     if (rtv == Status::OK) {
1277         rtv = HandleSeek(seekPos, mode, isUnFreezeSeek);
1278     }
1279     NotifySeek(rtv, notifySeekDone, seekPos);
1280     if (audioSink_ != nullptr) {
1281         audioSink_->SetIsTransitent(false);
1282     }
1283     isSeek_ = false;
1284     UpdateMaxSeekLatency(mode, seekStartTime);
1285     return rtv;
1286 }
1287 
HandleSeek(int64_t seekPos,PlayerSeekMode mode,bool isUnFreezeSeek)1288 Status HiPlayerImpl::HandleSeek(int64_t seekPos, PlayerSeekMode mode, bool isUnFreezeSeek)
1289 {
1290     switch (pipelineStates_) {
1291         case PlayerStates::PLAYER_STARTED: {
1292             return doStartedSeek(seekPos, mode);
1293         }
1294         case PlayerStates::PLAYER_PAUSED: {
1295             return doPausedSeek(seekPos, mode);
1296         }
1297         case PlayerStates::PLAYER_PLAYBACK_COMPLETE: {
1298             return doCompletedSeek(seekPos, mode);
1299         }
1300         case PlayerStates::PLAYER_PREPARED: {
1301             return doPreparedSeek(seekPos, mode);
1302         }
1303         case PlayerStates::PLAYER_FROZEN: {
1304             return doFrozenSeek(seekPos, mode, isUnFreezeSeek);
1305         }
1306         default:
1307             MEDIA_LOG_I_SHORT("Seek in error pipelineStates: " PUBLIC_LOG_D32,
1308                 static_cast<int32_t>(pipelineStates_));
1309             return Status::ERROR_WRONG_STATE;
1310     }
1311 }
1312 
UpdateMaxSeekLatency(PlayerSeekMode mode,int64_t seekStartTime)1313 void HiPlayerImpl::UpdateMaxSeekLatency(PlayerSeekMode mode, int64_t seekStartTime)
1314 {
1315     int64_t seekDiffTime = GetCurrentMillisecond() - seekStartTime;
1316     if (mode == PlayerSeekMode::SEEK_CLOSEST) {
1317         maxAccurateSeekLatency_ = (maxAccurateSeekLatency_ > seekDiffTime) ? maxAccurateSeekLatency_ : seekDiffTime;
1318     } else {
1319         maxSeekLatency_ = (maxSeekLatency_ > seekDiffTime) ? maxSeekLatency_ : seekDiffTime;
1320     }
1321 }
1322 
NotifySeek(Status rtv,bool flag,int64_t seekPos)1323 void HiPlayerImpl::NotifySeek(Status rtv, bool flag, int64_t seekPos)
1324 {
1325     if (rtv != Status::OK) {
1326         MEDIA_LOG_E("Seek done, seek error");
1327         FALSE_RETURN_MSG(!isInterruptNeeded_.load(), " Seek is Interrupted");
1328         // change player state to PLAYER_STATE_ERROR when seek error.
1329         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
1330         Format format;
1331         callbackLooper_.OnError(PLAYER_ERROR, MSERR_DATA_SOURCE_IO_ERROR);
1332         callbackLooper_.OnInfo(INFO_TYPE_SEEKDONE, -1, format);
1333     }  else if (flag) {
1334         // only notify seekDone for external call.
1335         NotifySeekDone(seekPos);
1336     }
1337 }
1338 
Seek(int32_t mSeconds,PlayerSeekMode mode)1339 int32_t HiPlayerImpl::Seek(int32_t mSeconds, PlayerSeekMode mode)
1340 {
1341     MediaTrace trace("HiPlayerImpl::Seek.");
1342     if (IsInValidSeekTime(mSeconds)) {
1343         MEDIA_LOG_E("Current seek time is not at playRange");
1344         auto errCode = TransStatus(Status::ERROR_INVALID_PARAMETER);
1345         OnEvent({"engine", EventType::EVENT_ERROR, errCode});
1346         return errCode;
1347     }
1348     MEDIA_LOG_I("Seek.");
1349     return TransStatus(Seek(mSeconds, mode, true));
1350 }
1351 
doPreparedSeek(int64_t seekPos,PlayerSeekMode mode)1352 Status HiPlayerImpl::doPreparedSeek(int64_t seekPos, PlayerSeekMode mode)
1353 {
1354     MEDIA_LOG_I("doPreparedSeek.");
1355     pipeline_ -> Flush();
1356     auto rtv = doSeek(seekPos, mode);
1357     if ((rtv == Status::OK) && demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
1358         rtv = pipeline_->Preroll(true);
1359     }
1360     return rtv;
1361 }
1362 
doStartedSeek(int64_t seekPos,PlayerSeekMode mode)1363 Status HiPlayerImpl::doStartedSeek(int64_t seekPos, PlayerSeekMode mode)
1364 {
1365     MEDIA_LOG_I("doStartedSeek");
1366     pipeline_ -> Pause();
1367     pipeline_ -> Flush();
1368     auto rtv = doSeek(seekPos, mode);
1369     pipeline_ -> Resume();
1370     inEosSeek_ = false;
1371     return rtv;
1372 }
1373 
doPausedSeek(int64_t seekPos,PlayerSeekMode mode)1374 Status HiPlayerImpl::doPausedSeek(int64_t seekPos, PlayerSeekMode mode)
1375 {
1376     MEDIA_LOG_I("doPausedSeek.");
1377     pipeline_ -> Pause();
1378     pipeline_ -> Flush();
1379     auto rtv = doSeek(seekPos, mode);
1380     inEosSeek_ = false;
1381     if ((rtv == Status::OK) && demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
1382         rtv = pipeline_->Preroll(true);
1383     }
1384     return rtv;
1385 }
1386 
doFrozenSeek(int64_t seekPos,PlayerSeekMode mode,bool isUnFreezeSeek)1387 Status HiPlayerImpl::doFrozenSeek(int64_t seekPos, PlayerSeekMode mode, bool isUnFreezeSeek)
1388 {
1389     MEDIA_LOG_I("doFrozenSeek. isUnFreezeSeek = %{public}d", isUnFreezeSeek);
1390     if (isUnFreezeSeek) {
1391         pipeline_ -> Flush();
1392         auto rtv = doSeek(seekPos, mode);
1393         inEosSeek_ = false;
1394         return rtv;
1395     } else {
1396         isForzenSeekRecv_ = true;
1397         frozenSeekTime_ = seekPos;
1398         frozenSeekMode_ = mode;
1399         return Status::OK;
1400     }
1401 }
1402 
SetEosInLoopForFrozen(bool status)1403 void HiPlayerImpl::SetEosInLoopForFrozen(bool status)
1404 {
1405     eosInLoopForFrozen_ = status;
1406 }
1407 
doCompletedSeek(int64_t seekPos,PlayerSeekMode mode)1408 Status HiPlayerImpl::doCompletedSeek(int64_t seekPos, PlayerSeekMode mode)
1409 {
1410     MEDIA_LOG_D("doCompletedSeek");
1411     pipeline_ -> Flush();
1412     auto rtv = doSeek(seekPos, mode);
1413     if (mode != SEEK_CLOSEST && audioSink_ != nullptr) {
1414         audioSink_->SetSeekTime(0);
1415     }
1416     if (isStreaming_) {
1417         MEDIA_LOG_D("doCompletedSeek isStreaming_ is true");
1418         pipeline_->Resume();
1419         syncManager_->Resume();
1420     } else {
1421         if ((rtv == Status::OK) && demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
1422             rtv = pipeline_->Preroll(true);
1423         }
1424         isDoCompletedSeek_ = true;
1425         callbackLooper_.StopReportMediaProgress();
1426         callbackLooper_.StopCollectMaxAmplitude();
1427         callbackLooper_.ManualReportMediaProgressOnce();
1428         OnStateChanged(PlayerStateId::PAUSE);
1429     }
1430     return rtv;
1431 }
1432 
doSetPlaybackSpeed(float speed)1433 Status HiPlayerImpl::doSetPlaybackSpeed(float speed)
1434 {
1435     MEDIA_LOG_I("doSetPlaybackSpeed %{public}f", speed);
1436     Status res = Status::OK;
1437     if (audioSink_ != nullptr) {
1438         res = audioSink_->SetSpeed(speed);
1439     }
1440     if (subtitleSink_ != nullptr) {
1441         res = subtitleSink_->SetSpeed(speed);
1442     }
1443     if (res != Status::OK) {
1444         MEDIA_LOG_E("doSetPlaybackSpeed audioSink set speed  error");
1445         return res;
1446     }
1447     if (videoDecoder_ != nullptr) {
1448         res = videoDecoder_->SetSpeed(speed);
1449     }
1450     if (syncManager_ != nullptr) {
1451         res = syncManager_->SetPlaybackRate(speed);
1452     }
1453     if (res != Status::OK) {
1454         MEDIA_LOG_E("doSetPlaybackSpeed syncManager set audio speed error");
1455         return res;
1456     }
1457     if (demuxer_ != nullptr) {
1458         demuxer_->SetSpeed(speed);
1459     }
1460     return Status::OK;
1461 }
1462 
NeedSeekClosest()1463 bool HiPlayerImpl::NeedSeekClosest()
1464 {
1465     MEDIA_LOG_D("NeedSeekClosest begin");
1466     std::vector<Format> trackInfo;
1467     GetAudioTrackInfo(trackInfo);
1468     if (trackInfo.size() == 0) {
1469         MEDIA_LOG_D("NeedSeekClosest end true");
1470         return true;
1471     }
1472     for (size_t i = 0; i < trackInfo.size(); i++) {
1473         int32_t trackIndex = -1;
1474         trackInfo[i].GetIntValue("track_index", trackIndex);
1475         if (trackIndex != currentAudioTrackId_) {
1476             continue;
1477         }
1478         std::string mime = "";
1479         trackInfo[i].GetStringValue("codec_mime", mime);
1480         if (mime == "audio/x-ape") {
1481             MEDIA_LOG_D("NeedSeekClosest end false");
1482             return false;
1483         }
1484     }
1485     MEDIA_LOG_D("NeedSeekClosest end true");
1486     return true;
1487 }
1488 
doSeek(int64_t seekPos,PlayerSeekMode mode)1489 Status HiPlayerImpl::doSeek(int64_t seekPos, PlayerSeekMode mode)
1490 {
1491     MEDIA_LOG_D("doSeek");
1492     int64_t seekTimeUs = 0;
1493     FALSE_RETURN_V_MSG_E(Plugins::Us2HstTime(seekPos, seekTimeUs),
1494         Status::ERROR_INVALID_PARAMETER, "Invalid seekPos: %{public}" PRId64, seekPos);
1495     if (mode == PlayerSeekMode::SEEK_CLOSEST && NeedSeekClosest()) {
1496         return HandleSeekClosest(seekPos, seekTimeUs);
1497     }
1498     if (mode == PlayerSeekMode::SEEK_CLOSEST) {   // reset mode
1499         mode = PlayerSeekMode::SEEK_NEXT_SYNC;
1500         if (audioSink_) {
1501             audioSink_->SetSeekTime(seekTimeUs);
1502         }
1503     }
1504     if (videoDecoder_ != nullptr) {
1505         videoDecoder_->SetSeekTime(seekTimeUs + mediaStartPts_, mode);
1506         videoDecoder_->ResetSeekInfo();
1507     }
1508     int64_t realSeekTime = seekPos;
1509     auto seekMode = Transform2SeekMode(mode);
1510     auto rtv = demuxer_->SeekTo(seekPos, seekMode, realSeekTime);
1511     // if it has no next key frames, seek previous.
1512     if (rtv != Status::OK && mode == PlayerSeekMode::SEEK_NEXT_SYNC) {
1513         seekMode = Transform2SeekMode(PlayerSeekMode::SEEK_PREVIOUS_SYNC);
1514         rtv = demuxer_->SeekTo(seekPos, seekMode, realSeekTime);
1515     }
1516     if (rtv == Status::OK) {
1517         syncManager_->Seek(seekTimeUs);
1518         if (subtitleSink_ != nullptr) {
1519             subtitleSink_->NotifySeek();
1520         }
1521     }
1522     return rtv;
1523 }
1524 
HandleSeekClosest(int64_t seekPos,int64_t seekTimeUs)1525 Status HiPlayerImpl::HandleSeekClosest(int64_t seekPos, int64_t seekTimeUs)
1526 {
1527     MEDIA_LOG_I_SHORT("doSeek SEEK_CLOSEST");
1528     isSeekClosest_.store(true);
1529     if (videoDecoder_ != nullptr) {
1530         videoDecoder_->SetSeekTime(seekTimeUs + mediaStartPts_, PlayerSeekMode::SEEK_CLOSEST);
1531     }
1532     if (audioSink_ != nullptr) {
1533         audioSink_->SetIsCancelStart(true);
1534     }
1535     seekAgent_ = std::make_shared<SeekAgent>(demuxer_, mediaStartPts_);
1536     interruptMonitor_->RegisterListener(seekAgent_);
1537     FALSE_RETURN_V(!isInterruptNeeded_, Status::OK);
1538     SetFrameRateForSeekPerformance(FRAME_RATE_FOR_SEEK_PERFORMANCE);
1539     bool timeout = false;
1540     auto res = seekAgent_->Seek(seekPos, timeout);
1541     SetFrameRateForSeekPerformance(FRAME_RATE_DEFAULT);
1542     MEDIA_LOG_I_SHORT("seekAgent_ Seek end");
1543     if (res != Status::OK) {
1544         MEDIA_LOG_E_SHORT("Seek closest failed");
1545     } else {
1546         syncManager_->Seek(seekTimeUs, true);
1547         if (timeout && videoDecoder_ != nullptr) {
1548             videoDecoder_->ResetSeekInfo();
1549         }
1550     }
1551     if (audioSink_ != nullptr) {
1552         audioSink_->SetIsCancelStart(false);
1553     }
1554     if (subtitleSink_ != nullptr) {
1555         subtitleSink_->NotifySeek();
1556     }
1557     interruptMonitor_->DeregisterListener(seekAgent_);
1558     seekAgent_.reset();
1559     return res;
1560 }
1561 
SetVolumeMode(int32_t mode)1562 int32_t HiPlayerImpl::SetVolumeMode(int32_t mode)
1563 {
1564     MEDIA_LOG_D("SetVolumeMode in mode = %{public}d", mode);
1565     volumeMode_ = mode;
1566     Status ret = Status::OK;
1567     if (audioSink_ != nullptr) {
1568         ret = audioSink_->SetVolumeMode(mode);
1569     }
1570     if (ret != Status::OK) {
1571         MEDIA_LOG_E("SetVolume failed with error " PUBLIC_LOG_D32, static_cast<int>(ret));
1572     }
1573     return TransStatus(ret);
1574 }
1575 
SetVolume(float leftVolume,float rightVolume)1576 int32_t HiPlayerImpl::SetVolume(float leftVolume, float rightVolume)
1577 {
1578     MEDIA_LOG_D("SetVolume in");
1579     FALSE_RETURN_V_MSG_E(!(leftVolume < 0 || leftVolume > MAX_MEDIA_VOLUME
1580         || rightVolume < 0 || rightVolume > MAX_MEDIA_VOLUME),
1581         (int32_t)Status::ERROR_INVALID_PARAMETER, "volume not valid, should be in range [0,100]");
1582     float volume = 0.0f;
1583     if (leftVolume < 1e-6 && rightVolume >= 1e-6) {  // 1e-6
1584         volume = rightVolume;
1585     } else if (rightVolume < 1e-6 && leftVolume >= 1e-6) {  // 1e-6
1586         volume = leftVolume;
1587     } else {
1588         volume = (leftVolume + rightVolume) / 2;  // 2
1589     }
1590     volume /= MAX_MEDIA_VOLUME;  // normalize to 0~1
1591     FALSE_RETURN_V_MSG_E(audioSink_ != nullptr, (int32_t)TransStatus(Status::ERROR_INVALID_OPERATION),
1592         "Set volume failed, audio sink is nullptr");
1593     MEDIA_LOG_D("Sink SetVolume");
1594     Status ret = audioSink_->SetVolume(volume);
1595     if (ret != Status::OK) {
1596         MEDIA_LOG_E("SetVolume failed with error " PUBLIC_LOG_D32, static_cast<int>(ret));
1597     }
1598     return TransStatus(ret);
1599 }
1600 
SetVideoSurface(sptr<Surface> surface)1601 int32_t HiPlayerImpl::SetVideoSurface(sptr<Surface> surface)
1602 {
1603     MEDIA_LOG_D("SetVideoSurface in");
1604 #ifdef SUPPORT_VIDEO
1605     int64_t startSetSurfaceTime = GetCurrentMillisecond();
1606     FALSE_RETURN_V_MSG_E(surface != nullptr, (int32_t)(Status::ERROR_INVALID_PARAMETER),
1607                          "Set video surface failed, surface == nullptr");
1608     surface_ = surface;
1609     if (videoDecoder_ != nullptr &&
1610         pipelineStates_ != PlayerStates::PLAYER_STOPPED &&
1611         pipelineStates_ != PlayerStates::PLAYER_STATE_ERROR) {
1612         return TransStatus(videoDecoder_->SetVideoSurface(surface));
1613     }
1614     int64_t endSetSurfaceTime = GetCurrentMillisecond();
1615     int64_t diffTime = endSetSurfaceTime - startSetSurfaceTime;
1616     maxSurfaceSwapLatency_ = maxSurfaceSwapLatency_ > diffTime ? maxSurfaceSwapLatency_ : diffTime;
1617 #endif
1618     return TransStatus(Status::OK);
1619 }
1620 
SetDecryptConfig(const sptr<OHOS::DrmStandard::IMediaKeySessionService> & keySessionProxy,bool svp)1621 int32_t HiPlayerImpl::SetDecryptConfig(const sptr<OHOS::DrmStandard::IMediaKeySessionService> &keySessionProxy,
1622     bool svp)
1623 {
1624     MEDIA_LOG_I("SetDecryptConfig in");
1625 #ifdef SUPPORT_AVPLAYER_DRM
1626     FALSE_RETURN_V_MSG_E(keySessionProxy != nullptr, (int32_t)(Status::ERROR_INVALID_PARAMETER),
1627         "SetDecryptConfig failed, keySessionProxy == nullptr");
1628     keySessionServiceProxy_ = keySessionProxy;
1629     if (svp) {
1630         svpMode_ = HiplayerSvpMode::SVP_TRUE;
1631     } else {
1632         svpMode_ = HiplayerSvpMode::SVP_FALSE;
1633     }
1634 
1635     std::unique_lock<std::mutex> drmLock(drmMutex_);
1636     MEDIA_LOG_I("For Drmcond SetDecryptConfig will trig drmPreparedCond");
1637     isDrmPrepared_ = true;
1638     drmConfigCond_.notify_all();
1639 #endif
1640     return TransStatus(Status::OK);
1641 }
1642 
SetLooping(bool loop)1643 int32_t HiPlayerImpl::SetLooping(bool loop)
1644 {
1645     MEDIA_LOG_I("SetLooping in, loop: " PUBLIC_LOG_D32, loop);
1646     singleLoop_ = loop;
1647     if (audioSink_ != nullptr) {
1648         audioSink_->SetLooping(loop);
1649     }
1650     return TransStatus(Status::OK);
1651 }
1652 
SetParameter(const Format & params)1653 int32_t HiPlayerImpl::SetParameter(const Format& params)
1654 {
1655     MediaTrace trace("HiPlayerImpl::SetParameter");
1656     if (params.ContainKey(PlayerKeys::PLAYER_AUDIO_HAPTICS_SYNC_ID)) {
1657         int32_t syncId = DEFAULT_SYNC_ID;
1658         params.GetIntValue(PlayerKeys::PLAYER_AUDIO_HAPTICS_SYNC_ID, syncId);
1659         (void)SetAudioHapticsSyncId(syncId);
1660     }
1661 #ifdef SUPPORT_VIDEO
1662     if (params.ContainKey(PlayerKeys::VIDEO_SCALE_TYPE)) {
1663         int32_t videoScaleType = 0;
1664         params.GetIntValue(PlayerKeys::VIDEO_SCALE_TYPE, videoScaleType);
1665         return SetVideoScaleType(VideoScaleType(videoScaleType));
1666     }
1667 #endif
1668     if (params.ContainKey(PlayerKeys::CONTENT_TYPE) && params.ContainKey(PlayerKeys::STREAM_USAGE)) {
1669         int32_t contentType;
1670         int32_t streamUsage;
1671         int32_t rendererFlag;
1672         int32_t volumeMode = volumeMode_;
1673         MEDIA_LOG_I("volumeMode_ = %{public}d", volumeMode_);
1674         params.GetIntValue(PlayerKeys::CONTENT_TYPE, contentType);
1675         params.GetIntValue(PlayerKeys::STREAM_USAGE, streamUsage);
1676         params.GetIntValue(PlayerKeys::RENDERER_FLAG, rendererFlag);
1677         if (params.ContainKey(PlayerKeys::VOLUME_MODE)) {
1678             params.GetIntValue(PlayerKeys::VOLUME_MODE, volumeMode);
1679         }
1680         return SetAudioRendererInfo(contentType, streamUsage, rendererFlag, volumeMode);
1681     }
1682     if (params.ContainKey(PlayerKeys::AUDIO_INTERRUPT_MODE)) {
1683         int32_t interruptMode = 0;
1684         params.GetIntValue(PlayerKeys::AUDIO_INTERRUPT_MODE, interruptMode);
1685         return SetAudioInterruptMode(interruptMode);
1686     }
1687     return TransStatus(Status::OK);
1688 }
1689 
SetObs(const std::weak_ptr<IPlayerEngineObs> & obs)1690 int32_t HiPlayerImpl::SetObs(const std::weak_ptr<IPlayerEngineObs>& obs)
1691 {
1692     MEDIA_LOG_D_SHORT("SetObs");
1693     callbackLooper_.StartWithPlayerEngineObs(obs);
1694     playerEngineObs_ = obs;
1695     return TransStatus(Status::OK);
1696 }
1697 
GetCurrentTime(int32_t & currentPositionMs)1698 int32_t HiPlayerImpl::GetCurrentTime(int32_t& currentPositionMs)
1699 {
1700     if (!isSetPlayRange_ && (curState_ == PlayerStateId::EOS || inEosSeek_)) {
1701         currentPositionMs = durationMs_.load();
1702         return TransStatus(Status::OK);
1703     }
1704     if (isSeek_.load()) {
1705         return TransStatus(Status::ERROR_UNKNOWN);
1706     }
1707     FALSE_RETURN_V(syncManager_ != nullptr, TransStatus(Status::ERROR_NULL_POINTER));
1708     currentPositionMs = Plugins::HstTime2Us32(syncManager_->GetMediaTimeNow());
1709     MEDIA_LOG_D("GetCurrentTime currentPositionMs: " PUBLIC_LOG_D32, currentPositionMs);
1710     if (currentPositionMs < 0) {
1711         currentPositionMs = 0;
1712     }
1713     if (durationMs_.load() > 0 && currentPositionMs > durationMs_.load()) {
1714         currentPositionMs = durationMs_.load();
1715     }
1716     return TransStatus(Status::OK);
1717 }
1718 
GetPlaybackPosition(int32_t & playbackPositionMs)1719 int32_t HiPlayerImpl::GetPlaybackPosition(int32_t& playbackPositionMs)
1720 {
1721     FALSE_RETURN_V(syncManager_ != nullptr, TransStatus(Status::ERROR_NULL_POINTER));
1722     playbackPositionMs = Plugins::HstTime2Us32(syncManager_->GetMediaTimeNow());
1723     MEDIA_LOG_D("GetPlaybackPosition playbackPositionMs: " PUBLIC_LOG_D32, playbackPositionMs);
1724     return TransStatus(Status::OK);
1725 }
1726 
GetDuration(int32_t & durationMs)1727 int32_t HiPlayerImpl::GetDuration(int32_t& durationMs)
1728 {
1729     durationMs = durationMs_.load();
1730     MEDIA_LOG_D_SHORT("GetDuration " PUBLIC_LOG_D32, durationMs);
1731     return TransStatus(Status::OK);
1732 }
1733 
InitDuration()1734 int32_t HiPlayerImpl::InitDuration()
1735 {
1736     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr,
1737         TransStatus(Status::ERROR_WRONG_STATE), "Get media duration failed, demuxer is not ready");
1738     int64_t duration = 0;
1739     bool found = false;
1740     if (demuxer_->GetDuration(duration)) {
1741         found = true;
1742     } else {
1743         MEDIA_LOG_W("Get media duration failed");
1744     }
1745     if (found && duration > 0 && duration != durationMs_.load()) {
1746         durationMs_ = Plugins::HstTime2Us(duration);
1747     }
1748     durationMs_ = std::max(durationMs_.load(), 0);
1749     MEDIA_LOG_D("duration: " PUBLIC_LOG_D32, durationMs_.load());
1750     auto meta = std::make_shared<Meta>();
1751     if (audioSink_ && meta) {
1752         meta->SetData(Tag::MEDIA_DURATION, durationMs_.load());
1753         audioSink_->SetParameter(meta);
1754     }
1755     return TransStatus(Status::OK);
1756 }
1757 
SetBundleName(std::string bundleName)1758 void HiPlayerImpl::SetBundleName(std::string bundleName)
1759 {
1760     if (!bundleName.empty()) {
1761         MEDIA_LOG_I("SetBundleName bundleName: " PUBLIC_LOG_S, bundleName.c_str());
1762         demuxer_->SetBundleName(bundleName);
1763     } else {
1764         MEDIA_LOG_I("SetBundleName failed");
1765     }
1766 }
1767 
EnableStartFrameRateOpt(Format & videoTrack)1768 void HiPlayerImpl::EnableStartFrameRateOpt(Format &videoTrack)
1769 {
1770     double frameRate = 1;
1771     if (videoTrack.GetDoubleValue("frame_rate", frameRate) && syncManager_ != nullptr) {
1772         frameRate /= FRAME_RATE_UNIT_MULTIPLE;
1773         syncManager_->SetInitialVideoFrameRate(frameRate);
1774         MEDIA_LOG_I("VideoSink initial frameRate is " PUBLIC_LOG_D64, static_cast<int64_t>(frameRate));
1775     }
1776 }
1777 
InitVideoWidthAndHeight()1778 int32_t HiPlayerImpl::InitVideoWidthAndHeight()
1779 {
1780 #ifdef SUPPORT_VIDEO
1781     std::vector<Format> videoTrackInfo;
1782     GetVideoTrackInfo(videoTrackInfo);
1783     if (videoTrackInfo.size() == 0) {
1784         MEDIA_LOG_E("InitVideoWidthAndHeight failed, as videoTrackInfo is empty!");
1785         return TransStatus(Status::ERROR_INVALID_OPERATION);
1786     }
1787     int32_t currentVideoTrackId = demuxer_->GetCurrentVideoTrackId();
1788     FALSE_RETURN_V_MSG_E(currentVideoTrackId != -1, TransStatus(Status::ERROR_INVALID_OPERATION),
1789         "InitVideoWidthAndHeight failed, as currentVideoTrackId is invalid!");
1790     for (auto& videoTrack : videoTrackInfo) {
1791         int32_t videoTrackId = -1;
1792         videoTrack.GetIntValue("track_index", videoTrackId);
1793         if (videoTrackId != currentVideoTrackId) {
1794             continue;
1795         }
1796         if (isEnableStartFrameRateOpt_) {
1797             EnableStartFrameRateOpt(videoTrack);
1798         }
1799         int32_t height;
1800         videoTrack.GetIntValue("height", height);
1801         int32_t width;
1802         videoTrack.GetIntValue("width", width);
1803         if (height <= 0 && width <= 0) {
1804             continue;
1805         }
1806         int32_t rotation = 0;
1807         needSwapWH_ = videoTrack.GetIntValue(Tag::VIDEO_ROTATION, rotation)
1808             && (rotation == rotation90 || rotation == rotation270);
1809         MEDIA_LOG_D("rotation %{public}d", rotation);
1810         videoWidth_ = !needSwapWH_.load() ? width : height;
1811         videoHeight_ = !needSwapWH_.load() ? height : width;
1812         MEDIA_LOG_D("InitVideo width %{public}d, height %{public}d",
1813             videoWidth_.load(), videoHeight_.load());
1814         break;
1815     }
1816 #endif
1817     return TransStatus(Status::OK);
1818 }
1819 
InitAudioDefaultTrackIndex()1820 Status HiPlayerImpl::InitAudioDefaultTrackIndex()
1821 {
1822     if (!demuxer_) {
1823         return Status::ERROR_UNKNOWN;
1824     }
1825     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1826     std::string mime;
1827     for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1828         auto trackInfo = metaInfo[trackIndex];
1829         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
1830             MEDIA_LOG_W("Get MIME fail");
1831             continue;
1832         }
1833         if (IsAudioMime(mime)) {
1834             defaultAudioTrackId_ = static_cast<int32_t>(trackIndex);
1835             break;
1836         }
1837     }
1838     currentAudioTrackId_ = defaultAudioTrackId_;
1839     return Status::OK;
1840 }
1841 
InitVideoDefaultTrackIndex()1842 Status HiPlayerImpl::InitVideoDefaultTrackIndex()
1843 {
1844     if (!demuxer_) {
1845         return Status::ERROR_UNKNOWN;
1846     }
1847     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1848     std::string mime;
1849     for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1850         auto trackInfo = metaInfo[trackIndex];
1851         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
1852             MEDIA_LOG_W("Get MIME fail");
1853             continue;
1854         }
1855         if (IsVideoMime(mime)) {
1856             defaultVideoTrackId_ = static_cast<int32_t>(trackIndex);
1857             break;
1858         }
1859     }
1860     currentVideoTrackId_ = defaultVideoTrackId_;
1861     return Status::OK;
1862 }
1863 
InitSubtitleDefaultTrackIndex()1864 Status HiPlayerImpl::InitSubtitleDefaultTrackIndex()
1865 {
1866     if (!demuxer_) {
1867         return Status::ERROR_UNKNOWN;
1868     }
1869     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1870     std::string mime;
1871     for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1872         auto trackInfo = metaInfo[trackIndex];
1873         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
1874             MEDIA_LOG_W("Get MIME fail");
1875             continue;
1876         }
1877         if (IsSubtitleMime(mime)) {
1878             defaultSubtitleTrackId_ = static_cast<int32_t>(trackIndex);
1879             break;
1880         }
1881     }
1882     currentSubtitleTrackId_ = defaultSubtitleTrackId_;
1883     return Status::OK;
1884 }
1885 
SetAudioEffectMode(int32_t effectMode)1886 int32_t HiPlayerImpl::SetAudioEffectMode(int32_t effectMode)
1887 {
1888     MEDIA_LOG_I("SetAudioEffectMode in");
1889     Status res = Status::OK;
1890     if (audioSink_ != nullptr) {
1891         res = audioSink_->SetAudioEffectMode(effectMode);
1892     }
1893     if (res != Status::OK) {
1894         MEDIA_LOG_E("audioSink set AudioEffectMode error");
1895         return MSERR_UNKNOWN;
1896     }
1897     return MSERR_OK;
1898 }
1899 
GetAudioEffectMode(int32_t & effectMode)1900 int32_t HiPlayerImpl::GetAudioEffectMode(int32_t &effectMode)
1901 {
1902     MEDIA_LOG_I("GetAudioEffectMode in");
1903     Status res = Status::OK;
1904     if (audioSink_ != nullptr) {
1905         res = audioSink_->GetAudioEffectMode(effectMode);
1906     }
1907     FALSE_RETURN_V_MSG_E(res == Status::OK,
1908         MSERR_UNKNOWN, "audioSink get AudioEffectMode error");
1909     return MSERR_OK;
1910 }
1911 
GetMaxAmplitude()1912 float HiPlayerImpl::GetMaxAmplitude()
1913 {
1914     float maxAmplitude = 0.0f;
1915     if (audioSink_ != nullptr) {
1916         maxAmplitude = audioSink_->GetMaxAmplitude();
1917     }
1918     return maxAmplitude;
1919 }
1920 
SetPlaybackSpeed(PlaybackRateMode mode)1921 int32_t HiPlayerImpl::SetPlaybackSpeed(PlaybackRateMode mode)
1922 {
1923     MEDIA_LOG_I("SetPlaybackSpeed %{public}d", mode);
1924     float speed = TransformPlayRate2Float(mode);
1925     if (doSetPlaybackSpeed(speed) != Status::OK) {
1926         MEDIA_LOG_E("SetPlaybackSpeed audioSink set speed error");
1927         return MSERR_UNKNOWN;
1928     }
1929     playbackRateMode_ = mode;
1930     Format format;
1931     callbackLooper_.OnInfo(INFO_TYPE_SPEEDDONE, mode, format);
1932     MEDIA_LOG_I("SetPlaybackSpeed end");
1933     return MSERR_OK;
1934 }
1935 
SetPlaybackRate(float rate)1936 int32_t HiPlayerImpl::SetPlaybackRate(float rate)
1937 {
1938     MEDIA_LOG_I("SetPlaybackRate %{public}f", rate);
1939     if (doSetPlaybackSpeed(rate) != Status::OK) {
1940         MEDIA_LOG_E("SetPlaybackRate audioSink set speed error");
1941         return MSERR_UNKNOWN;
1942     }
1943     int32_t extra = 0;
1944     playbackRate_ = rate;
1945     Format format;
1946     (void)format.PutFloatValue(PlayerKeys::PLAYER_PLAYBACK_RATE, rate);
1947     callbackLooper_.OnInfo(INFO_TYPE_RATEDONE, extra, format);
1948     MEDIA_LOG_I("SetPlaybackRate end");
1949     return MSERR_OK;
1950 }
1951 
GetPlaybackSpeed(PlaybackRateMode & mode)1952 int32_t HiPlayerImpl::GetPlaybackSpeed(PlaybackRateMode& mode)
1953 {
1954     MEDIA_LOG_I("GetPlaybackSpeed in");
1955     mode = playbackRateMode_.load();
1956     MEDIA_LOG_I("GetPlaybackSpeed end, mode is " PUBLIC_LOG_D32, mode);
1957     return MSERR_OK;
1958 }
1959 
IsVideoMime(const std::string & mime)1960 bool HiPlayerImpl::IsVideoMime(const std::string& mime)
1961 {
1962     return mime.find("video/") == 0;
1963 }
1964 
IsAudioMime(const std::string & mime)1965 bool HiPlayerImpl::IsAudioMime(const std::string& mime)
1966 {
1967     return mime.find("audio/") == 0;
1968 }
1969 
IsSubtitleMime(const std::string & mime)1970 bool HiPlayerImpl::IsSubtitleMime(const std::string& mime)
1971 {
1972     if (mime == "application/x-subrip" || mime == "text/vtt") {
1973         return true;
1974     }
1975     return false;
1976 }
1977 
IsNeedAudioSinkChangeTrack(std::vector<std::shared_ptr<Meta>> & metaInfo,int32_t trackId)1978 bool HiPlayerImpl::IsNeedAudioSinkChangeTrack(std::vector<std::shared_ptr<Meta>>& metaInfo, int32_t trackId)
1979 {
1980     if (trackId == currentAudioTrackId_) {
1981         return false;
1982     }
1983     MEDIA_LOG_I("CurTrackId " PUBLIC_LOG_D32 " trackId " PUBLIC_LOG_D32, currentAudioTrackId_, trackId);
1984 
1985     int32_t sampleRate = -1;
1986     int32_t channels = -1;
1987     Plugins::AudioSampleFormat sampleFormat;
1988 
1989     int32_t currentSampleRate = -1;
1990     int32_t currentChannels = -1;
1991     Plugins::AudioSampleFormat currentSampleFormat;
1992 
1993     FALSE_RETURN_V(metaInfo[trackId]->GetData(Tag::AUDIO_SAMPLE_RATE, sampleRate), true);
1994     FALSE_RETURN_V(metaInfo[currentAudioTrackId_]->GetData(Tag::AUDIO_SAMPLE_RATE, currentSampleRate), true);
1995     FALSE_RETURN_V(sampleRate == currentSampleRate, true);
1996 
1997     FALSE_RETURN_V(metaInfo[trackId]->GetData(Tag::AUDIO_CHANNEL_COUNT, channels), true);
1998     FALSE_RETURN_V(metaInfo[currentAudioTrackId_]->GetData(Tag::AUDIO_CHANNEL_COUNT, currentChannels), true);
1999     FALSE_RETURN_V(channels == currentChannels, true);
2000 
2001     FALSE_RETURN_V(metaInfo[trackId]->GetData(Tag::AUDIO_SAMPLE_FORMAT, sampleFormat), true);
2002     FALSE_RETURN_V(metaInfo[currentAudioTrackId_]->GetData(Tag::AUDIO_SAMPLE_FORMAT, currentSampleFormat), true);
2003     MEDIA_LOG_I("sampleformat: CurTrackId" PUBLIC_LOG_D32 " trackId" PUBLIC_LOG_D32, currentSampleFormat,
2004         sampleFormat);
2005     FALSE_RETURN_V(sampleFormat == currentSampleFormat, true);
2006 
2007     std::string mimeType;
2008     AudioStandard::AudioEncodingType encodingType;
2009     std::string currentMimeType;
2010     AudioStandard::AudioEncodingType currentEncodingType;
2011     FALSE_RETURN_V(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mimeType), true);
2012     FALSE_RETURN_V(metaInfo[currentAudioTrackId_]->GetData(Tag::MIME_TYPE, currentMimeType), true);
2013     encodingType = (mimeType == MimeType::AUDIO_AVS3DA)
2014                 ? AudioStandard::ENCODING_AUDIOVIVID : AudioStandard::ENCODING_PCM;
2015     currentEncodingType = (currentMimeType == MimeType::AUDIO_AVS3DA)
2016                 ? AudioStandard::ENCODING_AUDIOVIVID : AudioStandard::ENCODING_PCM;
2017     FALSE_RETURN_V(mimeType == currentMimeType, true);
2018 
2019     return false;
2020 }
2021 
GetCurrentTrack(int32_t trackType,int32_t & index)2022 int32_t HiPlayerImpl::GetCurrentTrack(int32_t trackType, int32_t &index)
2023 {
2024     FALSE_RETURN_V_MSG_W(trackType >= OHOS::Media::MediaType::MEDIA_TYPE_AUD &&
2025         trackType <= OHOS::Media::MediaType::MEDIA_TYPE_SUBTITLE,
2026         MSERR_INVALID_VAL, "Invalid trackType %{public}d", trackType);
2027     if (trackType == OHOS::Media::MediaType::MEDIA_TYPE_AUD) {
2028         if (currentAudioTrackId_ < 0) {
2029             if (Status::OK != InitAudioDefaultTrackIndex()) {
2030                 return MSERR_UNKNOWN;
2031             }
2032         }
2033         index = currentAudioTrackId_;
2034     } else if (trackType == OHOS::Media::MediaType::MEDIA_TYPE_VID) {
2035         if (currentVideoTrackId_ < 0) {
2036             if (Status::OK != InitVideoDefaultTrackIndex()) {
2037                 return MSERR_UNKNOWN;
2038             }
2039         }
2040         index = currentVideoTrackId_;
2041     } else if (trackType == OHOS::Media::MediaType::MEDIA_TYPE_SUBTITLE) {
2042         if (currentSubtitleTrackId_ < 0) {
2043             if (Status::OK != InitSubtitleDefaultTrackIndex()) {
2044                 return MSERR_UNKNOWN;
2045             }
2046         }
2047         index = currentSubtitleTrackId_;
2048     } else {
2049         (void)index;
2050     }
2051 
2052     return MSERR_OK;
2053 }
2054 
InnerSelectTrack(std::string mime,int32_t trackId,PlayerSwitchMode mode)2055 int32_t HiPlayerImpl::InnerSelectTrack(std::string mime, int32_t trackId, PlayerSwitchMode mode)
2056 {
2057     if (Status::OK != demuxer_->SelectTrack(trackId)) {
2058         MEDIA_LOG_E_SHORT("SelectTrack error. trackId is " PUBLIC_LOG_D32, trackId);
2059         return MSERR_UNKNOWN;
2060     }
2061     if (IsSubtitleMime(mime)) {
2062         currentSubtitleTrackId_ = trackId;
2063     } else if (IsVideoMime(mime)) {
2064         currentVideoTrackId_ = trackId;
2065         int32_t curPosMs = 0;
2066         GetCurrentTime(curPosMs);
2067         if (mode == PlayerSwitchMode::SWITCH_SEGMENT) {
2068             MEDIA_LOG_I("SelectTrack seek begin SWITCH_SEGMENT " PUBLIC_LOG_D32, trackId);
2069             return TransStatus(Seek(curPosMs, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false));
2070         } else if (mode == PlayerSwitchMode::SWITCH_CLOSEST) {
2071             MEDIA_LOG_I("SelectTrack seek begin SWITCH_CLOSEST " PUBLIC_LOG_D32, trackId);
2072             return TransStatus(Seek(curPosMs, PlayerSeekMode::SEEK_CLOSEST, false));
2073         }
2074     }
2075     return MSERR_OK;
2076 }
2077 
SelectTrack(int32_t trackId,PlayerSwitchMode mode)2078 int32_t HiPlayerImpl::SelectTrack(int32_t trackId, PlayerSwitchMode mode)
2079 {
2080     MEDIA_LOG_I("SelectTrack begin trackId is " PUBLIC_LOG_D32, trackId);
2081     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2082     std::string mime;
2083     FALSE_RETURN_V_MSG_W(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
2084         MSERR_INVALID_VAL, "SelectTrack trackId invalid");
2085     if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
2086         MEDIA_LOG_E("SelectTrack trackId " PUBLIC_LOG_D32 "get mime error", trackId);
2087         return MSERR_INVALID_VAL;
2088     }
2089     if (IsAudioMime(mime)) {
2090         FALSE_RETURN_V_MSG_W(trackId != currentAudioTrackId_, MSERR_INVALID_VAL, "SelectTrack trackId invalid");
2091         if (currentAudioTrackId_ < 0) {
2092             if (Status::OK != InitAudioDefaultTrackIndex()) {
2093                 MEDIA_LOG_W("Init audio default track index fail");
2094             }
2095         }
2096     } else if (IsVideoMime(mime)) {
2097         FALSE_RETURN_V_MSG_W(trackId != currentVideoTrackId_, MSERR_INVALID_VAL, "SelectTrack trackId invalid");
2098         if (currentVideoTrackId_ < 0) {
2099             if (Status::OK != InitVideoDefaultTrackIndex()) {
2100                 MEDIA_LOG_W("Init video default track index fail");
2101             }
2102         }
2103     } else if (IsSubtitleMime(mime)) {
2104         FALSE_RETURN_V_MSG_W(trackId != currentSubtitleTrackId_, MSERR_INVALID_VAL, "SelectTrack trackId invalid");
2105         if (currentSubtitleTrackId_ < 0) {
2106             if (Status::OK != InitSubtitleDefaultTrackIndex()) {
2107                 MEDIA_LOG_W("Init subtitle default track index fail");
2108             }
2109         }
2110     } else {
2111         MEDIA_LOG_E("SelectTrack invalid mimeType. trackId is " PUBLIC_LOG_D32, trackId);
2112         return MSERR_UNKNOWN;
2113     }
2114     return InnerSelectTrack(mime, trackId, mode);
2115 }
2116 
DeselectTrack(int32_t trackId)2117 int32_t HiPlayerImpl::DeselectTrack(int32_t trackId)
2118 {
2119     MEDIA_LOG_I("DeselectTrack trackId is " PUBLIC_LOG_D32, trackId);
2120     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2121     FALSE_RETURN_V_MSG_W(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
2122         MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
2123     std::string mime;
2124     if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
2125         MEDIA_LOG_E("DeselectTrack trackId " PUBLIC_LOG_D32 "get mime error", trackId);
2126         return MSERR_INVALID_VAL;
2127     }
2128     if (IsAudioMime(mime)) {
2129         FALSE_RETURN_V_MSG_W(trackId == currentAudioTrackId_ && currentAudioTrackId_ >= 0,
2130             MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
2131         return SelectTrack(defaultAudioTrackId_, PlayerSwitchMode::SWITCH_SMOOTH);
2132     } else if (IsVideoMime(mime)) {
2133         FALSE_RETURN_V_MSG_W(trackId == currentVideoTrackId_ && currentVideoTrackId_ >= 0,
2134             MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
2135         return SelectTrack(defaultVideoTrackId_, PlayerSwitchMode::SWITCH_SMOOTH);
2136     } else if (IsSubtitleMime(mime)) {
2137         FALSE_RETURN_V_MSG_W(trackId == currentSubtitleTrackId_ && currentSubtitleTrackId_ >= 0,
2138             MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
2139         if (needUpdateSubtitle_.load()) {
2140             needUpdateSubtitle_.store(false);
2141         } else {
2142             needUpdateSubtitle_.store(true);
2143         }
2144     } else {}
2145     return MSERR_OK;
2146 }
2147 
GetVideoTrackInfo(std::vector<Format> & videoTrack)2148 int32_t HiPlayerImpl::GetVideoTrackInfo(std::vector<Format>& videoTrack)
2149 {
2150     MEDIA_LOG_D("GetVideoTrackInfo in");
2151     FALSE_RETURN_V(demuxer_ != nullptr, MSERR_INVALID_STATE);
2152     std::string mime;
2153     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2154     for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
2155         auto trackInfo = metaInfo[trackIndex];
2156         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime)) || mime.find("invalid") == 0) {
2157             MEDIA_LOG_W("Get MIME fail");
2158             continue;
2159         }
2160         if (IsVideoMime(mime)) {
2161             Format videoTrackInfo {};
2162             playStatisticalInfo_.videoMime = mime;
2163             videoTrackInfo.PutStringValue("codec_mime", mime);
2164             videoTrackInfo.PutIntValue("track_type", static_cast<int32_t>(OHOS::Media::Plugins::MediaType::VIDEO));
2165             videoTrackInfo.PutIntValue("track_index", trackIndex);
2166             int64_t bitRate;
2167             trackInfo->GetData(Tag::MEDIA_BITRATE, bitRate);
2168             playStatisticalInfo_.videoBitrate = static_cast<int32_t>(bitRate);
2169             videoTrackInfo.PutLongValue("bitrate", bitRate);
2170             double frameRate;
2171             trackInfo->GetData(Tag::VIDEO_FRAME_RATE, frameRate);
2172             playStatisticalInfo_.videoFrameRate = static_cast<float>(frameRate);
2173             videoTrackInfo.PutDoubleValue("frame_rate", frameRate * FRAME_RATE_UNIT_MULTIPLE);
2174             int32_t height = GetSarVideoHeight(trackInfo);
2175             videoTrackInfo.PutIntValue("height", height);
2176             int32_t width = GetSarVideoWidth(trackInfo);
2177             playStatisticalInfo_.videoResolution = std::to_string(width) + "x" + std::to_string(height);
2178             videoTrackInfo.PutIntValue("width", width);
2179             Plugins::VideoRotation rotation;
2180             trackInfo->Get<Tag::VIDEO_ROTATION>(rotation);
2181             videoTrackInfo.PutIntValue(Tag::VIDEO_ROTATION, rotation);
2182             videoTrackInfo.PutStringValue("track_name", "video");
2183             bool isHdr = false;
2184             trackInfo->GetData(Tag::VIDEO_IS_HDR_VIVID, isHdr);
2185             if (isHdr) {
2186                 playStatisticalInfo_.hdrType = static_cast<int8_t>(VideoHdrType::VIDEO_HDR_TYPE_VIVID);
2187                 videoTrackInfo.PutIntValue("hdr_type", 1);
2188             } else {
2189                 playStatisticalInfo_.hdrType = static_cast<int8_t>(VideoHdrType::VIDEO_HDR_TYPE_NONE);
2190                 videoTrackInfo.PutIntValue("hdr_type", 0);
2191             }
2192             videoTrack.emplace_back(std::move(videoTrackInfo));
2193         }
2194     }
2195     return TransStatus(Status::OK);
2196 }
2197 
GetSarVideoWidth(std::shared_ptr<Meta> trackInfo)2198 int32_t HiPlayerImpl::GetSarVideoWidth(std::shared_ptr<Meta> trackInfo)
2199 {
2200     int32_t width;
2201     trackInfo->GetData(Tag::VIDEO_WIDTH, width);
2202     double videoSar;
2203     bool ret = trackInfo->GetData(Tag::VIDEO_SAR, videoSar);
2204     if (ret && videoSar < 1) {
2205         width = static_cast<int32_t>(width * videoSar);
2206     }
2207     return width;
2208 }
2209 
GetSarVideoHeight(std::shared_ptr<Meta> trackInfo)2210 int32_t HiPlayerImpl::GetSarVideoHeight(std::shared_ptr<Meta> trackInfo)
2211 {
2212     int32_t height;
2213     trackInfo->GetData(Tag::VIDEO_HEIGHT, height);
2214     double videoSar;
2215     bool ret = trackInfo->GetData(Tag::VIDEO_SAR, videoSar);
2216     if (ret && videoSar > 1) {
2217         height = static_cast<int32_t>(height / videoSar);
2218     }
2219     return height;
2220 }
2221 
GetPlaybackInfo(Format & playbackInfo)2222 int32_t HiPlayerImpl::GetPlaybackInfo(Format& playbackInfo)
2223 {
2224     MEDIA_LOG_D("GetPlaybackInfo in");
2225 
2226     PlaybackInfo playbackInfoTmp;
2227     auto ret = demuxer_->GetPlaybackInfo(playbackInfoTmp);
2228     if (ret == Status::OK) {
2229         playbackInfo.PutStringValue("server_ip_address", playbackInfoTmp.serverIpAddress);
2230         playbackInfo.PutLongValue("average_download_rate", playbackInfoTmp.averageDownloadRate);
2231         playbackInfo.PutLongValue("download_rate", playbackInfoTmp.downloadRate);
2232         playbackInfo.PutIntValue("is_downloading", playbackInfoTmp.isDownloading);
2233         playbackInfo.PutLongValue("buffer_duration", playbackInfoTmp.bufferDuration);
2234     }
2235     return TransStatus(Status::OK);
2236 }
2237 
GetAudioTrackInfo(std::vector<Format> & audioTrack)2238 int32_t HiPlayerImpl::GetAudioTrackInfo(std::vector<Format>& audioTrack)
2239 {
2240     MEDIA_LOG_I("GetAudioTrackInfo in");
2241     std::string mime;
2242     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2243     for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
2244         auto trackInfo = metaInfo[trackIndex];
2245         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime)) || mime.find("invalid") == 0) {
2246             MEDIA_LOG_W("Get MIME fail");
2247             continue;
2248         }
2249         if (IsAudioMime(mime)) {
2250             playStatisticalInfo_.audioMime = mime;
2251             Format audioTrackInfo {};
2252             audioTrackInfo.PutStringValue("codec_mime", mime);
2253             audioTrackInfo.PutIntValue("track_type", static_cast<int32_t>(OHOS::Media::Plugins::MediaType::AUDIO));
2254             audioTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackIndex));
2255             int64_t bitRate = 0;
2256             trackInfo->GetData(Tag::MEDIA_BITRATE, bitRate);
2257             playStatisticalInfo_.audioBitrate = static_cast<int32_t>(bitRate);
2258             audioTrackInfo.PutLongValue("bitrate", bitRate);
2259             int32_t audioChannels = 0;
2260             trackInfo->GetData(Tag::AUDIO_CHANNEL_COUNT, audioChannels);
2261             playStatisticalInfo_.audioChannelCount = audioChannels;
2262             audioTrackInfo.PutIntValue("channel_count", audioChannels);
2263             int32_t audioSampleRate = 0;
2264             trackInfo->GetData(Tag::AUDIO_SAMPLE_RATE, audioSampleRate);
2265             playStatisticalInfo_.audioSampleRate = audioSampleRate;
2266             audioTrackInfo.PutIntValue("sample_rate", audioSampleRate);
2267             int32_t sampleDepth = 0;
2268             bool isHasData = trackInfo->GetData(Tag::AUDIO_BITS_PER_CODED_SAMPLE, sampleDepth);
2269             if (!isHasData || sampleDepth <= 0) {
2270                 trackInfo->GetData(Tag::AUDIO_BITS_PER_RAW_SAMPLE, sampleDepth);
2271             }
2272             audioTrackInfo.PutIntValue("sample_depth", sampleDepth);
2273             std::string lang;
2274             trackInfo->GetData(Tag::MEDIA_LANGUAGE, lang);
2275             audioTrackInfo.PutStringValue("language", lang);
2276             audioTrackInfo.PutStringValue("track_name", "audio");
2277             audioTrack.emplace_back(std::move(audioTrackInfo));
2278         }
2279     }
2280     return TransStatus(Status::OK);
2281 }
2282 
GetSubtitleTrackInfo(std::vector<Format> & subtitleTrack)2283 int32_t HiPlayerImpl::GetSubtitleTrackInfo(std::vector<Format>& subtitleTrack)
2284 {
2285     MEDIA_LOG_I("GetSubtitleTrackInfo in");
2286     std::string mime;
2287     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2288     for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
2289         auto trackInfo = metaInfo[trackIndex];
2290         if (!(trackInfo->GetData(Tag::MIME_TYPE, mime)) || mime.find("invalid") == 0) {
2291             MEDIA_LOG_W("Get MIME fail");
2292             continue;
2293         }
2294         if (IsSubtitleMime(mime)) {
2295             playStatisticalInfo_.subtitleMime = mime;
2296             Format subtitleTrackInfo {};
2297             subtitleTrackInfo.PutStringValue("codec_mime", mime);
2298             subtitleTrackInfo.PutIntValue("track_type",
2299                 static_cast<int32_t>(OHOS::Media::Plugins::MediaType::SUBTITLE));
2300             subtitleTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackIndex));
2301 
2302             std::string lang;
2303             trackInfo->GetData(Tag::MEDIA_LANGUAGE, lang);
2304             subtitleTrackInfo.PutStringValue("language", lang);
2305             subtitleTrackInfo.PutStringValue("track_name", "subtitle");
2306 
2307             subtitleTrack.emplace_back(std::move(subtitleTrackInfo));
2308         }
2309     }
2310     return TransStatus(Status::OK);
2311 }
2312 
GetVideoWidth()2313 int32_t HiPlayerImpl::GetVideoWidth()
2314 {
2315 #ifdef SUPPORT_VIDEO
2316     MEDIA_LOG_D_SHORT("GetVideoWidth in. video width: " PUBLIC_LOG_D32, videoWidth_.load());
2317 #endif
2318     return videoWidth_.load();
2319 }
2320 
GetVideoHeight()2321 int32_t HiPlayerImpl::GetVideoHeight()
2322 {
2323 #ifdef SUPPORT_VIDEO
2324     MEDIA_LOG_D_SHORT("GetVideoHeight in. video height: " PUBLIC_LOG_D32, videoHeight_.load());
2325 #endif
2326     return videoHeight_.load();
2327 }
2328 
SetVideoScaleType(OHOS::Media::VideoScaleType videoScaleType)2329 int32_t HiPlayerImpl::SetVideoScaleType(OHOS::Media::VideoScaleType videoScaleType)
2330 {
2331     MEDIA_LOG_D_SHORT("SetVideoScaleType " PUBLIC_LOG_D32, videoScaleType);
2332 #ifdef SUPPORT_VIDEO
2333     auto meta = std::make_shared<Meta>();
2334     meta->Set<Tag::VIDEO_SCALE_TYPE>(static_cast<int32_t>(videoScaleType));
2335     if (videoDecoder_) {
2336         videoDecoder_->SetParameter(meta);
2337     }
2338     return TransStatus(Status::OK);
2339 #else
2340     return TransStatus(Status::OK);
2341 #endif
2342 }
2343 
SetFrameRateForSeekPerformance(double frameRate)2344 int32_t HiPlayerImpl::SetFrameRateForSeekPerformance(double frameRate)
2345 {
2346     MEDIA_LOG_I("SetFrameRateForSeekPerformance, frameRate: %{public}f", frameRate);
2347 #ifdef SUPPORT_VIDEO
2348     auto meta = std::make_shared<Meta>();
2349     meta->Set<Tag::VIDEO_FRAME_RATE>(frameRate);
2350     if (videoDecoder_) {
2351         videoDecoder_->SetParameter(meta);
2352     }
2353     return TransStatus(Status::OK);
2354 #else
2355     return TransStatus(Status::OK);
2356 #endif
2357 }
2358 
SetAudioRendererInfo(const int32_t contentType,const int32_t streamUsage,const int32_t rendererFlag,const int32_t volumeMode)2359 int32_t HiPlayerImpl::SetAudioRendererInfo(const int32_t contentType, const int32_t streamUsage,
2360                                            const int32_t rendererFlag, const int32_t volumeMode)
2361 {
2362     MEDIA_LOG_I("SetAudioRendererInfo in, coutentType: " PUBLIC_LOG_D32 ", streamUsage: " PUBLIC_LOG_D32
2363         ", rendererFlag: " PUBLIC_LOG_D32, contentType, streamUsage, rendererFlag);
2364     Plugins::AudioRenderInfo audioRenderInfo {contentType, streamUsage, rendererFlag, volumeMode};
2365     if (audioRenderInfo_ == nullptr) {
2366         audioRenderInfo_ = std::make_shared<Meta>();
2367     }
2368     audioRenderInfo_->SetData(Tag::AUDIO_RENDER_SET_FLAG, true);
2369     audioRenderInfo_->SetData(Tag::AUDIO_RENDER_INFO, audioRenderInfo);
2370     if (audioSink_ != nullptr) {
2371         audioSink_->SetParameter(audioRenderInfo_);
2372     }
2373     return TransStatus(Status::OK);
2374 }
2375 
SetAudioInterruptMode(const int32_t interruptMode)2376 int32_t HiPlayerImpl::SetAudioInterruptMode(const int32_t interruptMode)
2377 {
2378     MEDIA_LOG_I("SetAudioInterruptMode in");
2379     audioInterruptMode_ = std::make_shared<Meta>();
2380     audioInterruptMode_->SetData(Tag::AUDIO_INTERRUPT_MODE, interruptMode);
2381     if (audioSink_ != nullptr) {
2382         audioSink_->SetParameter(audioInterruptMode_);
2383     }
2384     return TransStatus(Status::OK);
2385 }
2386 
OnEvent(const Event & event)2387 void HiPlayerImpl::OnEvent(const Event &event)
2388 {
2389     MEDIA_LOG_D("OnEvent entered, event type is: %{public}d", event.type);
2390     switch (event.type) {
2391         case EventType::EVENT_IS_LIVE_STREAM: {
2392             HandleIsLiveStreamEvent(AnyCast<bool>(event.param));
2393             break;
2394         }
2395         case EventType::EVENT_ERROR: {
2396             OnStateChanged(PlayerStateId::ERROR);
2397             HandleErrorEvent(AnyCast<int32_t>(event.param));
2398             break;
2399         }
2400         case EventType::EVENT_READY: {
2401             OnStateChanged(PlayerStateId::READY);
2402             break;
2403         }
2404         case EventType::EVENT_COMPLETE: {
2405             HandleCompleteEvent(event);
2406             break;
2407         }
2408         case EventType::EVENT_AUDIO_INTERRUPT: {
2409             NotifyAudioInterrupt(event);
2410             break;
2411         }
2412         case EventType::EVENT_AUDIO_FIRST_FRAME: {
2413             NotifyAudioFirstFrame(event);
2414             HandleInitialPlayingStateChange(event.type);
2415             break;
2416         }
2417         case EventType::EVENT_DRM_INFO_UPDATED:
2418             HandleDrmInfoUpdatedEvent(event);
2419             break;
2420         case EventType::EVENT_VIDEO_RENDERING_START: {
2421             MEDIA_LOG_D_SHORT("video first frame reneder received");
2422             if (IsAppEnableRenderFirstFrame(appUid_)) {
2423                 // if app enable render first frame, notify first frame render event at once
2424                 Format format;
2425                 callbackLooper_.OnInfo(INFO_TYPE_MESSAGE, PlayerMessageType::PLAYER_INFO_VIDEO_RENDERING_START, format);
2426             }
2427             HandleInitialPlayingStateChange(event.type);
2428             break;
2429         }
2430         case EventType::EVENT_RELEASE_VIDEO_DECODER:
2431             ReleaseVideoDecoderOnMuted();
2432             break;
2433         case EventType::EVENT_VIDEO_NO_NEED_INIT:
2434             HandleInitialPlayingStateChange(EventType::EVENT_VIDEO_RENDERING_START);
2435             break;
2436         default:
2437             OnEventContinue(event);
2438     }
2439     OnEventSub(event);
2440 }
2441 
OnEventContinue(const Event & event)2442 void HiPlayerImpl::OnEventContinue(const Event &event)
2443 {
2444     MEDIA_LOG_D("OnEvent entered, event type is: %{public}d", event.type);
2445     switch (event.type) {
2446         case EventType::EVENT_RESOLUTION_CHANGE: {
2447             MEDIA_LOG_D_SHORT("resolution change event received");
2448             HandleResolutionChangeEvent(event);
2449             break;
2450         }
2451         case EventType::EVENT_SEI_INFO: {
2452             HandleSeiInfoEvent(event);
2453             break;
2454         }
2455         case EventType::EVENT_FLV_AUTO_SELECT_BITRATE: {
2456             HandleFlvAutoSelectBitRate(AnyCast<int32_t>(event.param));
2457             break;
2458         }
2459         case EventType::EVENT_VIDEO_DECODER_RESTART: {
2460             if (demuxer_ != nullptr) {
2461                 demuxer_->NotifyResumeUnMute();
2462             }
2463             break;
2464         }
2465         default:
2466             break;
2467     }
2468 }
2469 
HandleSeiInfoEvent(const Event & event)2470 void HiPlayerImpl::HandleSeiInfoEvent(const Event &event)
2471 {
2472     Format format = AnyCast<Format>(event.param);
2473 
2474     int32_t playbackPos = 0;
2475     format.GetIntValue(Tag::AV_PLAYER_SEI_PLAYBACK_POSITION, playbackPos);
2476     format.PutIntValue(Tag::AV_PLAYER_SEI_PLAYBACK_POSITION, playbackPos - Plugins::Us2Ms(mediaStartPts_));
2477 
2478     callbackLooper_.OnInfo(INFO_TYPE_SEI_UPDATE_INFO, 0, format);
2479 }
2480 
HandleFlvAutoSelectBitRate(uint32_t bitRate)2481 void HiPlayerImpl::HandleFlvAutoSelectBitRate(uint32_t bitRate)
2482 {
2483     MEDIA_LOG_I("flv auto select bitrate");
2484     Format selectBitRateFormat;
2485     callbackLooper_.OnInfo(INFO_TYPE_FLV_AUTO_SELECT_BITRATE, bitRate, selectBitRateFormat);
2486 }
2487 
OnEventSub(const Event & event)2488 void HiPlayerImpl::OnEventSub(const Event &event)
2489 {
2490     switch (event.type) {
2491         case EventType::EVENT_AUDIO_DEVICE_CHANGE : {
2492             NotifyAudioDeviceChange(event);
2493             break;
2494         }
2495         case EventType::EVENT_AUDIO_SERVICE_DIED : {
2496             NotifyAudioServiceDied();
2497             break;
2498         }
2499         case EventType::EVENT_SOURCE_BITRATE_START: {
2500             HandleBitrateStartEvent(event);
2501             break;
2502         }
2503         case EventType::EVENT_SUBTITLE_TEXT_UPDATE: {
2504             NotifySubtitleUpdate(event);
2505             break;
2506         }
2507         case EventType::EVENT_CACHED_DURATION: {
2508             int32_t cachedDuration = AnyCast<int32_t>(event.param);
2509             NotifyCachedDuration(AdjustCachedDuration(cachedDuration));
2510             break;
2511         }
2512         case EventType::EVENT_BUFFER_PROGRESS: {
2513             NotifyBufferingUpdate(PlayerKeys::PLAYER_BUFFERING_PERCENT, AnyCast<int32_t>(event.param));
2514             break;
2515         }
2516         case EventType::EVENT_DECODE_ERROR_FRAME:
2517             NotifyDecoderErrorFrame(AnyCast<int64_t>(event.param));
2518             break;
2519         default:
2520             break;
2521     }
2522     OnEventSubTrackChange(event);
2523 }
2524 
OnEventSubTrackChange(const Event & event)2525 void HiPlayerImpl::OnEventSubTrackChange(const Event &event)
2526 {
2527     switch (event.type) {
2528         case EventType::EVENT_AUDIO_TRACK_CHANGE: {
2529             HandleAudioTrackChangeEvent(event);
2530             break;
2531         }
2532         case EventType::EVENT_VIDEO_TRACK_CHANGE: {
2533             HandleVideoTrackChangeEvent(event);
2534             break;
2535         }
2536         case EventType::EVENT_SUBTITLE_TRACK_CHANGE: {
2537             HandleSubtitleTrackChangeEvent(event);
2538             break;
2539         }
2540         case EventType::EVENT_SUPER_RESOLUTION_CHANGED: {
2541             NotifySuperResolutionChanged(event);
2542             break;
2543         }
2544         case EventType::BUFFERING_END : {
2545             {
2546                 std::unique_lock<std::mutex> lock(flvLiveMutex_);
2547                 isBufferingEnd_ = true;
2548             }
2549             flvLiveCond_.notify_all();
2550             if (!isBufferingStartNotified_.load() || isSeekClosest_.load()) {
2551                 MEDIA_LOGI_LIMIT(BUFFERING_LOG_FREQUENCY, "BUFFERING_END BLOCKED");
2552                 break;
2553             }
2554             MEDIA_LOG_I_SHORT("BUFFERING_END PLAYING");
2555             NotifyBufferingEnd(AnyCast<int32_t>(event.param));
2556             break;
2557         }
2558         case EventType::BUFFERING_START : {
2559             if (isBufferingStartNotified_.load()) {
2560                 MEDIA_LOGI_LIMIT(BUFFERING_LOG_FREQUENCY, "BUFFERING_START BLOCKED");
2561                 break;
2562             }
2563             MEDIA_LOG_I_SHORT("BUFFERING_START PAUSE");
2564             NotifyBufferingStart(AnyCast<int32_t>(event.param));
2565             break;
2566         }
2567         default:
2568             break;
2569     }
2570 }
2571 
AdjustCachedDuration(int32_t cachedDuration)2572 int32_t HiPlayerImpl::AdjustCachedDuration(int32_t cachedDuration)
2573 {
2574     int32_t durationMs = durationMs_.load();
2575     FALSE_RETURN_V_NOLOG(durationMs > 0, cachedDuration);
2576     int32_t currentTime = 0;
2577     int32_t res = GetCurrentTime(currentTime);
2578     FALSE_RETURN_V_NOLOG(res == MSERR_OK && currentTime > 0, std::min(cachedDuration, durationMs));
2579     int64_t remaining  = static_cast<int64_t>(durationMs) - static_cast<int64_t>(currentTime);
2580     int32_t safeRemaining = static_cast<int32_t>(std::clamp(
2581         remaining,
2582         static_cast<int64_t>(0),
2583         static_cast<int64_t>(durationMs)
2584     ));
2585     return std::min(cachedDuration, safeRemaining);
2586 }
2587 
HandleInitialPlayingStateChange(const EventType & eventType)2588 void HiPlayerImpl::HandleInitialPlayingStateChange(const EventType& eventType)
2589 {
2590     AutoLock lock(initialPlayingEventMutex_);
2591     MEDIA_LOG_I("HandleInitialPlayingStateChange");
2592     if (!isInitialPlay_) {
2593         return;
2594     }
2595     for (std::pair<EventType, bool>& item : initialAVStates_) {
2596         if (item.first == eventType) {
2597             MEDIA_LOG_I("HandleInitialPlayingStateChange event type received = " PUBLIC_LOG_D32,
2598                 static_cast<int32_t>(eventType));
2599             item.second = true;
2600         }
2601     }
2602 
2603     for (auto item : initialAVStates_) {
2604         if (item.second == false) {
2605             MEDIA_LOG_I("HandleInitialPlayingStateChange another event type not received " PUBLIC_LOG_D32,
2606                 static_cast<int32_t>(item.first));
2607             return;
2608         }
2609     }
2610 
2611     MEDIA_LOG_D("av first frame reneder all received");
2612 
2613     isInitialPlay_ = false;
2614     if (!IsAppEnableRenderFirstFrame(appUid_)) {
2615         // if app not enable render first frame, notify first frame render event when notify playing state
2616         Format format;
2617         callbackLooper_.OnInfoDelay(INFO_TYPE_MESSAGE, PlayerMessageType::PLAYER_INFO_VIDEO_RENDERING_START, format,
2618             FIRST_FRAME_FRAME_REPORT_DELAY_MS);
2619     }
2620     OnStateChanged(PlayerStateId::PLAYING);
2621 
2622     int64_t nowTimeMs = GetCurrentMillisecond();
2623     playStatisticalInfo_.startLatency = static_cast<int32_t>(nowTimeMs - playStartTime_);
2624 }
2625 
DoSetPlayStrategy(const std::shared_ptr<MediaSource> source)2626 void HiPlayerImpl::DoSetPlayStrategy(const std::shared_ptr<MediaSource> source)
2627 {
2628     std::shared_ptr<PlayStrategy> playStrategy = std::make_shared<PlayStrategy>();
2629     playStrategy->width = preferedWidth_;
2630     playStrategy->height = preferedHeight_;
2631     playStrategy->duration = bufferDuration_;
2632     playStrategy->preferHDR = preferHDR_;
2633     playStrategy->audioLanguage = audioLanguage_;
2634     playStrategy->subtitleLanguage = subtitleLanguage_;
2635     playStrategy->bufferDurationForPlaying = bufferDurationForPlaying_;
2636     playStrategy->thresholdForAutoQuickPlay = maxLivingDelayTime_;
2637     if (source) {
2638         source->SetPlayStrategy(playStrategy);
2639         source->SetAppUid(appUid_);
2640     }
2641 }
2642 
DoSetPlayMediaStream(const std::shared_ptr<MediaSource> & source)2643 void HiPlayerImpl::DoSetPlayMediaStream(const std::shared_ptr<MediaSource>& source)
2644 {
2645     FALSE_RETURN(source != nullptr);
2646     for (auto& mediaStream : playMediaStreamVec_) {
2647         std::shared_ptr<PlayMediaStream> playMediaStream = std::make_shared<PlayMediaStream>();
2648         FALSE_RETURN(playMediaStream != nullptr);
2649         playMediaStream->url = mediaStream.url;
2650         playMediaStream->width = mediaStream.width;
2651         playMediaStream->height = mediaStream.height;
2652         playMediaStream->bitrate = mediaStream.bitrate;
2653         source->AddMediaStream(playMediaStream);
2654     }
2655 }
2656 
IsLivingMaxDelayTimeValid()2657 bool HiPlayerImpl::IsLivingMaxDelayTimeValid()
2658 {
2659     if (maxLivingDelayTime_ < 0) {
2660         return true;
2661     }
2662     if (maxLivingDelayTime_ < AVPlayStrategyConstant::BUFFER_DURATION_FOR_PLAYING_SECONDS ||
2663         maxLivingDelayTime_ < bufferDurationForPlaying_) {
2664         return false;
2665     }
2666     return true;
2667 }
2668 
DoSetSource(const std::shared_ptr<MediaSource> source)2669 Status HiPlayerImpl::DoSetSource(const std::shared_ptr<MediaSource> source)
2670 {
2671     MediaTrace trace("HiPlayerImpl::DoSetSource");
2672     ResetIfSourceExisted();
2673     completeState_.clear();
2674     demuxer_ = FilterFactory::Instance().CreateFilter<DemuxerFilter>("builtin.player.demuxer",
2675         FilterType::FILTERTYPE_DEMUXER);
2676     FALSE_RETURN_V(demuxer_ != nullptr, Status::ERROR_NULL_POINTER);
2677     DoInitDemuxer();
2678     DoSetPlayStrategy(source);
2679     if (!mimeType_.empty()) {
2680         source->SetMimeType(mimeType_);
2681     }
2682     if (!seiMessageCbStatus_ && surface_ == nullptr && !isForceLoadVideo_ &&
2683         mutedMediaType_ != OHOS::Media::MediaType::MEDIA_TYPE_VID) {
2684         MEDIA_LOG_D("HiPlayerImpl::DisableMediaTrack");
2685         demuxer_->DisableMediaTrack(OHOS::Media::Plugins::MediaType::VIDEO);
2686     }
2687     if (!playMediaStreamVec_.empty()) {
2688         DoSetPlayMediaStream(source);
2689     }
2690     FALSE_RETURN_V(!isInterruptNeeded_, Status::OK);
2691     demuxer_->SetIsEnableReselectVideoTrack(true);
2692     Status ret = Status::OK;
2693     MEDIA_LOG_I("SetDataSource cost ms %{public}" PRId64, CALC_EXPR_TIME_MS(ret = demuxer_->SetDataSource(source)));
2694     demuxer_->SetCallerInfo(instanceId_, bundleName_);
2695     demuxer_->SetDumpFlag(isDump_);
2696     std::shared_ptr<Meta> globalMeta = demuxer_->GetGlobalMetaInfo();
2697     if (ret == Status::OK && !MetaUtils::CheckFileType(globalMeta)) {
2698         MEDIA_LOG_W("0x%{public}06" PRIXPTR " SetSource unsupport", FAKE_POINTER(this));
2699         ret = Status::ERROR_INVALID_DATA;
2700     }
2701     FALSE_RETURN_V_NOLOG(ret == Status::OK, ret);
2702     isOnlyAudio_ = !MetaUtils::CheckHasVideo(globalMeta) && MetaUtils::CheckHasAudio(globalMeta);
2703     std::unique_lock<std::mutex> lock(drmMutex_);
2704     isDrmProtected_ = demuxer_->IsDrmProtected();
2705     MEDIA_LOG_I("Is the source drm-protected : %{public}d", isDrmProtected_);
2706     lock.unlock();
2707     if (hasExtSub_) {
2708         demuxer_->SetSubtitleSource(std::make_shared<MediaSource>(subUrl_));
2709     }
2710     SetBundleName(bundleName_);
2711     demuxer_->OptimizeDecodeSlow(IsEnableOptimizeDecode());
2712     return ret;
2713 }
2714 
Resume()2715 Status HiPlayerImpl::Resume()
2716 {
2717     MediaTrace trace("HiPlayerImpl::Resume");
2718     MEDIA_LOG_I("Resume entered.");
2719     Status ret = Status::OK;
2720     syncManager_->Resume();
2721     ret = pipeline_->Resume();
2722     if (ret != Status::OK) {
2723         UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
2724     }
2725     startTime_ = GetCurrentMillisecond();
2726     return ret;
2727 }
2728 
HandleIsLiveStreamEvent(bool isLiveStream)2729 void HiPlayerImpl::HandleIsLiveStreamEvent(bool isLiveStream)
2730 {
2731     Format format;
2732     callbackLooper_.OnInfo(INFO_TYPE_IS_LIVE_STREAM, isLiveStream, format);
2733 }
2734 
HandleErrorEvent(int32_t errorCode)2735 void HiPlayerImpl::HandleErrorEvent(int32_t errorCode)
2736 {
2737     callbackLooper_.OnError(PLAYER_ERROR, errorCode);
2738 }
2739 
NotifyBufferingStart(int32_t param)2740 void HiPlayerImpl::NotifyBufferingStart(int32_t param)
2741 {
2742     Format format;
2743     isBufferingStartNotified_.store(true);
2744     callbackLooper_.StopReportMediaProgress();
2745     callbackLooper_.ManualReportMediaProgressOnce();
2746     (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_BUFFERING_START), 1);
2747     callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format);
2748 }
2749 
NotifyBufferingEnd(int32_t param)2750 void HiPlayerImpl::NotifyBufferingEnd(int32_t param)
2751 {
2752     MEDIA_LOG_I("NotifyBufferingEnd");
2753     Format format;
2754     isBufferingStartNotified_.store(false);
2755     (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_BUFFERING_END), 1);
2756     callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format);
2757 }
2758 
NotifyCachedDuration(int32_t param)2759 void HiPlayerImpl::NotifyCachedDuration(int32_t param)
2760 {
2761     MEDIA_LOG_D("NotifyCachedDuration");
2762     Format format;
2763     (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_CACHED_DURATION), param);
2764     callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format);
2765 }
2766 
HandleEosFlagState(const Event & event)2767 bool HiPlayerImpl::HandleEosFlagState(const Event& event)
2768 {
2769     bool isAllEos = true;
2770     for (std::pair<std::string, bool>& item: completeState_) {
2771         if (item.first == event.srcFilter) {
2772             MEDIA_LOG_I("one eos event received " PUBLIC_LOG_S, item.first.c_str());
2773             item.second = true;
2774             if (item.first == "AudioSink" && videoDecoder_) {
2775                 videoDecoder_->NotifyAudioComplete();
2776             }
2777         } else if (!item.second) {
2778             MEDIA_LOG_I("expect receive eos event " PUBLIC_LOG_S, item.first.c_str());
2779             isAllEos = false;
2780         }
2781     }
2782     return isAllEos;
2783 }
2784 
HandleCompleteEvent(const Event & event)2785 void HiPlayerImpl::HandleCompleteEvent(const Event& event)
2786 {
2787     MEDIA_LOG_D_SHORT("HandleCompleteEvent");
2788     AutoLock lock(handleCompleteMutex_);
2789     FALSE_RETURN_NOLOG(curState_ != PlayerStateId::STOPPED && HandleEosFlagState(event));
2790     FALSE_RETURN_MSG(!inEosPlayingSeekContinuous_, "Skip complete event in seek continous!");
2791     std::unique_lock<std::mutex> freezeLock(freezeMutex_);
2792     MEDIA_LOG_I("OnComplete looping: " PUBLIC_LOG_D32 ".", singleLoop_.load());
2793     isStreaming_ = false;
2794     Format format;
2795     int32_t curPosMs = 0;
2796     GetCurrentTime(curPosMs);
2797     if ((GetPlayRangeEndTime() == PLAY_RANGE_DEFAULT_VALUE) &&
2798         (durationMs_.load() > curPosMs && abs(durationMs_.load() - curPosMs) < AUDIO_SINK_MAX_LATENCY)) {
2799         MEDIA_LOG_I("OnComplete durationMs - curPosMs: " PUBLIC_LOG_D32, durationMs_.load() - curPosMs);
2800     }
2801     if (!singleLoop_.load()) {
2802         callbackLooper_.StopReportMediaProgress();
2803         StopFlvCheckLiveDelayTime();
2804         callbackLooper_.StopCollectMaxAmplitude();
2805     } else {
2806         inEosSeek_ = true;
2807         eosInLoopForFrozen_ = true;
2808     }
2809     callbackLooper_.DoReportCompletedTime();
2810     if (pipelineStates_ != PlayerStates::PLAYER_FROZEN ||
2811         (pipelineStates_ == PlayerStates::PLAYER_FROZEN && !singleLoop_.load())) {
2812         pipeline_->Pause();
2813     }
2814     if (isSetPlayRange_ && (startTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE ||
2815         endTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE)) {
2816         startTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
2817         endTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
2818         pipeline_->SetPlayRange(startTimeWithMode_, endTimeWithMode_);
2819     }
2820     callbackLooper_.ReportRemainedMaxAmplitude();
2821     if (!singleLoop_.load()) {
2822         OnStateChanged(PlayerStateId::EOS);
2823     } else {
2824         audioHapticsSyncId_++;
2825         ApplyAudioHapticsSyncId();
2826     }
2827     UpdatePlayTotalDuration();
2828     callbackLooper_.OnInfo(INFO_TYPE_EOS, static_cast<int32_t>(singleLoop_.load()), format);
2829     for (std::pair<std::string, bool>& item: completeState_) {
2830         item.second = false;
2831     }
2832 }
2833 
HandleDrmInfoUpdatedEvent(const Event & event)2834 void HiPlayerImpl::HandleDrmInfoUpdatedEvent(const Event& event)
2835 {
2836     MEDIA_LOG_I("HandleDrmInfoUpdatedEvent");
2837 
2838     std::multimap<std::string, std::vector<uint8_t>> drmInfo =
2839         AnyCast<std::multimap<std::string, std::vector<uint8_t>>>(event.param);
2840     uint32_t infoCount = drmInfo.size();
2841     if (infoCount > DrmConstant::DRM_MAX_DRM_INFO_COUNT || infoCount == 0) {
2842         MEDIA_LOG_E("HandleDrmInfoUpdatedEvent info count is invalid");
2843         return;
2844     }
2845     DrmInfoItem *drmInfoArray = new DrmInfoItem[infoCount];
2846     if (drmInfoArray == nullptr) {
2847         MEDIA_LOG_E("HandleDrmInfoUpdatedEvent new drm info failed");
2848         return;
2849     }
2850     int32_t i = 0;
2851     for (auto item : drmInfo) {
2852         uint32_t step = 2;
2853         for (uint32_t j = 0; j < item.first.size(); j += step) {
2854             std::string byteString = item.first.substr(j, step);
2855             unsigned char byte = (unsigned char)strtol(byteString.c_str(), NULL, 16);
2856             drmInfoArray[i].uuid[j / step] = byte;
2857         }
2858 
2859         errno_t ret = memcpy_s(drmInfoArray[i].pssh, sizeof(drmInfoArray[i].pssh),
2860             item.second.data(), item.second.size());
2861         if (ret != EOK) {
2862             MEDIA_LOG_E("HandleDrmInfoUpdatedEvent memcpy drm info pssh failed");
2863             delete []drmInfoArray;
2864             return;
2865         }
2866         drmInfoArray[i].psshLen = item.second.size();
2867         i++;
2868     }
2869 
2870     // report event
2871     Format format;
2872     size_t drmInfoSize = static_cast<size_t>(infoCount) * sizeof(DrmInfoItem);
2873     (void) format.PutBuffer(PlayerKeys::PLAYER_DRM_INFO_ADDR,
2874         reinterpret_cast<const uint8_t *>(drmInfoArray), drmInfoSize);
2875     (void) format.PutIntValue(PlayerKeys::PLAYER_DRM_INFO_COUNT, static_cast<int32_t>(infoCount));
2876     callbackLooper_.OnInfo(INFO_TYPE_DRM_INFO_UPDATED, static_cast<int32_t>(singleLoop_.load()), format);
2877 
2878     delete []drmInfoArray;
2879 }
2880 
HandleResolutionChangeEvent(const Event & event)2881 void HiPlayerImpl::HandleResolutionChangeEvent(const Event& event)
2882 {
2883 #ifdef SUPPORT_VIDEO
2884     // update new video size
2885     std::pair<int32_t, int32_t> videoSize = AnyCast<std::pair<int32_t, int32_t>>(event.param);
2886     int32_t width = videoSize.first;
2887     int32_t height = videoSize.second;
2888 
2889     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2890     if (currentVideoTrackId_ >= 0 && currentVideoTrackId_ < static_cast<int32_t>(metaInfo.size())) {
2891         double videoSar;
2892         bool ret = metaInfo[currentVideoTrackId_]->GetData(Tag::VIDEO_SAR, videoSar);
2893         if (ret) {
2894             height = (videoSar > 1) ? static_cast<int32_t>(height / videoSar) : height;
2895             width = (videoSar < 1) ? static_cast<int32_t>(width * videoSar) : width;
2896         }
2897     }
2898 
2899     videoWidth_ = !needSwapWH_.load() ? width : height;
2900     videoHeight_ = !needSwapWH_.load() ? height : width;
2901     MEDIA_LOG_I("HandleResolutionChangeEvent, width = %{public}d, height = %{public}d",
2902         videoWidth_.load(), videoHeight_.load());
2903     // notify size change
2904     NotifyResolutionChange();
2905 #endif
2906 }
2907 
HandleBitrateStartEvent(const Event & event)2908 void HiPlayerImpl::HandleBitrateStartEvent(const Event& event)
2909 {
2910 #ifdef SUPPORT_VIDEO
2911     uint32_t bitrate = AnyCast<uint32_t>(event.param);
2912     MEDIA_LOG_I("HandleBitrateStartEvent in, bitrate is " PUBLIC_LOG_U32, bitrate);
2913     FALSE_RETURN(videoDecoder_ != nullptr);
2914     videoDecoder_->SetBitrateStart();
2915 #endif
2916 }
2917 
NotifySubtitleUpdate(const Event & event)2918 void HiPlayerImpl::NotifySubtitleUpdate(const Event& event)
2919 {
2920     Format format = AnyCast<Format>(event.param);
2921     if (needUpdateSubtitle_.load()) {
2922         callbackLooper_.OnInfo(INFO_TYPE_SUBTITLE_UPDATE_INFO, 0, format);
2923     }
2924 }
2925 
NotifyDecoderErrorFrame(int64_t pts)2926 void HiPlayerImpl::NotifyDecoderErrorFrame(int64_t pts)
2927 {
2928     FALSE_RETURN_MSG(demuxer_ != nullptr, "DemuxerFilter is nullptr");
2929     demuxer_->HandleDecoderErrorFrame(pts);
2930 }
2931 
UpdateStateNoLock(PlayerStates newState,bool notifyUpward,bool isSystemOperation)2932 void HiPlayerImpl::UpdateStateNoLock(PlayerStates newState, bool notifyUpward, bool isSystemOperation)
2933 {
2934     if (pipelineStates_ == newState) {
2935         return;
2936     }
2937     pipelineStates_ = newState;
2938     if (pipelineStates_ == PlayerStates::PLAYER_IDLE || pipelineStates_ == PlayerStates::PLAYER_PREPARING) {
2939         MEDIA_LOG_D_SHORT("do not report idle and preparing since av player doesn't need report idle and preparing");
2940         return;
2941     }
2942     if (notifyUpward) {
2943         if (callbackLooper_.IsStarted()) {
2944             Format format;
2945             if (isSystemOperation) {
2946                 format.PutIntValue(PlayerKeys::PLAYER_STATE_CHANGED_REASON, StateChangeReason::BACKGROUND);
2947             }
2948             while (!pendingStates_.empty()) {
2949                 auto pendingState = pendingStates_.front();
2950                 pendingStates_.pop();
2951                 MEDIA_LOG_I("sending pending state change: " PUBLIC_LOG_S, StringnessPlayerState(pendingState).c_str());
2952                 callbackLooper_.OnInfo(INFO_TYPE_STATE_CHANGE, pendingState, format);
2953             }
2954             MEDIA_LOG_I("sending newest state change: " PUBLIC_LOG_S,
2955                     StringnessPlayerState(pipelineStates_.load()).c_str());
2956             callbackLooper_.OnInfo(INFO_TYPE_STATE_CHANGE, pipelineStates_, format);
2957         } else {
2958             pendingStates_.push(newState);
2959         }
2960     }
2961 }
2962 
NotifyBufferingUpdate(const std::string_view & type,int32_t param)2963 void HiPlayerImpl::NotifyBufferingUpdate(const std::string_view& type, int32_t param)
2964 {
2965     Format format;
2966     format.PutIntValue(std::string(type), param);
2967     MEDIA_LOG_D("NotifyBufferingUpdate param " PUBLIC_LOG_D32, param);
2968     callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, durationMs_.load(), format);
2969 }
2970 
NotifyDurationUpdate(const std::string_view & type,int32_t param)2971 void HiPlayerImpl::NotifyDurationUpdate(const std::string_view& type, int32_t param)
2972 {
2973     Format format;
2974     format.PutIntValue(std::string(type), param);
2975     MEDIA_LOG_I("NotifyDurationUpdate " PUBLIC_LOG_D64, durationMs_.load());
2976     callbackLooper_.OnInfo(INFO_TYPE_DURATION_UPDATE, durationMs_.load(), format);
2977 }
2978 
NotifySeekDone(int32_t seekPos)2979 void HiPlayerImpl::NotifySeekDone(int32_t seekPos)
2980 {
2981     MediaTrace trace(std::string("HiPlayerImpl::NotifySeekDone, seekPos: ") + to_string(seekPos));
2982     Format format;
2983     // Report position firstly to make sure that client can get real position when seek done in playing state.
2984     if (curState_ == PlayerStateId::PLAYING) {
2985         std::unique_lock<std::mutex> lock(seekMutex_);
2986         syncManager_->seekCond_.wait_for(
2987             lock,
2988             std::chrono::milliseconds(PLAYING_SEEK_WAIT_TIME),
2989             [this]() {
2990                 return !syncManager_->InSeeking();
2991             });
2992     }
2993     auto startTime = std::chrono::steady_clock::now();
2994     demuxer_->WaitForBufferingEnd();
2995     auto endTime = std::chrono::steady_clock::now();
2996     auto waitTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
2997     MEDIA_LOG_D_SHORT("NotifySeekDone WaitForBufferingEnd: %{public}d ms", static_cast<int32_t>(waitTime));
2998     if (isSeekClosest_.load()) {
2999         isSeekClosest_.store(false);
3000         if (isBufferingStartNotified_.load()) {
3001             MEDIA_LOG_I_SHORT("SEEK_CLOSEST BUFFERING_END PLAYING");
3002             NotifyBufferingEnd(NOTIFY_BUFFERING_END_PARAM);
3003         }
3004     }
3005 
3006     MEDIA_LOG_D_SHORT("NotifySeekDone seekPos: %{public}d", seekPos);
3007     syncManager_->UpdataPausedMediaTime(seekPos);
3008     callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, seekPos, format);
3009     callbackLooper_.OnInfo(INFO_TYPE_SEEKDONE, seekPos, format);
3010 }
3011 
NotifyAudioInterrupt(const Event & event)3012 void HiPlayerImpl::NotifyAudioInterrupt(const Event& event)
3013 {
3014     Format format;
3015     auto interruptEvent = AnyCast<AudioStandard::InterruptEvent>(event.param);
3016     int32_t hintType = interruptEvent.hintType;
3017     int32_t forceType = interruptEvent.forceType;
3018     int32_t eventType = interruptEvent.eventType;
3019     MEDIA_LOG_I("NotifyAudioInterrupt eventType: %{public}d, hintType: %{public}d, forceType: %{public}d",
3020         eventType, hintType, forceType);
3021     if (forceType == OHOS::AudioStandard::INTERRUPT_FORCE) {
3022         if (hintType == OHOS::AudioStandard::INTERRUPT_HINT_PAUSE
3023             || hintType == OHOS::AudioStandard::INTERRUPT_HINT_STOP) {
3024             std::unique_lock<std::mutex> freezeLock(freezeMutex_);
3025             isHintPauseReceived_ = true;
3026             Status ret = Status::OK;
3027             ret = pipeline_->Pause();
3028             syncManager_->Pause();
3029             if (ret != Status::OK) {
3030                 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
3031             }
3032             callbackLooper_.StopReportMediaProgress();
3033             StopFlvCheckLiveDelayTime();
3034             callbackLooper_.StopCollectMaxAmplitude();
3035         }
3036     }
3037     {
3038         AutoLock lock(interruptMutex_);
3039         if (isSaveInterruptEventNeeded_.load() && isHintPauseReceived_
3040             && eventType == OHOS::AudioStandard::INTERRUPT_TYPE_END
3041             && forceType == OHOS::AudioStandard::INTERRUPT_SHARE
3042             && hintType == OHOS::AudioStandard::INTERRUPT_HINT_RESUME) {
3043             interruptNotifyPlay_.store(true);
3044             interruptEvent_ = interruptEvent;
3045             return;
3046         }
3047         isSaveInterruptEventNeeded_.store(true);
3048     }
3049     (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_TYPE, eventType);
3050     (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_FORCE, forceType);
3051     (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_HINT, hintType);
3052     callbackLooper_.OnInfo(INFO_TYPE_INTERRUPT_EVENT, hintType, format);
3053     if (forceType == OHOS::AudioStandard::INTERRUPT_FORCE) {
3054         if (hintType == OHOS::AudioStandard::INTERRUPT_HINT_PAUSE
3055             || hintType == OHOS::AudioStandard::INTERRUPT_HINT_STOP) {
3056             callbackLooper_.OnSystemOperation(OPERATION_TYPE_PAUSE, OPERATION_REASON_AUDIO_INTERRUPT);
3057         }
3058     }
3059 }
3060 
NotifyAudioDeviceChange(const Event & event)3061 void HiPlayerImpl::NotifyAudioDeviceChange(const Event& event)
3062 {
3063     MEDIA_LOG_I("NotifyAudioDeviceChange");
3064     auto [deviceInfo, reason] = AnyCast<std::pair<AudioStandard::AudioDeviceDescriptor,
3065         AudioStandard::AudioStreamDeviceChangeReason>>(event.param);
3066     Format format;
3067     Parcel parcel;
3068     deviceInfo.Marshalling(parcel);
3069     auto parcelSize = parcel.GetReadableBytes();
3070     (void)format.PutBuffer(PlayerKeys::AUDIO_DEVICE_CHANGE,
3071         parcel.ReadBuffer(parcelSize), parcelSize);
3072     format.PutIntValue(PlayerKeys::AUDIO_DEVICE_CHANGE_REASON, static_cast<int32_t>(reason));
3073     callbackLooper_.OnInfo(INFO_TYPE_AUDIO_DEVICE_CHANGE, static_cast<int32_t>(reason), format);
3074 }
3075 
NotifyAudioServiceDied()3076 void HiPlayerImpl::NotifyAudioServiceDied()
3077 {
3078     Format format;
3079     callbackLooper_.OnInfo(INFO_TYPE_ERROR_MSG, MSERR_EXT_API9_IO, format);
3080 }
3081 
NotifyAudioFirstFrame(const Event & event)3082 void HiPlayerImpl::NotifyAudioFirstFrame(const Event& event)
3083 {
3084     uint64_t latency = AnyCast<uint64_t>(event.param);
3085     MEDIA_LOG_I("Audio first frame event in latency " PUBLIC_LOG_U64, latency);
3086     Format format;
3087     (void)format.PutLongValue(PlayerKeys::AUDIO_FIRST_FRAME, latency);
3088     callbackLooper_.OnInfo(INFO_TYPE_AUDIO_FIRST_FRAME, 0, format);
3089 }
3090 
NotifyResolutionChange()3091 void HiPlayerImpl::NotifyResolutionChange()
3092 {
3093 #ifdef SUPPORT_VIDEO
3094     Format format;
3095     int32_t width = videoWidth_.load();
3096     int32_t height = videoHeight_.load();
3097     (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_WIDTH), width);
3098     (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_HEIGHT), height);
3099     MEDIA_LOG_I("video size change, width %{public}d, height %{public}d", width, height);
3100     callbackLooper_.OnInfo(INFO_TYPE_RESOLUTION_CHANGE, 0, format);
3101 #endif
3102 }
3103 
NotifyPositionUpdate()3104 void HiPlayerImpl::NotifyPositionUpdate()
3105 {
3106     int32_t currentPosMs = 0;
3107     GetCurrentTime(currentPosMs);
3108     MEDIA_LOG_D("NotifyPositionUpdate currentPosMs: %{public}d", currentPosMs);
3109     Format format;
3110     callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, currentPosMs, format);
3111 }
3112 
NotifyUpdateTrackInfo()3113 void HiPlayerImpl::NotifyUpdateTrackInfo()
3114 {
3115     std::vector<Format> trackInfo;
3116     GetVideoTrackInfo(trackInfo);
3117     GetAudioTrackInfo(trackInfo);
3118     GetSubtitleTrackInfo(trackInfo);
3119 
3120     Format body;
3121     body.PutFormatVector(std::string(PlayerKeys::PLAYER_TRACK_INFO), trackInfo);
3122     MEDIA_LOG_I("NotifyUpdateTrackInfo");
3123 
3124     callbackLooper_.OnInfo(INFO_TYPE_TRACK_INFO_UPDATE, 0, body);
3125 }
3126 
NotifySuperResolutionChanged(const Event & event)3127 void HiPlayerImpl::NotifySuperResolutionChanged(const Event& event)
3128 {
3129 #ifdef SUPPORT_VIDEO
3130     MEDIA_LOG_D("NotifySuperResolutionChanged");
3131     int32_t enabled = AnyCast<bool>(event.param);
3132 
3133     Format format;
3134     format.PutIntValue(PlayerKeys::SUPER_RESOLUTION_ENABLED, static_cast<int32_t>(enabled));
3135     callbackLooper_.OnInfo(INFO_TYPE_SUPER_RESOLUTION_CHANGED, 0, format);
3136 #endif
3137     return;
3138 }
3139 
HandleAudioTrackChangeEvent(const Event & event)3140 void HiPlayerImpl::HandleAudioTrackChangeEvent(const Event& event)
3141 {
3142     int32_t trackId = AnyCast<int32_t>(event.param);
3143     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
3144     std::string mime;
3145     FALSE_RETURN_MSG(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
3146         "HandleAudioTrackChangeEvent trackId invalid");
3147     if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
3148         MEDIA_LOG_E("HandleAudioTrackChangeEvent trackId " PUBLIC_LOG_D32 "get mime error", trackId);
3149         return;
3150     }
3151     if (IsAudioMime(mime)) {
3152         if (Status::OK != audioDecoder_->ChangePlugin(metaInfo[trackId])) {
3153             MEDIA_LOG_E("HandleAudioTrackChangeEvent audioDecoder change plugin error");
3154             return;
3155         }
3156         // Firstly, clear obsolete data first to avoid cacophony of noise. Then start audio decoder and audio sink.
3157         audioDecoder_->DoFlush();
3158         audioSink_->DoFlush();
3159         audioDecoder_->Start();
3160         if (IsNeedAudioSinkChangeTrack(metaInfo, trackId)) {
3161             MEDIA_LOG_I("AudioSink changeTrack in");
3162             if (Status::OK != audioSink_->ChangeTrack(metaInfo[trackId])) {
3163                 MEDIA_LOG_E("HandleAudioTrackChangeEvent audioSink change track error");
3164                 return;
3165             }
3166         }
3167         if (Status::OK != demuxer_->StartTask(trackId)) {
3168             MEDIA_LOG_E("HandleAudioTrackChangeEvent StartTask error. trackId is " PUBLIC_LOG_D32, trackId);
3169             return;
3170         }
3171         Format audioTrackInfo {};
3172         audioTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackId));
3173         audioTrackInfo.PutIntValue("track_is_select", 1);
3174         callbackLooper_.OnInfo(INFO_TYPE_TRACKCHANGE, 0, audioTrackInfo);
3175         currentAudioTrackId_ = trackId;
3176 
3177         NotifyUpdateTrackInfo();
3178     }
3179     return;
3180 }
3181 
HandleVideoTrackChangeEvent(const Event & event)3182 void HiPlayerImpl::HandleVideoTrackChangeEvent(const Event& event)
3183 {
3184 #ifdef SUPPORT_VIDEO
3185     int32_t trackId = AnyCast<int32_t>(event.param);
3186     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
3187     std::string mime;
3188     FALSE_RETURN_MSG(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
3189         "HandleVideoTrackChangeEvent trackId invalid");
3190     if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
3191         MEDIA_LOG_E("HandleVideoTrackChangeEvent trackId " PUBLIC_LOG_D32 "get mime error", trackId);
3192         return;
3193     }
3194     if (IsVideoMime(mime)) {
3195         if (Status::OK != demuxer_->StartTask(trackId)) {
3196             MEDIA_LOG_E("HandleVideoTrackChangeEvent StartTask error. trackId is " PUBLIC_LOG_D32, trackId);
3197             return;
3198         }
3199         Format videoTrackInfo {};
3200         videoTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackId));
3201         videoTrackInfo.PutIntValue("track_is_select", 1);
3202         callbackLooper_.OnInfo(INFO_TYPE_TRACKCHANGE, 0, videoTrackInfo);
3203         currentVideoTrackId_ = trackId;
3204     }
3205 #endif
3206     return;
3207 }
3208 
HandleSubtitleTrackChangeEvent(const Event & event)3209 void HiPlayerImpl::HandleSubtitleTrackChangeEvent(const Event& event)
3210 {
3211     int32_t trackId = AnyCast<int32_t>(event.param);
3212     std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
3213     std::string mime;
3214     FALSE_RETURN_MSG(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
3215         "HandleSubtitleTrackChangeEvent trackId invalid");
3216     if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
3217         MEDIA_LOG_E("HandleSubtitleTrackChangeEvent trackId " PUBLIC_LOG_D32 "get mime error", trackId);
3218         return;
3219     }
3220     if (IsSubtitleMime(mime)) {
3221         if (Status::OK != subtitleSink_->DoFlush()) {
3222             MEDIA_LOG_E("HandleSubtitleTrackChangeEvent DoFlush error");
3223             return;
3224         }
3225         if (Status::OK != demuxer_->StartTask(trackId)) {
3226             MEDIA_LOG_E("HandleSubtitleTrackChangeEvent StartTask error. trackId is " PUBLIC_LOG_D32, trackId);
3227             return;
3228         }
3229         Format subtitleTrackInfo {};
3230         subtitleTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackId));
3231         subtitleTrackInfo.PutIntValue("track_is_select", 1);
3232         callbackLooper_.OnInfo(INFO_TYPE_TRACKCHANGE, 0, subtitleTrackInfo);
3233         currentSubtitleTrackId_ = trackId;
3234         needUpdateSubtitle_.store(true);
3235     }
3236     return;
3237 }
3238 
OnStateChanged(PlayerStateId state,bool isSystemOperation)3239 void __attribute__((no_sanitize("cfi"))) HiPlayerImpl::OnStateChanged(PlayerStateId state, bool isSystemOperation)
3240 {
3241     {
3242         AutoLock lockEos(stateChangeMutex_);
3243         if (isDoCompletedSeek_.load()) {
3244             isDoCompletedSeek_ = false;
3245         } else if ((curState_ == PlayerStateId::EOS) && (state == PlayerStateId::PAUSE)) {
3246             MEDIA_LOG_E("already at completed and not allow pause");
3247             return;
3248         } else if ((curState_ == PlayerStateId::ERROR) && (state == PlayerStateId::READY)) {
3249             MEDIA_LOG_E("already at error and not allow ready");
3250             return;
3251         }
3252         curState_ = state;
3253     }
3254     MEDIA_LOG_D_SHORT("OnStateChanged " PUBLIC_LOG_D32 " > " PUBLIC_LOG_D32, pipelineStates_.load(),
3255             TransStateId2PlayerState(state));
3256     UpdateStateNoLock(TransStateId2PlayerState(state), true, isSystemOperation);
3257     {
3258         AutoLock lock(stateMutex_);
3259         cond_.NotifyOne();
3260     }
3261 }
3262 
OnCallback(std::shared_ptr<Filter> filter,const FilterCallBackCommand cmd,StreamType outType)3263 Status HiPlayerImpl::OnCallback(std::shared_ptr<Filter> filter, const FilterCallBackCommand cmd, StreamType outType)
3264 {
3265     MEDIA_LOG_D_SHORT("HiPlayerImpl::OnCallback filter, outType: %{public}d", outType);
3266     if (cmd == FilterCallBackCommand::NEXT_FILTER_NEEDED) {
3267         switch (outType) {
3268             case StreamType::STREAMTYPE_SUBTITLE:
3269                 return LinkSubtitleSinkFilter(filter, outType);
3270             case StreamType::STREAMTYPE_RAW_AUDIO:
3271                 return LinkAudioSinkFilter(filter, outType);
3272             case StreamType::STREAMTYPE_ENCODED_AUDIO:
3273                 return LinkAudioDecoderFilter(filter, outType);
3274 #ifdef SUPPORT_VIDEO
3275             case StreamType::STREAMTYPE_RAW_VIDEO:
3276                 break;
3277             case StreamType::STREAMTYPE_ENCODED_VIDEO:
3278                 return LinkVideoDecoderFilter(filter, outType);
3279 #endif
3280             default:
3281                 break;
3282         }
3283     }
3284     return Status::OK;
3285 }
3286 
OnDumpInfo(int32_t fd)3287 void HiPlayerImpl::OnDumpInfo(int32_t fd)
3288 {
3289     MEDIA_LOG_D("HiPlayerImpl::OnDumpInfo called.");
3290     if (audioDecoder_ != nullptr) {
3291         audioDecoder_->OnDumpInfo(fd);
3292     }
3293     if (demuxer_ != nullptr) {
3294         demuxer_->OnDumpInfo(fd);
3295     }
3296 #ifdef SUPPORT_VIDEO
3297     if (videoDecoder_ != nullptr) {
3298         videoDecoder_->OnDumpInfo(fd);
3299     }
3300 #endif
3301 }
3302 
LinkAudioDecoderFilter(const std::shared_ptr<Filter> & preFilter,StreamType type)3303 Status HiPlayerImpl::LinkAudioDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
3304 {
3305     MediaTrace trace("HiPlayerImpl::LinkAudioDecoderFilter");
3306     MEDIA_LOG_I_SHORT("HiPlayerImpl::LinkAudioDecoderFilter");
3307     FALSE_RETURN_V(audioDecoder_ == nullptr, Status::OK);
3308 
3309     audioDecoder_ = FilterFactory::Instance().CreateFilter<AudioDecoderFilter>("player.audiodecoder",
3310         FilterType::FILTERTYPE_ADEC);
3311     FALSE_RETURN_V(audioDecoder_ != nullptr, Status::ERROR_NULL_POINTER);
3312     FALSE_GOON_NOEXEC(demuxer_, audioDecoder_->UpdateIsAsyncMode(demuxer_->IsAudioDemuxDecodeAsync()));
3313     interruptMonitor_->RegisterListener(audioDecoder_);
3314     audioDecoder_->Init(playerEventReceiver_, playerFilterCallback_);
3315 
3316     audioDecoder_->SetCallerInfo(instanceId_, bundleName_);
3317     audioDecoder_->SetDumpFlag(isDump_);
3318     // set decrypt config for drm audios
3319     if (isDrmProtected_) {
3320         MEDIA_LOG_D("HiPlayerImpl::LinkAudioDecoderFilter will SetDecryptConfig");
3321         std::unique_lock<std::mutex> lock(drmMutex_);
3322         static constexpr int32_t timeout = 5;
3323         bool notTimeout = drmConfigCond_.wait_for(lock, std::chrono::seconds(timeout), [this]() {
3324             return this->isDrmPrepared_ || this->stopWaitingDrmConfig_;
3325         });
3326         if (notTimeout && isDrmPrepared_) {
3327             MEDIA_LOG_I("LinkAudioDecoderFilter will SetDecryptConfig");
3328 #ifdef SUPPORT_AVPLAYER_DRM
3329             bool svpFlag = svpMode_ == HiplayerSvpMode::SVP_TRUE ? true : false;
3330             audioDecoder_->SetDecryptionConfig(keySessionServiceProxy_, svpFlag);
3331 #endif
3332         } else {
3333             MEDIA_LOG_E("HiPlayerImpl Drmcond wait timeout or has been stopped! Play drm protected audio failed!");
3334             return Status::ERROR_INVALID_OPERATION;
3335         }
3336     } else {
3337         MEDIA_LOG_D("HiPlayerImpl::LinkAudioDecoderFilter, and it's not drm-protected.");
3338     }
3339 #ifdef SUPPORT_START_STOP_ON_DEMAND
3340     return pipeline_->LinkFilters(preFilter, {audioDecoder_}, type, true);
3341 #else
3342     return pipeline_->LinkFilters(preFilter, {audioDecoder_}, type, isOnlyAudio_);
3343 #endif
3344 }
3345 
LinkAudioSinkFilter(const std::shared_ptr<Filter> & preFilter,StreamType type)3346 Status HiPlayerImpl::LinkAudioSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
3347 {
3348     MediaTrace trace("HiPlayerImpl::LinkAudioSinkFilter");
3349     MEDIA_LOG_I("HiPlayerImpl::LinkAudioSinkFilter");
3350     FALSE_RETURN_V(audioSink_ == nullptr, Status::OK);
3351 
3352     audioSink_ = FilterFactory::Instance().CreateFilter<AudioSinkFilter>("player.audiosink",
3353         FilterType::FILTERTYPE_ASINK);
3354     FALSE_RETURN_V(audioSink_ != nullptr, Status::ERROR_NULL_POINTER);
3355     FALSE_GOON_NOEXEC(demuxer_, audioSink_->SetIsAudioDemuxDecodeAsync(demuxer_->IsAudioDemuxDecodeAsync()));
3356     audioSink_->Init(playerEventReceiver_, playerFilterCallback_, interruptMonitor_);
3357     audioSink_->SetMaxAmplitudeCbStatus(maxAmplitudeCbStatus_);
3358     audioSink_->SetPerfRecEnabled(isPerfRecEnabled_);
3359     audioSink_->SetIsCalledBySystemApp(isCalledBySystemApp_);
3360     if (demuxer_ != nullptr && audioRenderInfo_ == nullptr) {
3361         std::vector<std::shared_ptr<Meta>> trackInfos = demuxer_->GetStreamMetaInfo();
3362         SetDefaultAudioRenderInfo(trackInfos);
3363     }
3364     SetAudioRendererParameter();
3365     audioSink_->SetSyncCenter(syncManager_);
3366 
3367     completeState_.emplace_back(std::make_pair("AudioSink", false));
3368     initialAVStates_.emplace_back(std::make_pair(EventType::EVENT_AUDIO_FIRST_FRAME, false));
3369 #ifdef SUPPORT_START_STOP_ON_DEMAND
3370     auto res = pipeline_->LinkFilters(preFilter, {audioSink_}, type, true);
3371 #else
3372     auto res = pipeline_->LinkFilters(preFilter, {audioSink_}, type, isOnlyAudio_);
3373 #endif
3374     if (mutedMediaType_ == OHOS::Media::MediaType::MEDIA_TYPE_AUD) {
3375         audioSink_->SetMuted(true);
3376     }
3377     return res;
3378 }
3379 
SetAudioRendererParameter()3380 void HiPlayerImpl::SetAudioRendererParameter()
3381 {
3382     if (audioRenderInfo_ != nullptr) {
3383         audioSink_->SetParameter(audioRenderInfo_);
3384     }
3385     if (audioInterruptMode_ != nullptr) {
3386         audioSink_->SetParameter(audioInterruptMode_);
3387     }
3388     SetVolumeMode(volumeMode_);
3389     std::shared_ptr<Meta> globalMeta = std::make_shared<Meta>();
3390     if (demuxer_ != nullptr) {
3391         globalMeta = demuxer_->GetGlobalMetaInfo();
3392     }
3393     if (globalMeta != nullptr) {
3394         globalMeta->SetData(Tag::APP_PID, appPid_);
3395         globalMeta->SetData(Tag::APP_UID, appUid_);
3396         if (audioRenderInfo_ != nullptr) {
3397             for (MapIt iter = audioRenderInfo_->begin(); iter != audioRenderInfo_->end(); iter++) {
3398                 globalMeta->SetData(iter->first, iter->second);
3399             }
3400         }
3401         if (audioInterruptMode_ != nullptr) {
3402             for (MapIt iter = audioInterruptMode_->begin(); iter != audioInterruptMode_->end(); iter++) {
3403                 globalMeta->SetData(iter->first, iter->second);
3404             }
3405         }
3406         audioSink_->SetParameter(globalMeta);
3407     }
3408 }
3409 
IsLiveStream()3410 bool HiPlayerImpl::IsLiveStream()
3411 {
3412     FALSE_RETURN_V_NOLOG(demuxer_ != nullptr, false);
3413     auto globalMeta = demuxer_->GetGlobalMetaInfo();
3414     FALSE_RETURN_V_NOLOG(globalMeta != nullptr, false);
3415     return globalMeta->Find(Tag::MEDIA_DURATION) == globalMeta->end();
3416 }
3417 
3418 #ifdef SUPPORT_VIDEO
LinkSeiDecoder(const std::shared_ptr<Filter> & preFilter,StreamType type)3419 Status HiPlayerImpl::LinkSeiDecoder(const std::shared_ptr<Filter>& preFilter, StreamType type)
3420 {
3421     MEDIA_LOG_I("Link SeiParserFilterFilter Enter.");
3422     if (seiDecoder_ == nullptr) {
3423         seiDecoder_ = FilterFactory::Instance().CreateFilter<SeiParserFilter>("player.sei", FilterType::FILTERTYPE_SEI);
3424         FALSE_RETURN_V(seiDecoder_ != nullptr, Status::ERROR_NULL_POINTER);
3425         seiDecoder_->Init(playerEventReceiver_, playerFilterCallback_);
3426         seiDecoder_->SetSeiMessageCbStatus(seiMessageCbStatus_, payloadTypes_);
3427         seiDecoder_->SetSyncCenter(syncManager_);
3428         interruptMonitor_->RegisterListener(seiDecoder_);
3429     }
3430     return pipeline_->LinkFilters(preFilter, {seiDecoder_}, type);
3431 }
3432 
LinkVideoDecoderFilter(const std::shared_ptr<Filter> & preFilter,StreamType type)3433 Status HiPlayerImpl::LinkVideoDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
3434 {
3435     MediaTrace trace("HiPlayerImpl::LinkVideoDecoderFilter");
3436     MEDIA_LOG_I("LinkVideoDecoderFilter");
3437     if (surface_ == nullptr && seiMessageCbStatus_ && IsLiveStream()) {
3438         return LinkSeiDecoder(preFilter, type);
3439     }
3440     if (videoDecoder_ == nullptr) {
3441         Status ret = InitVideoDecoder();
3442         FALSE_RETURN_V_NOLOG(ret == Status::OK, ret);
3443     }
3444     completeState_.emplace_back(std::make_pair("VideoSink", false));
3445     initialAVStates_.emplace_back(std::make_pair(EventType::EVENT_VIDEO_RENDERING_START, false));
3446     bool needInit = isForceLoadVideo_ || (surface_ != nullptr && !isVideoMuted_
3447             && mutedMediaType_ != OHOS::Media::MediaType::MEDIA_TYPE_VID);
3448     if (!needInit) {
3449         videoDecoder_->SetMediaMuted(true, false);
3450     }
3451     isVideoDecoderInited_ = needInit;
3452 #ifdef SUPPORT_START_STOP_ON_DEMAND
3453     return pipeline_->LinkFilters(preFilter, {videoDecoder_}, type, true, needInit);
3454 #else
3455     return pipeline_->LinkFilters(preFilter, {videoDecoder_}, type, false, needInit);
3456 #endif
3457 }
3458 #endif
3459 
LinkSubtitleSinkFilter(const std::shared_ptr<Filter> & preFilter,StreamType type)3460 Status HiPlayerImpl::LinkSubtitleSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
3461 {
3462     MediaTrace trace("HiPlayerImpl::LinkSubtitleSinkFilter");
3463     FALSE_RETURN_V(subtitleSink_ == nullptr, Status::OK);
3464     subtitleSink_ = FilterFactory::Instance().CreateFilter<SubtitleSinkFilter>("player.subtitlesink",
3465         FilterType::FILTERTYPE_SSINK);
3466     FALSE_RETURN_V(subtitleSink_ != nullptr, Status::ERROR_NULL_POINTER);
3467     subtitleSink_->Init(playerEventReceiver_, playerFilterCallback_, interruptMonitor_);
3468     std::shared_ptr<Meta> globalMeta = std::make_shared<Meta>();
3469     if (demuxer_ != nullptr) {
3470         globalMeta = demuxer_->GetGlobalMetaInfo();
3471     }
3472     if (globalMeta != nullptr) {
3473         subtitleSink_->SetParameter(globalMeta);
3474     }
3475     subtitleSink_->SetSyncCenter(syncManager_);
3476     return pipeline_->LinkFilters(preFilter, {subtitleSink_}, type);
3477 }
3478 
SetMediaMuted(OHOS::Media::MediaType mediaType,bool isMuted)3479 int32_t HiPlayerImpl::SetMediaMuted(OHOS::Media::MediaType mediaType, bool isMuted)
3480 {
3481     MEDIA_LOG_D("SetMediaMuted %{public}d %{public}d", static_cast<int32_t>(mediaType), isMuted);
3482     if (mediaType == OHOS::Media::MediaType::MEDIA_TYPE_AUD) {
3483         FALSE_RETURN_V(audioSink_ != nullptr, MSERR_NO_MEMORY);
3484         auto res = audioSink_->SetMuted(isMuted);
3485         return res == Status::OK ? MSERR_OK : MSERR_INVALID_OPERATION;
3486     } else if (mediaType == OHOS::Media::MediaType::MEDIA_TYPE_VID) {
3487         if (demuxer_ != nullptr) {
3488             demuxer_->SetMediaMuted(mediaType, isMuted);
3489         }
3490         if (videoDecoder_ != nullptr) {
3491             videoDecoder_->SetMediaMuted(isMuted, true);
3492         }
3493         bool needReinit = !isMuted && surface_ != nullptr && (isVideoMuted_ != isMuted ||
3494             (!isVideoDecoderInited_ && mutedMediaType_ == OHOS::Media::MediaType::MEDIA_TYPE_VID));
3495         isVideoMuted_ = isMuted;
3496         FALSE_RETURN_V_NOLOG(needReinit, MSERR_OK);
3497         MEDIA_LOG_I("HiPlayerImpl::SetMediaMuted init video decoder");
3498         FALSE_RETURN_V_NOLOG(videoDecoder_ != nullptr, MSERR_OK);
3499         videoDecoder_->ReInitAndStart();
3500         isVideoDecoderInited_ = true;
3501         return MSERR_OK;
3502     }
3503     return MSERR_INVALID_VAL;
3504 }
3505 
SetPlaybackStrategy(AVPlayStrategy playbackStrategy)3506 int32_t HiPlayerImpl::SetPlaybackStrategy(AVPlayStrategy playbackStrategy)
3507 {
3508     mutedMediaType_ = playbackStrategy.mutedMediaType;
3509     preferedWidth_ = playbackStrategy.preferredWidth;
3510     preferedHeight_ = playbackStrategy.preferredHeight;
3511     bufferDuration_ = playbackStrategy.preferredBufferDuration;
3512     preferHDR_ = playbackStrategy.preferredHdr;
3513     renderFirstFrame_ = playbackStrategy.showFirstFrameOnPrepare;
3514     audioLanguage_ = playbackStrategy.preferredAudioLanguage;
3515     subtitleLanguage_ = playbackStrategy.preferredSubtitleLanguage;
3516     videoPostProcessorType_ = playbackStrategy.enableSuperResolution ? VideoPostProcessorType::SUPER_RESOLUTION
3517                                 : VideoPostProcessorType::NONE;
3518     enableCameraPostprocessing_ = playbackStrategy.enableCameraPostprocessing;
3519     isPostProcessorOn_ = playbackStrategy.enableSuperResolution;
3520     keepDecodingOnMute_ = playbackStrategy.keepDecodingOnMute;
3521 
3522     SetFlvLiveParams(playbackStrategy);
3523     FALSE_RETURN_V(IsLivingMaxDelayTimeValid(), TransStatus(Status::ERROR_INVALID_PARAMETER));
3524     return MSERR_OK;
3525 }
3526 
SetSuperResolution(bool enabled)3527 int32_t HiPlayerImpl::SetSuperResolution(bool enabled)
3528 {
3529     FALSE_RETURN_V(videoPostProcessorType_ == VideoPostProcessorType::SUPER_RESOLUTION,
3530         MSERR_SUPER_RESOLUTION_NOT_ENABLED);
3531     isPostProcessorOn_ = enabled;
3532     FALSE_RETURN_V_NOLOG(videoDecoder_ != nullptr, MSERR_OK);
3533     auto ret = videoDecoder_->SetPostProcessorOn(enabled);
3534     return ret == Status::ERROR_UNSUPPORTED_FORMAT ? MSERR_SUPER_RESOLUTION_UNSUPPORTED : TransStatus(ret);
3535 }
3536 
SetVideoWindowSize(int32_t width,int32_t height)3537 int32_t HiPlayerImpl::SetVideoWindowSize(int32_t width, int32_t height)
3538 {
3539     FALSE_RETURN_V(videoPostProcessorType_ == VideoPostProcessorType::SUPER_RESOLUTION,
3540         MSERR_SUPER_RESOLUTION_NOT_ENABLED);
3541     FALSE_RETURN_V(width >= MIN_TARGET_WIDTH && width <= MAX_TARGET_WIDTH &&
3542         height >= MIN_TARGET_HEIGHT && height <= MAX_TARGET_HEIGHT,
3543         TransStatus(Status::ERROR_INVALID_PARAMETER));
3544     postProcessorTargetWidth_ = width;
3545     postProcessorTargetHeight_ = height;
3546     FALSE_RETURN_V_NOLOG(videoDecoder_ != nullptr, MSERR_OK);
3547     auto ret = videoDecoder_->SetVideoWindowSize(width, height);
3548     return ret == Status::ERROR_UNSUPPORTED_FORMAT ? MSERR_SUPER_RESOLUTION_UNSUPPORTED : TransStatus(ret);
3549 }
3550 
SeekContinous(int32_t mSeconds,int64_t seekContinousBatchNo)3551 int32_t HiPlayerImpl::SeekContinous(int32_t mSeconds, int64_t seekContinousBatchNo)
3552 {
3553     std::lock_guard<std::mutex> lock(seekContinousMutex_);
3554     FALSE_RETURN_V(demuxer_ && videoDecoder_, TransStatus(Status::OK));
3555     FALSE_RETURN_V(!isNetWorkPlay_, TransStatus(Status::OK));
3556     FALSE_RETURN_V(seekContinousBatchNo_.load() <= seekContinousBatchNo, TransStatus(Status::OK));
3557     lastSeekContinousPos_ = mSeconds;
3558     if (seekContinousBatchNo_.load() == seekContinousBatchNo) {
3559         FALSE_RETURN_V(draggingPlayerAgent_ != nullptr, TransStatus(Status::OK));
3560         draggingPlayerAgent_->UpdateSeekPos(mSeconds);
3561         MEDIA_LOG_I("HiPlayerImpl::SeekContinous in " PUBLIC_LOG_D32, mSeconds);
3562         return TransStatus(Status::OK);
3563     }
3564     seekContinousBatchNo_.store(seekContinousBatchNo);
3565     auto res = StartSeekContinous();
3566     FALSE_RETURN_V_MSG_E(res == Status::OK && draggingPlayerAgent_ != nullptr, TransStatus(res),
3567         "StartSeekContinous failed");
3568     draggingPlayerAgent_->UpdateSeekPos(mSeconds);
3569     MEDIA_LOG_I("HiPlayerImpl::SeekContinous start " PUBLIC_LOG_D32, mSeconds);
3570     return TransStatus(Status::OK);
3571 }
3572 
StartSeekContinous()3573 Status HiPlayerImpl::StartSeekContinous()
3574 {
3575     if (curState_ == PlayerStateId::PLAYING) {
3576         // pause inner when start seek continuous in playing state
3577         Status res = pipeline_->Pause();
3578         if (res != Status::OK) {
3579             UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
3580         }
3581         syncManager_->Pause();
3582         callbackLooper_.StopReportMediaProgress();
3583         callbackLooper_.StopCollectMaxAmplitude();
3584     }
3585     FALSE_RETURN_V(!draggingPlayerAgent_, Status::OK);
3586     FALSE_RETURN_V(demuxer_ && videoDecoder_, Status::OK);
3587     draggingPlayerAgent_ = DraggingPlayerAgent::Create(pipeline_, demuxer_, videoDecoder_, playerId_);
3588     FALSE_RETURN_V_MSG_E(draggingPlayerAgent_ != nullptr, Status::ERROR_INVALID_OPERATION, "failed to create agent");
3589     Status res = draggingPlayerAgent_->Init();
3590     if (res != Status::OK) {
3591         draggingPlayerAgent_ = nullptr;
3592         return res;
3593     }
3594     if (draggingPlayerAgent_->GetDraggingMode() == DraggingMode::DRAGGING_CONTINUOUS) {
3595         FlushVideoEOS();
3596         // Drive the head node to start the video channel.
3597         res = demuxer_->ResumeDragging();
3598         FALSE_LOG_MSG(res == Status::OK, "ResumeDragging failed");
3599     } else {
3600         callbackLooper_.OnError(PLAYER_ERROR, MSERR_SEEK_CONTINUOUS_UNSUPPORTED);
3601     }
3602     SetFrameRateForSeekPerformance(FRAME_RATE_FOR_SEEK_PERFORMANCE);
3603     return res;
3604 }
3605 
FlushVideoEOS()3606 void HiPlayerImpl::FlushVideoEOS()
3607 {
3608     AutoLock lock(handleCompleteMutex_);
3609     bool demuxerEOS = demuxer_->HasEosTrack();
3610     bool decoderEOS = false;
3611     for (std::pair<std::string, bool>& item: completeState_) {
3612         if (item.second) {
3613             decoderEOS = true;
3614             break;
3615         }
3616     }
3617     bool playerEOS = pipelineStates_ == PlayerStates::PLAYER_PLAYBACK_COMPLETE;
3618     if (demuxerEOS || decoderEOS || playerEOS) {
3619         MEDIA_LOG_I("flush first when eos");
3620         pipeline_->Flush();
3621         if (curState_ == PlayerStateId::PLAYING) {
3622             inEosPlayingSeekContinuous_ = true;
3623         }
3624         curState_ = PlayerStateId::PAUSE;
3625         pipelineStates_ = TransStateId2PlayerState(PlayerStateId::PAUSE);
3626         for (std::pair<std::string, bool>& item: completeState_) {
3627             item.second = false;
3628         }
3629     }
3630 }
3631 
ExitSeekContinous(bool align,int64_t seekContinousBatchNo)3632 int32_t HiPlayerImpl::ExitSeekContinous(bool align, int64_t seekContinousBatchNo)
3633 {
3634     std::lock_guard<std::mutex> lock(seekContinousMutex_);
3635     FALSE_RETURN_V(demuxer_ && videoDecoder_, TransStatus(Status::OK));
3636     FALSE_RETURN_V(!isNetWorkPlay_, TransStatus(Status::OK));
3637     seekContinousBatchNo_.store(seekContinousBatchNo);
3638     FALSE_RETURN_V(draggingPlayerAgent_ != nullptr, TransStatus(Status::OK));
3639     draggingPlayerAgent_->Release();
3640     draggingPlayerAgent_ = nullptr;
3641     SetFrameRateForSeekPerformance(FRAME_RATE_DEFAULT);
3642     int64_t seekTimeUs = 0;
3643     FALSE_RETURN_V_MSG_E(Plugins::Us2HstTime(lastSeekContinousPos_, seekTimeUs),
3644         TransStatus(Status::OK), "Invalid lastSeekContinousPos_: %{public}" PRId64, lastSeekContinousPos_);
3645     syncManager_->Seek(seekTimeUs, true);
3646     if (videoDecoder_ != nullptr) {
3647         videoDecoder_->SetSeekTime(seekTimeUs, PlayerSeekMode::SEEK_CONTINOUS);
3648     }
3649     FALSE_RETURN_V_MSG_E(align, TransStatus(Status::OK), "dont need align");
3650     if (align && audioDecoder_ != nullptr && audioSink_ != nullptr) {
3651         audioDecoder_->DoFlush();
3652         audioSink_->DoFlush();
3653         seekAgent_ = std::make_shared<SeekAgent>(demuxer_);
3654         interruptMonitor_->RegisterListener(seekAgent_);
3655         auto res = seekAgent_->AlignAudioPosition(lastSeekContinousPos_);
3656         FALSE_LOG_MSG(res == Status::OK, "AlignAudioPosition failed");
3657         MEDIA_LOG_I_SHORT("seekAgent_ AlignAudioPosition end");
3658         interruptMonitor_->DeregisterListener(seekAgent_);
3659         seekAgent_.reset();
3660     }
3661     if (inEosPlayingSeekContinuous_) {
3662         curState_ = PlayerStateId::PLAYING;
3663         pipelineStates_ = TransStateId2PlayerState(PlayerStateId::PLAYING);
3664         inEosPlayingSeekContinuous_ = false;
3665     }
3666     if (curState_ == PlayerStateId::PLAYING) {
3667         // resume inner when exit seek continuous in playing state
3668         callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
3669         callbackLooper_.StartCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
3670         syncManager_->Resume();
3671         Status res = pipeline_->Resume();
3672         if (res != Status::OK) {
3673             UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
3674         }
3675     }
3676     return TransStatus(Status::OK);
3677 }
3678 
HandleDfxEvent(const DfxEvent & event)3679 void HiPlayerImpl::HandleDfxEvent(const DfxEvent &event)
3680 {
3681     FALSE_RETURN(dfxAgent_ != nullptr);
3682     dfxAgent_->OnDfxEvent(event);
3683 }
3684 
SetMaxAmplitudeCbStatus(bool status)3685 int32_t HiPlayerImpl::SetMaxAmplitudeCbStatus(bool status)
3686 {
3687     maxAmplitudeCbStatus_ = status;
3688     callbackLooper_.SetMaxAmplitudeCbStatus(status);
3689     if (audioSink_ != nullptr) {
3690         return audioSink_->SetMaxAmplitudeCbStatus(maxAmplitudeCbStatus_);
3691     }
3692     return MSERR_OK;
3693 }
3694 
IsSeekContinuousSupported(bool & isSeekContinuousSupported)3695 int32_t HiPlayerImpl::IsSeekContinuousSupported(bool &isSeekContinuousSupported)
3696 {
3697     FALSE_RETURN_V_MSG_E(demuxer_ != nullptr && videoDecoder_ != nullptr, TransStatus(Status::ERROR_WRONG_STATE),
3698         "demuxer or decoder is null");
3699     FALSE_RETURN_V_MSG_E(pipelineStates_ != PlayerStates::PLAYER_STOPPED, TransStatus(Status::ERROR_WRONG_STATE),
3700         "call IsSeekContinuousSupported in stopped state");
3701     isSeekContinuousSupported = DraggingPlayerAgent::IsDraggingSupported(demuxer_, videoDecoder_);
3702     return TransStatus(Status::OK);
3703 }
3704 
SetSeiMessageCbStatus(bool status,const std::vector<int32_t> & payloadTypes)3705 int32_t HiPlayerImpl::SetSeiMessageCbStatus(bool status, const std::vector<int32_t> &payloadTypes)
3706 {
3707     seiMessageCbStatus_ = status;
3708     payloadTypes_ = payloadTypes;
3709     MEDIA_LOG_I("SetSeiMessageCbStatus seiMessageCbStatus_  = " PUBLIC_LOG_D32, seiMessageCbStatus_);
3710     Status ret = SetSeiMessageListener();
3711     return TransStatus(ret);
3712 }
3713 
SetSeiMessageListener()3714 Status HiPlayerImpl::SetSeiMessageListener()
3715 {
3716     if (videoDecoder_ != nullptr && surface_ != nullptr) {
3717         return videoDecoder_->SetSeiMessageCbStatus(seiMessageCbStatus_, payloadTypes_);
3718     }
3719     if (seiDecoder_ != nullptr && surface_ == nullptr) {
3720         return seiDecoder_->SetSeiMessageCbStatus(seiMessageCbStatus_, payloadTypes_);
3721     }
3722     return Status::OK;
3723 }
3724 
SetPerfRecEnabled(bool isPerfRecEnabled)3725 void HiPlayerImpl::SetPerfRecEnabled(bool isPerfRecEnabled)
3726 {
3727     MEDIA_LOG_I("SetPerfRecEnabled %{public}d", isPerfRecEnabled);
3728     isPerfRecEnabled_ = isPerfRecEnabled;
3729 }
3730 
EnableReportMediaProgress(bool enable)3731 int32_t HiPlayerImpl::EnableReportMediaProgress(bool enable)
3732 {
3733     MEDIA_LOG_I("EnableReportMediaProgress %{public}d", enable);
3734     callbackLooper_.EnableReportMediaProgress(enable);
3735     return MSERR_OK;
3736 }
3737 
IsNeedChangePlaySpeed(PlaybackRateMode & mode,bool & isXSpeedPlay)3738 bool HiPlayerImpl::IsNeedChangePlaySpeed(PlaybackRateMode &mode, bool &isXSpeedPlay)
3739 {
3740     FALSE_RETURN_V(demuxer_ != nullptr && isFlvLive_, false);
3741     uint64_t cacheDuration = demuxer_->GetCachedDuration();
3742     MEDIA_LOG_I("current cacheDuration is " PUBLIC_LOG_U64, cacheDuration);
3743     if ((cacheDuration < bufferDurationForPlaying_ * TIME_CONVERSION_UNIT) && isXSpeedPlay) {
3744         mode = PlaybackRateMode::SPEED_FORWARD_1_00_X;
3745         isXSpeedPlay = false;
3746         MEDIA_LOG_I("below the play waterline, recover to 1x speed play");
3747         return true;
3748     } else if ((cacheDuration > (maxLivingDelayTime_ * TIME_CONVERSION_UNIT)) && !isXSpeedPlay) {
3749         mode = PlaybackRateMode::SPEED_FORWARD_1_20_X;
3750         isXSpeedPlay = true;
3751         MEDIA_LOG_I("exceed the max delay time, start to 1.2x speed play");
3752         return true;
3753     }
3754     return false;
3755 }
3756 
IsPauseForTooLong(int64_t pauseTime)3757 bool HiPlayerImpl::IsPauseForTooLong(int64_t pauseTime)
3758 {
3759     return pauseTime > (maxLivingDelayTime_ * TIME_CONVERSION_UNIT * PAUSE_LONG_TIME_FACTOR);
3760 }
3761 
DoRestartLiveLink()3762 void HiPlayerImpl::DoRestartLiveLink()
3763 {
3764     MediaTrace trace("HiPlayerImpl::DoRestartLiveLink");
3765     FALSE_RETURN_NOLOG(isFlvLive_);
3766     FALSE_RETURN(demuxer_ != nullptr);
3767     demuxer_->DoFlush();
3768     if (audioDecoder_ != nullptr) {
3769         audioDecoder_->DoFlush();
3770     }
3771     if (audioSink_ != nullptr) {
3772         audioSink_->DoFlush();
3773     }
3774     if (videoDecoder_ != nullptr) {
3775         videoDecoder_->DoFlush();
3776     }
3777     Status ret = demuxer_->RebootPlugin();
3778     if (audioDecoder_ != nullptr) {
3779         audioDecoder_->DoStart();
3780     }
3781     if (audioSink_ != nullptr) {
3782         audioSink_->DoStart();
3783     }
3784     if (videoDecoder_ != nullptr) {
3785         videoDecoder_->DoStart();
3786     }
3787     MEDIA_LOG_I("restart live link ret is %{public}d", static_cast<int32_t>(ret));
3788     return;
3789 }
3790 
IsFlvLive()3791 bool HiPlayerImpl::IsFlvLive()
3792 {
3793     return isFlvLive_;
3794 }
3795 
SetFlvLiveParams(AVPlayStrategy playbackStrategy)3796 void HiPlayerImpl::SetFlvLiveParams(AVPlayStrategy playbackStrategy)
3797 {
3798     if (playbackStrategy.preferredBufferDurationForPlaying < 0) {
3799         isSetBufferDurationForPlaying_ = false;
3800         bufferDurationForPlaying_ = 0;
3801     } else {
3802         bufferDurationForPlaying_ = playbackStrategy.preferredBufferDurationForPlaying;
3803         isSetBufferDurationForPlaying_ = true;
3804     }
3805     maxLivingDelayTime_ = playbackStrategy.thresholdForAutoQuickPlay;
3806 }
3807 
UpdateFlvLiveParams()3808 void HiPlayerImpl::UpdateFlvLiveParams()
3809 {
3810     maxLivingDelayTime_ = maxLivingDelayTime_ < 0 ? AVPlayStrategyConstant::START_QUICK_PLAY_THRESHOLD_SECONDS :
3811         maxLivingDelayTime_;
3812     bufferDurationForPlaying_ = isSetBufferDurationForPlaying_ ? bufferDurationForPlaying_ :
3813         AVPlayStrategyConstant::BUFFER_DURATION_FOR_PLAYING_SECONDS;
3814     MEDIA_LOG_I("maxLivingDelayTime_ is " PUBLIC_LOG_F " and  bufferDurationForPlaying_ is " PUBLIC_LOG_F,
3815         maxLivingDelayTime_, bufferDurationForPlaying_);
3816 }
3817 
SetFlvObs()3818 void HiPlayerImpl::SetFlvObs()
3819 {
3820     FALSE_RETURN(demuxer_ != nullptr);
3821     isFlvLive_ = demuxer_->IsFlvLive();
3822     FALSE_RETURN(isFlvLive_);
3823     MEDIA_LOG_I("SetFlvObs");
3824     UpdateFlvLiveParams();
3825     liveController_.StartWithPlayerEngineObs(playerEngineObs_);
3826 
3827     // flv live with play water line max wait 30s.
3828     FALSE_RETURN_MSG(isSetBufferDurationForPlaying_ && bufferDurationForPlaying_ > 0,
3829         "Flv live stream and no duration water line");
3830     MEDIA_LOG_I("Wait flv live play water line for max 30s bufferDuration %{public}.2f", bufferDurationForPlaying_);
3831     std::unique_lock<std::mutex> lock(flvLiveMutex_);
3832     flvLiveCond_.wait_for(lock, std::chrono::milliseconds(FLV_LIVE_PREPARE_WAIT_TIME),
3833         [this] { return isBufferingEnd_.load() || isInterruptNeeded_.load(); });
3834     MEDIA_LOG_I("Wait flv live play water line for max 30s end");
3835 }
3836 
StartFlvCheckLiveDelayTime()3837 void HiPlayerImpl::StartFlvCheckLiveDelayTime()
3838 {
3839     FALSE_RETURN_NOLOG(isFlvLive_);
3840     FALSE_RETURN(demuxer_ != nullptr);
3841     MEDIA_LOG_I("StartFlvCheckLiveDelayTime");
3842     liveController_.StartCheckLiveDelayTime(CHECK_DELAY_INTERVAL);
3843 }
3844 
StopFlvCheckLiveDelayTime()3845 void HiPlayerImpl::StopFlvCheckLiveDelayTime()
3846 {
3847     FALSE_RETURN_NOLOG(isFlvLive_);
3848     FALSE_RETURN(demuxer_ != nullptr);
3849     MEDIA_LOG_I("StopFlvCheckLiveDelayTime");
3850     liveController_.StopCheckLiveDelayTime();
3851 }
3852 
SetPostProcessor()3853 void HiPlayerImpl::SetPostProcessor()
3854 {
3855     if (videoPostProcessorType_ != VideoPostProcessorType::NONE) {
3856         videoDecoder_->SetPostProcessorType(videoPostProcessorType_);
3857         videoDecoder_->SetPostProcessorOn(isPostProcessorOn_);
3858         videoDecoder_->SetVideoWindowSize(postProcessorTargetWidth_, postProcessorTargetHeight_);
3859     }
3860     std::lock_guard<std::mutex> lock(fdMutex_);
3861     FALSE_RETURN_NOLOG(enableCameraPostprocessing_.load() && fdsanFd_ && fdsanFd_->Get() >= 0);
3862     videoDecoder_->SetCameraPostprocessing(enableCameraPostprocessing_.load());
3863     videoDecoder_->SetPostProcessorFd(fdsanFd_->Get());
3864     fdsanFd_->Reset();
3865 }
3866 
SetReopenFd(int32_t fd)3867 int32_t HiPlayerImpl::SetReopenFd(int32_t fd)
3868 {
3869     FALSE_RETURN_V_MSG_E(fd >= 0, MSERR_INVALID_VAL, "Invalid input fd.");
3870     int32_t dupFd = dup(fd);
3871     FALSE_RETURN_V_MSG_E(dupFd >= 0, MSERR_INVALID_VAL, "Dup fd failed.");
3872     std::lock_guard<std::mutex> lock(fdMutex_);
3873     fdsanFd_ = std::make_unique<FdsanFd>(dupFd);
3874     FALSE_RETURN_V(fdsanFd_ && (fdsanFd_->Get() >= 0), MSERR_INVALID_VAL);
3875     return TransStatus(Status::OK);
3876 }
3877 
EnableCameraPostprocessing()3878 int32_t HiPlayerImpl::EnableCameraPostprocessing()
3879 {
3880     MEDIA_LOG_D("EnableCameraPostprocessing enter.");
3881     enableCameraPostprocessing_.store(true);
3882     return TransStatus(Status::OK);
3883 }
3884 
ResetEnableCameraPostProcess()3885 void HiPlayerImpl::ResetEnableCameraPostProcess()
3886 {
3887     enableCameraPostprocessing_.store(false);
3888     FALSE_RETURN_NOLOG(fdsanFd_ != nullptr);
3889     fdsanFd_->Reset();
3890 }
3891 
SetCameraPostprocessing(bool isOpen)3892 int32_t HiPlayerImpl::SetCameraPostprocessing(bool isOpen)
3893 {
3894 #ifdef SUPPORT_VIDEO
3895     if (videoDecoder_ != nullptr) {
3896         MEDIA_LOG_I("SetCameraPostprocessing enter");
3897         videoDecoder_->SetCameraPostprocessingDirect(isOpen);
3898     }
3899 #endif
3900     return TransStatus(Status::OK);
3901 }
3902 
HandleMemoryUsageEvent(const DfxEvent & event)3903 void HiPlayerImpl::HandleMemoryUsageEvent(const DfxEvent &event)
3904 {
3905     lock_guard<std::mutex> lock(memoryReportMutex_);
3906     std::string callerName = event.callerName;
3907     uint32_t currentUsage = 0;
3908     if (callerName == DEMUXER_PLUGIN) {
3909         auto memoryUsages = AnyCast<std::unordered_map<uint32_t, uint32_t>>(event.param);
3910         for (const auto &[trackId, usage] : memoryUsages) {
3911         currentUsage += usage;
3912         }
3913     } else {
3914         currentUsage = AnyCast<uint32_t>(event.param);
3915     }
3916     currentUsage /= MEMORY_B_TO_KB;
3917 
3918     auto limit = MEMORY_USAGE_REPORT_LIMITS.count(callerName)
3919         ? MEMORY_USAGE_REPORT_LIMITS.at(callerName) : MEMORY_REPORT_LIMITE;
3920     MEDIA_LOG_I("caller:%{public}s,currentUsage:%{public}u", callerName.c_str(), currentUsage);
3921 
3922     auto oldIter = memoryUsageInfo_.find(callerName);
3923     uint32_t oldUsage  = (oldIter != memoryUsageInfo_.end()) ? std::min(oldIter->second, limit) : 0;
3924     uint32_t totalMemory = memoryUsageInfo_[TOTAL_MEMORY_SIZE];
3925     FALSE_RETURN_MSG(totalMemory >= oldUsage, "totalMemory:%{public}u oldUsage:%{public}u", totalMemory, oldUsage);
3926     totalMemory = totalMemory + std::min(currentUsage, limit) - oldUsage;
3927     FALSE_RETURN_MSG(totalMemory >= 0 && totalMemory < UINT32_MAX, "error totalMemory:%{public}u", totalMemory);
3928     memoryUsageInfo_[TOTAL_MEMORY_SIZE] = totalMemory;
3929     memoryUsageInfo_[callerName] = currentUsage;
3930 
3931     MEDIA_LOG_I("totalMemory:%{public}u", totalMemory);
3932     callbackLooper_.OnDfxInfo({
3933         .type = DfxEventType::DFX_INFO_MEMORY_USAGE,
3934         .param = memoryUsageInfo_[TOTAL_MEMORY_SIZE]
3935     });
3936     FALSE_RETURN_NOLOG(currentUsage >= limit);
3937     std::string msg = "";
3938     for (auto &[key, value] : memoryUsageInfo_) {
3939         msg += key + ":" + std::to_string(value) + ";";
3940     }
3941     MEDIA_LOG_I("memusage event reported, appName:%{public}s msg:%{public}s", bundleName_.c_str(), msg.c_str());
3942 }
3943 
ForceLoadVideo(bool status)3944 int32_t HiPlayerImpl::ForceLoadVideo(bool status)
3945 {
3946     isForceLoadVideo_ = status;
3947     return MSERR_OK;
3948 }
3949 
SetAudioHapticsSyncId(int32_t syncId)3950 int32_t HiPlayerImpl::SetAudioHapticsSyncId(int32_t syncId)
3951 {
3952     MEDIA_LOG_I("SetAHapSyncId " PUBLIC_LOG_D32, syncId);
3953     audioHapticsSyncId_ = syncId;
3954     return TransStatus(Status::OK);
3955 }
3956 
ApplyAudioHapticsSyncId()3957 void HiPlayerImpl::ApplyAudioHapticsSyncId()
3958 {
3959     FALSE_RETURN_W(audioSink_ != nullptr);
3960     MEDIA_LOG_D("ApplyAHapSyncId " PUBLIC_LOG_D32, audioHapticsSyncId_);
3961     Status ret = audioSink_->SetAudioHapticsSyncId(audioHapticsSyncId_);
3962     FALSE_RETURN_MSG(ret == Status::OK,
3963         "ApplyAHapSyncId failed with error " PUBLIC_LOG_D32, static_cast<int32_t>(ret));
3964 }
3965 
NotifyMemoryExchange(bool status)3966 int32_t HiPlayerImpl::NotifyMemoryExchange(bool status)
3967 {
3968     FALSE_RETURN_V_NOLOG(videoDecoder_ != nullptr, MSERR_OK);
3969     videoDecoder_->NotifyMemoryExchange(status);
3970     return MSERR_OK;
3971 }
3972 
DoInitDemuxer()3973 void HiPlayerImpl::DoInitDemuxer()
3974 {
3975     demuxer_->SetPerfRecEnabled(isPerfRecEnabled_);
3976     demuxer_->SetApiVersion(apiVersion_);
3977     demuxer_->SetSyncCenter(syncManager_);
3978     pipeline_->AddHeadFilters({demuxer_});
3979     {
3980         ScopedTimer timer("Demuxer Init", DEMUXER_INIT_WARNING_MS);
3981         demuxer_->Init(playerEventReceiver_, playerFilterCallback_, interruptMonitor_);
3982     }
3983 }
3984 
InitVideoDecoder()3985 Status HiPlayerImpl::InitVideoDecoder()
3986 {
3987     videoDecoder_ = FilterFactory::Instance().CreateFilter<DecoderSurfaceFilter>("player.videodecoder",
3988         FilterType::FILTERTYPE_VDEC);
3989     FALSE_RETURN_V(videoDecoder_ != nullptr, Status::ERROR_NULL_POINTER);
3990     videoDecoder_->Init(playerEventReceiver_, playerFilterCallback_);
3991     SetPostProcessor();
3992     interruptMonitor_->RegisterListener(videoDecoder_);
3993     videoDecoder_->SetSyncCenter(syncManager_);
3994     videoDecoder_->SetCallingInfo(appUid_, appPid_, bundleName_, instanceId_);
3995     if (surface_ != nullptr) {
3996         videoDecoder_->SetVideoSurface(surface_);
3997         videoDecoder_->SetSeiMessageCbStatus(seiMessageCbStatus_  && IsLiveStream(), payloadTypes_);
3998     }
3999     videoDecoder_->SetPerfRecEnabled(isPerfRecEnabled_);
4000     // set decrypt config for drm videos
4001     if (isDrmProtected_) {
4002         std::unique_lock<std::mutex> lock(drmMutex_);
4003         static constexpr int32_t timeout = 5;
4004         bool notTimeout = drmConfigCond_.wait_for(lock, std::chrono::seconds(timeout), [this]() {
4005             return this->isDrmPrepared_ || this->stopWaitingDrmConfig_;
4006         });
4007         if (notTimeout && isDrmPrepared_) {
4008             MEDIA_LOG_I("LinkVideoDecoderFilter will SetDecryptConfig");
4009 #ifdef SUPPORT_AVPLAYER_DRM
4010             bool svpFlag = svpMode_ == HiplayerSvpMode::SVP_TRUE ? true : false;
4011             videoDecoder_->SetDecryptConfig(keySessionServiceProxy_, svpFlag);
4012 #endif
4013         } else {
4014             MEDIA_LOG_E("HiPlayerImpl Drmcond wait timeout or has been stopped! Play drm protected video failed!");
4015             return Status::ERROR_INVALID_OPERATION;
4016         }
4017     } else {
4018         MEDIA_LOG_D("HiPlayerImpl::LinkVideoDecoderFilter, and it's not drm-protected.");
4019     }
4020     return Status::OK;
4021 }
4022 
ReleaseVideoDecoderOnMuted()4023 void HiPlayerImpl::ReleaseVideoDecoderOnMuted()
4024 {
4025     if (videoDecoder_ != nullptr) {
4026         videoDecoder_->ReleaseOnMuted(!keepDecodingOnMute_);
4027     }
4028 }
4029 }  // namespace Media
4030 }  // namespace OHOS
4031