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_STD_HIPLAYER_IMPL_H 17 #define HISTREAMER_SCENE_STD_HIPLAYER_IMPL_H 18 19 #include <memory> 20 #include <unordered_map> 21 22 #include "hiplayer_callback_looper.h" 23 #include "i_player_engine.h" 24 #include "filters/demux/demuxer_filter.h" 25 #include "filters/source/media_source/media_source_filter.h" 26 #include "foundation/osal/thread/condition_variable.h" 27 #include "foundation/osal/thread/mutex.h" 28 #include "hiplayer_callback_looper.h" 29 #include "internal/state_machine.h" 30 #include "pipeline/core/error_code.h" 31 #include "pipeline/core/filter_callback.h" 32 #include "pipeline/core/media_sync_manager.h" 33 #include "pipeline/core/pipeline.h" 34 #include "pipeline/core/pipeline_core.h" 35 #include "pipeline/filters/codec/audio_decoder/audio_decoder_filter.h" 36 #ifdef VIDEO_SUPPORT 37 #include "pipeline/filters/codec/video_decoder/video_decoder_filter.h" 38 #include "pipeline/filters/sink/video_sink/video_sink_filter.h" 39 #endif 40 #include "pipeline/filters/sink/audio_sink/audio_sink_filter.h" 41 #include "scene/common/media_stat_stub.h" 42 #include "play_executor.h" 43 44 namespace OHOS { 45 namespace Media { 46 class HiPlayerImpl : public Pipeline::EventReceiver, 47 public PlayExecutor, 48 public StateChangeCallback, 49 public Pipeline::FilterCallback, 50 public IPlayerEngine { 51 friend class StateMachine; 52 53 public: 54 HiPlayerImpl(int32_t appUid, int32_t appPid); 55 ~HiPlayerImpl() override; 56 HiPlayerImpl(const HiPlayerImpl& other) = delete; 57 HiPlayerImpl& operator=(const HiPlayerImpl& other) = delete; 58 ErrorCode Init(); 59 // interface from PlayerInterface 60 int32_t SetSource(const std::string& uri) override; 61 int32_t SetSource(const std::shared_ptr<IMediaDataSource>& dataSrc) override; 62 int32_t Prepare() override; 63 int32_t PrepareAsync() override; 64 int32_t Play() override; 65 int32_t Pause() override; 66 int32_t Stop() override; 67 int32_t Reset() override; 68 int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override; 69 int32_t SetVolume(float leftVolume, float rightVolume) override; 70 int32_t SetVideoSurface(sptr<Surface> surface) override; 71 int32_t SetLooping(bool loop) override; 72 int32_t SetParameter(const Format& params) override; 73 int32_t SetObs(const std::weak_ptr<IPlayerEngineObs>& obs) override; 74 int32_t GetCurrentTime(int32_t& currentPositionMs) override; 75 int32_t GetDuration(int32_t& durationMs) override; 76 int32_t SetPlaybackSpeed(PlaybackRateMode mode) override; 77 int32_t GetPlaybackSpeed(PlaybackRateMode& mode) override; 78 79 int32_t GetVideoTrackInfo(std::vector<Format>& videoTrack) override; 80 int32_t GetAudioTrackInfo(std::vector<Format>& audioTrack) override; 81 int32_t GetVideoWidth() override; 82 int32_t GetVideoHeight() override; 83 int32_t SetVideoScaleType(VideoScaleType videoScaleType) override; 84 int32_t SetAudioRendererInfo(const int32_t contentType, const int32_t streamUsage, 85 const int32_t rendererFlag) override; 86 int32_t SetAudioInterruptMode(const int32_t interruptMode) override; 87 88 // internal interfaces 89 void OnEvent(const Event& event) override; 90 void OnStateChanged(StateId state) override; 91 ErrorCode OnCallback(const Pipeline::FilterCallbackType& type, Pipeline::Filter* filter, 92 const Plugin::Any& parameter) override; 93 94 // interface from PlayExecutor 95 bool IsSingleLoop() override; 96 ErrorCode DoSetSource(const std::shared_ptr<MediaSource>& source) override; 97 ErrorCode PrepareFilters() override; 98 ErrorCode DoPlay() override; 99 ErrorCode DoPause() override; 100 ErrorCode DoResume() override; 101 ErrorCode DoStop() override; 102 ErrorCode DoReset() override; 103 ErrorCode DoSeek(int64_t hstTime, Plugin::SeekMode mode, bool appTriggered) override; 104 ErrorCode DoOnReady() override; 105 ErrorCode DoOnComplete() override; 106 ErrorCode DoOnError(ErrorCode) override; 107 108 private: 109 ErrorCode StopAsync(); 110 ErrorCode SetVolumeToSink(float volume, bool reportUpward = true); 111 Pipeline::PFilter CreateAudioDecoder(const std::string& desc); 112 ErrorCode NewAudioPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter); 113 #ifdef VIDEO_SUPPORT 114 ErrorCode NewVideoPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter); 115 #endif 116 ErrorCode RemoveFilterChains(Pipeline::Filter* filter, const Plugin::Any& parameter); 117 void ActiveFilters(const std::vector<Pipeline::Filter*>& filters); 118 void HandlePluginErrorEvent(const Event& event); 119 void UpdateStateNoLock(PlayerStates newState, bool notifyUpward = true); 120 double ChangeModeToSpeed(const PlaybackRateMode& mode) const; 121 PlaybackRateMode ChangeSpeedToMode(double rate) const; 122 123 OSAL::Mutex stateMutex_ {}; 124 OSAL::ConditionVariable cond_ {}; 125 int32_t appUid_ {0}; 126 int32_t appPid_ {0}; 127 StateMachine fsm_; 128 std::atomic<StateId> curFsmState_; 129 std::shared_ptr<Pipeline::PipelineCore> pipeline_; 130 std::atomic<PlayerStates> pipelineStates_ {PlayerStates::PLAYER_IDLE}; // only update in UpdateStateNoLock() 131 std::queue<PlayerStates> pendingStates_ {}; 132 std::atomic<bool> initialized_ {false}; 133 134 std::weak_ptr<Plugin::Meta> sourceMeta_ {}; 135 std::vector<std::weak_ptr<Plugin::Meta>> streamMeta_ {}; 136 int64_t duration_ {-1}; 137 std::atomic<bool> singleLoop_ {false}; 138 float volume_; 139 MediaStatStub mediaStats_; 140 std::atomic<int64_t> lastSeekPosition_ {-1}; 141 std::atomic<Plugin::SeekMode> lastSeekMode_ {Plugin::SeekMode::SEEK_PREVIOUS_SYNC}; 142 std::atomic<bool> seekInProgress_ {false}; 143 144 std::shared_ptr<Pipeline::MediaSourceFilter> audioSource_; 145 std::shared_ptr<Pipeline::DemuxerFilter> demuxer_; 146 std::shared_ptr<Pipeline::AudioDecoderFilter> audioDecoder_; 147 std::shared_ptr<Pipeline::AudioSinkFilter> audioSink_; 148 #ifdef VIDEO_SUPPORT 149 std::shared_ptr<Pipeline::VideoDecoderFilter> videoDecoder_; 150 std::shared_ptr<Pipeline::VideoSinkFilter> videoSink_; 151 #endif 152 std::unordered_map<std::string, std::shared_ptr<Pipeline::AudioDecoderFilter>> audioDecoderMap_; 153 std::shared_ptr<Pipeline::MediaSyncManager> syncManager_; 154 HiPlayerCallbackLooper callbackLooper_ {}; 155 sptr<Surface> surface_ {nullptr}; 156 }; 157 } // namespace Media 158 } // namespace OHOS 159 #endif // HISTREAMER_SCENE_STD_HIPLAYER_IMPL_H 160