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