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