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