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