1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (c) 2021-2021 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci * 7fa7767c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci * 9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci * limitations under the License. 14fa7767c5Sopenharmony_ci */ 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#ifndef HISTREAMER_SCENE_LITE_HIPLAYER_IMPL_H 17fa7767c5Sopenharmony_ci#define HISTREAMER_SCENE_LITE_HIPLAYER_IMPL_H 18fa7767c5Sopenharmony_ci 19fa7767c5Sopenharmony_ci#include <memory> 20fa7767c5Sopenharmony_ci#include <unordered_map> 21fa7767c5Sopenharmony_ci#include "foundation/osal/thread/condition_variable.h" 22fa7767c5Sopenharmony_ci#include "foundation/osal/thread/mutex.h" 23fa7767c5Sopenharmony_ci#include "internal/state_machine.h" 24fa7767c5Sopenharmony_ci#include "pipeline/core/error_code.h" 25fa7767c5Sopenharmony_ci#include "pipeline/core/media_sync_manager.h" 26fa7767c5Sopenharmony_ci#include "pipeline/core/pipeline.h" 27fa7767c5Sopenharmony_ci#include "pipeline/core/pipeline_core.h" 28fa7767c5Sopenharmony_ci#include "pipeline/filters/codec/audio_decoder/audio_decoder_filter.h" 29fa7767c5Sopenharmony_ci#include "pipeline/filters/demux/demuxer_filter.h" 30fa7767c5Sopenharmony_ci#include "pipeline/filters/sink/audio_sink/audio_sink_filter.h" 31fa7767c5Sopenharmony_ci#include "pipeline/filters/source/media_source/media_source_filter.h" 32fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT 33fa7767c5Sopenharmony_ci#include "pipeline/filters/codec/video_decoder/video_decoder_filter.h" 34fa7767c5Sopenharmony_ci#include "pipeline/filters/sink/video_sink/video_sink_filter.h" 35fa7767c5Sopenharmony_ci#endif 36fa7767c5Sopenharmony_ci#include "play_executor.h" 37fa7767c5Sopenharmony_ci#include "plugin/common/any.h" 38fa7767c5Sopenharmony_ci#include "scene/common/media_stat_stub.h" 39fa7767c5Sopenharmony_ci#include "scene/lite/hiplayer.h" 40fa7767c5Sopenharmony_ci 41fa7767c5Sopenharmony_cinamespace OHOS { 42fa7767c5Sopenharmony_cinamespace Media { 43fa7767c5Sopenharmony_ciclass HiPlayerImpl : public Pipeline::EventReceiver, 44fa7767c5Sopenharmony_ci public PlayExecutor, 45fa7767c5Sopenharmony_ci public StateChangeCallback, 46fa7767c5Sopenharmony_ci public Pipeline::FilterCallback, 47fa7767c5Sopenharmony_ci public PlayerInterface { 48fa7767c5Sopenharmony_ci friend class StateMachine; 49fa7767c5Sopenharmony_ci 50fa7767c5Sopenharmony_cipublic: 51fa7767c5Sopenharmony_ci ~HiPlayerImpl() override; 52fa7767c5Sopenharmony_ci 53fa7767c5Sopenharmony_ci static std::shared_ptr<HiPlayerImpl> CreateHiPlayerImpl(); 54fa7767c5Sopenharmony_ci 55fa7767c5Sopenharmony_ci // interface from PlayerInterface 56fa7767c5Sopenharmony_ci int32_t Init() override; 57fa7767c5Sopenharmony_ci int32_t DeInit() override; 58fa7767c5Sopenharmony_ci int32_t SetSource(const Source& source) override; 59fa7767c5Sopenharmony_ci int32_t Prepare() override; 60fa7767c5Sopenharmony_ci int32_t Play() override; 61fa7767c5Sopenharmony_ci bool IsPlaying() override; 62fa7767c5Sopenharmony_ci int32_t Pause() override; 63fa7767c5Sopenharmony_ci int32_t Stop() override; 64fa7767c5Sopenharmony_ci int32_t Reset() override; 65fa7767c5Sopenharmony_ci int32_t Release() override; 66fa7767c5Sopenharmony_ci int32_t Rewind(int64_t mSeconds, int32_t mode) override; 67fa7767c5Sopenharmony_ci int32_t SetVolume(float leftVolume, float rightVolume) override; 68fa7767c5Sopenharmony_ci#ifndef SURFACE_DISABLED 69fa7767c5Sopenharmony_ci int32_t SetSurface(Surface* surface) override; 70fa7767c5Sopenharmony_ci#endif 71fa7767c5Sopenharmony_ci bool IsSingleLooping() override; 72fa7767c5Sopenharmony_ci int32_t SetLoop(bool loop) override; 73fa7767c5Sopenharmony_ci void SetPlayerCallback(const std::shared_ptr<PlayerCallback>& cb) override; 74fa7767c5Sopenharmony_ci int32_t GetPlayerState(int32_t& state) override; 75fa7767c5Sopenharmony_ci int32_t GetCurrentPosition(int64_t& currentPositionMs) override; 76fa7767c5Sopenharmony_ci int32_t GetDuration(int64_t& outDurationMs) override; 77fa7767c5Sopenharmony_ci int32_t GetVideoWidth(int32_t& videoWidth) override; 78fa7767c5Sopenharmony_ci int32_t GetVideoHeight(int32_t& videoHeight) override; 79fa7767c5Sopenharmony_ci int32_t SetPlaybackSpeed(float speed) override; 80fa7767c5Sopenharmony_ci int32_t GetPlaybackSpeed(float& speed) override; 81fa7767c5Sopenharmony_ci int32_t SetAudioStreamType(int32_t type) override; 82fa7767c5Sopenharmony_ci void GetAudioStreamType(int32_t& type) override; 83fa7767c5Sopenharmony_ci int32_t SetParameter(const Format& params) override; 84fa7767c5Sopenharmony_ci 85fa7767c5Sopenharmony_ci void OnEvent(const Event& event) override; 86fa7767c5Sopenharmony_ci 87fa7767c5Sopenharmony_ci ErrorCode SetBufferSize(size_t size); 88fa7767c5Sopenharmony_ci 89fa7767c5Sopenharmony_ci ErrorCode GetSourceMeta(std::shared_ptr<const Plugin::Meta>& meta) const; 90fa7767c5Sopenharmony_ci ErrorCode GetTrackCnt(size_t& cnt) const; 91fa7767c5Sopenharmony_ci ErrorCode GetTrackMeta(size_t id, std::shared_ptr<const Plugin::Meta>& meta) const; 92fa7767c5Sopenharmony_ci 93fa7767c5Sopenharmony_ci void OnStateChanged(StateId state) override; 94fa7767c5Sopenharmony_ci 95fa7767c5Sopenharmony_ci ErrorCode OnCallback(const Pipeline::FilterCallbackType& type, Pipeline::Filter* filter, 96fa7767c5Sopenharmony_ci const Plugin::Any& parameter) override; 97fa7767c5Sopenharmony_ci 98fa7767c5Sopenharmony_ci // interface from PlayExecutor 99fa7767c5Sopenharmony_ci bool IsSingleLoop() override; 100fa7767c5Sopenharmony_ci ErrorCode DoSetSource(const std::shared_ptr<MediaSource>& source) override; 101fa7767c5Sopenharmony_ci ErrorCode PrepareFilters() override; 102fa7767c5Sopenharmony_ci ErrorCode DoPlay() override; 103fa7767c5Sopenharmony_ci ErrorCode DoPause() override; 104fa7767c5Sopenharmony_ci ErrorCode DoResume() override; 105fa7767c5Sopenharmony_ci ErrorCode DoStop() override; 106fa7767c5Sopenharmony_ci ErrorCode DoReset() override; 107fa7767c5Sopenharmony_ci ErrorCode DoSeek(int64_t hstTime, Plugin::SeekMode mode, bool appTriggered) override; 108fa7767c5Sopenharmony_ci ErrorCode DoOnReady() override; 109fa7767c5Sopenharmony_ci ErrorCode DoOnComplete() override; 110fa7767c5Sopenharmony_ci ErrorCode DoOnError(ErrorCode) override; 111fa7767c5Sopenharmony_ci 112fa7767c5Sopenharmony_ciprivate: 113fa7767c5Sopenharmony_ci PlayerStates TransStateId2PlayerState(StateId state); 114fa7767c5Sopenharmony_ci const std::string& StringnessPlayerState(PlayerStates state); 115fa7767c5Sopenharmony_ci static Plugin::SeekMode Transform2SeekMode(PlayerSeekMode mode); 116fa7767c5Sopenharmony_ci HiPlayerImpl(); 117fa7767c5Sopenharmony_ci HiPlayerImpl(const HiPlayerImpl& other); 118fa7767c5Sopenharmony_ci HiPlayerImpl& operator=(const HiPlayerImpl& other); 119fa7767c5Sopenharmony_ci ErrorCode StopAsync(); 120fa7767c5Sopenharmony_ci ErrorCode SetVolumeToSink(float volume, bool reportUpward = true); 121fa7767c5Sopenharmony_ci Pipeline::PFilter CreateAudioDecoder(const std::string& desc); 122fa7767c5Sopenharmony_ci 123fa7767c5Sopenharmony_ci ErrorCode NewAudioPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter); 124fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT 125fa7767c5Sopenharmony_ci ErrorCode NewVideoPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter); 126fa7767c5Sopenharmony_ci#endif 127fa7767c5Sopenharmony_ci 128fa7767c5Sopenharmony_ci ErrorCode RemoveFilterChains(Pipeline::Filter* filter, const Plugin::Any& parameter); 129fa7767c5Sopenharmony_ci 130fa7767c5Sopenharmony_ci void ActiveFilters(const std::vector<Pipeline::Filter*>& filters); 131fa7767c5Sopenharmony_ci void HandlePluginErrorEvent(const Event& event); 132fa7767c5Sopenharmony_ci void UpdateStateNoLock(PlayerStates newState, bool notifyUpward = true); 133fa7767c5Sopenharmony_ci 134fa7767c5Sopenharmony_ci OSAL::Mutex stateMutex_; 135fa7767c5Sopenharmony_ci OSAL::ConditionVariable cond_; 136fa7767c5Sopenharmony_ci StateMachine fsm_; 137fa7767c5Sopenharmony_ci std::atomic<StateId> curFsmState_; 138fa7767c5Sopenharmony_ci 139fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::PipelineCore> pipeline_; 140fa7767c5Sopenharmony_ci std::atomic<PlayerStates> pipelineStates_ {PlayerStates::PLAYER_IDLE}; // only update in UpdateStateNoLock() 141fa7767c5Sopenharmony_ci std::queue<PlayerStates> pendingStates_ {}; 142fa7767c5Sopenharmony_ci std::atomic<bool> initialized_ {false}; 143fa7767c5Sopenharmony_ci 144fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::MediaSourceFilter> audioSource_; 145fa7767c5Sopenharmony_ci 146fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::DemuxerFilter> demuxer_; 147fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::AudioDecoderFilter> audioDecoder_; 148fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::AudioSinkFilter> audioSink_; 149fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT 150fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::VideoDecoderFilter> videoDecoder; 151fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::VideoSinkFilter> videoSink; 152fa7767c5Sopenharmony_ci#endif 153fa7767c5Sopenharmony_ci 154fa7767c5Sopenharmony_ci std::unordered_map<std::string, std::shared_ptr<Pipeline::AudioDecoderFilter>> audioDecoderMap_; 155fa7767c5Sopenharmony_ci 156fa7767c5Sopenharmony_ci std::weak_ptr<Plugin::Meta> sourceMeta_; 157fa7767c5Sopenharmony_ci std::vector<std::weak_ptr<Plugin::Meta>> streamMeta_; 158fa7767c5Sopenharmony_ci int64_t duration_ {-1}; 159fa7767c5Sopenharmony_ci std::atomic<bool> singleLoop_ {false}; 160fa7767c5Sopenharmony_ci 161fa7767c5Sopenharmony_ci std::weak_ptr<PlayerCallback> callback_; 162fa7767c5Sopenharmony_ci float volume_; 163fa7767c5Sopenharmony_ci MediaStatStub mediaStats_; 164fa7767c5Sopenharmony_ci 165fa7767c5Sopenharmony_ci std::shared_ptr<Pipeline::MediaSyncManager> syncManager_; 166fa7767c5Sopenharmony_ci}; 167fa7767c5Sopenharmony_ci} // namespace Media 168fa7767c5Sopenharmony_ci} // namespace OHOS 169fa7767c5Sopenharmony_ci#endif // HISTREAMER_SCENE_LITE_HIPLAYER_IMPL_H 170