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