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