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