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