1 /* 2 * Copyright (c) 2023-2023 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 HI_PLAYER_IMPL_H 17 #define HI_PLAYER_IMPL_H 18 19 #include <memory> 20 #include <unordered_map> 21 #include <queue> 22 23 #include "audio_decoder_filter.h" 24 #include "audio_sink_filter.h" 25 #include "common/status.h" 26 #include "demuxer_filter.h" 27 #include "filter/filter.h" 28 #include "filter/filter_factory.h" 29 #include "hiplayer_callback_looper.h" 30 #include "media_utils.h" 31 #include "i_player_engine.h" 32 #include "media_sync_manager.h" 33 #include "pipeline/pipeline.h" 34 #ifdef SUPPORT_VIDEO 35 #include "decoder_surface_filter.h" 36 #endif 37 38 namespace OHOS { 39 namespace Media { 40 using namespace Pipeline; 41 42 class HiPlayerImpl : public IPlayerEngine, public std::enable_shared_from_this<HiPlayerImpl> { 43 public: 44 HiPlayerImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId, uint64_t appFullTokenId); 45 ~HiPlayerImpl() override; 46 HiPlayerImpl(const HiPlayerImpl& other) = delete; 47 HiPlayerImpl& operator=(const HiPlayerImpl& other) = delete; 48 Status Init(); 49 // interface from PlayerInterface 50 int32_t SetSource(const std::string& uri) override; 51 int32_t SetSource(const std::shared_ptr<IMediaDataSource>& dataSrc) override; 52 int32_t Prepare() override; 53 int32_t PrepareAsync() override; 54 int32_t Play() override; 55 int32_t Pause() override; 56 int32_t Stop() override; 57 int32_t Reset() override; 58 int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override; 59 int32_t SetVolume(float leftVolume, float rightVolume) override; 60 int32_t SetVideoSurface(sptr<Surface> surface) override; 61 int32_t SetDecryptConfig(const sptr<OHOS::DrmStandard::IMediaKeySessionService> &keySessionProxy, 62 bool svp) override; 63 int32_t SetLooping(bool loop) override; 64 int32_t SetParameter(const Format& params) override; 65 int32_t SetObs(const std::weak_ptr<IPlayerEngineObs>& obs) override; 66 int32_t GetCurrentTime(int32_t& currentPositionMs) override; 67 int32_t GetDuration(int32_t& durationMs) override; 68 int32_t SetPlaybackSpeed(PlaybackRateMode mode) override; 69 int32_t GetPlaybackSpeed(PlaybackRateMode& mode) override; 70 int32_t SelectBitRate(uint32_t bitRate) override; 71 int32_t GetAudioEffectMode(int32_t &effectMode) override; 72 int32_t SetAudioEffectMode(int32_t effectMode) override; 73 74 int32_t GetVideoTrackInfo(std::vector<Format>& videoTrack) override; 75 int32_t GetAudioTrackInfo(std::vector<Format>& audioTrack) override; 76 int32_t GetVideoWidth() override; 77 int32_t GetVideoHeight() override; 78 int32_t SetVideoScaleType(VideoScaleType videoScaleType) override; 79 int32_t SetAudioRendererInfo(const int32_t contentType, const int32_t streamUsage, 80 const int32_t rendererFlag) override; 81 int32_t SetAudioInterruptMode(const int32_t interruptMode) override; 82 int32_t SeekToCurrentTime(int32_t mSeconds, PlayerSeekMode mode) override; 83 84 // internal interfaces 85 void OnEvent(const Event &event); 86 void OnStateChanged(PlayerStateId state); 87 void OnCallback(std::shared_ptr<Filter> filter, const FilterCallBackCommand cmd, 88 StreamType outType); 89 90 private: 91 enum HiplayerSvpMode : int32_t { 92 SVP_CLEAR = -1, /* it's not a protection video */ 93 SVP_FALSE, /* it's a protection video but not need secure decoder */ 94 SVP_TRUE, /* it's a protection video and need secure decoder */ 95 }; 96 97 Status DoSetSource(const std::shared_ptr<MediaSource> source); 98 Status Resume(); 99 void HandleCompleteEvent(const Event& event); 100 void HandleInitialPlayingStateChange(const EventType& eventType); 101 void HandleDrmInfoUpdatedEvent(const Event& event); 102 void HandleIsLiveStreamEvent(bool isLiveStream); 103 void HandleErrorEvent(int32_t errorCode); 104 void UpdateStateNoLock(PlayerStates newState, bool notifyUpward = true); 105 double ChangeModeToSpeed(const PlaybackRateMode& mode) const; 106 void NotifyBufferingUpdate(const std::string_view& type, int32_t param); 107 void NotifyDurationUpdate(const std::string_view& type, int32_t param); 108 void NotifySeekDone(int32_t seekPos); 109 void NotifyAudioInterrupt(const Event& event); 110 void NotifyAudioDeviceChange(const Event& event); 111 void NotifyAudioServiceDied(); 112 void NotifyAudioFirstFrame(const Event& event); 113 void NotifyResolutionChange(); 114 void NotifyPositionUpdate(); 115 Status LinkAudioDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type); 116 Status LinkAudioSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type); 117 void DoInitializeForHttp(); 118 bool EnableBufferingBySysParam() const; 119 bool IsFileUrl(const std::string &url) const; 120 int32_t GetRealPath(const std::string &url, std::string &realUrlPath) const; 121 void SetDefaultAudioRenderInfo(); 122 #ifdef SUPPORT_VIDEO 123 Status LinkVideoDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type); 124 bool IsVideoMime(const std::string& mime); 125 #endif 126 Status Seek(int64_t mSeconds, PlayerSeekMode mode, bool notifySeekDone); 127 128 Status doPreparedSeek(int64_t seekPos, PlayerSeekMode mode); 129 Status doStartedSeek(int64_t seekPos, PlayerSeekMode mode); 130 Status doPausedSeek(int64_t seekPos, PlayerSeekMode mode); 131 Status doCompletedSeek(int64_t seekPos, PlayerSeekMode mode); 132 Status doSeek(int64_t seekPos, PlayerSeekMode mode); 133 void ResetIfSourceExisted(); 134 void ReleaseInner(); 135 void NotifySeek(Status rtv, bool flag, int64_t seekPos); 136 137 bool isNetWorkPlay_ = false; 138 int32_t appUid_{0}; 139 int32_t appPid_{0}; 140 int32_t appTokenId_{0}; 141 int64_t appFullTokenId_{0}; 142 OHOS::Media::Mutex stateMutex_{}; 143 OHOS::Media::ConditionVariable cond_{}; 144 int64_t duration_{-1}; 145 std::atomic<bool> singleLoop_ {false}; 146 std::atomic<bool> isSeek_ {false}; 147 std::atomic<PlaybackRateMode> playbackRateMode_ {PlaybackRateMode::SPEED_FORWARD_1_00_X}; 148 149 std::shared_ptr<EventReceiver> playerEventReceiver_; 150 std::shared_ptr<FilterCallback> playerFilterCallback_; 151 std::vector<std::weak_ptr<Meta>> streamMeta_{}; 152 std::atomic<PlayerStates> pipelineStates_ {PlayerStates::PLAYER_IDLE}; // only update in UpdateStateNoLock() 153 std::queue<PlayerStates> pendingStates_ {}; 154 std::shared_ptr<OHOS::Media::Pipeline::Pipeline> pipeline_; 155 std::shared_ptr<DemuxerFilter> demuxer_; 156 std::shared_ptr<AudioDecoderFilter> audioDecoder_; 157 std::shared_ptr<AudioSinkFilter> audioSink_; 158 #ifdef SUPPORT_VIDEO 159 std::shared_ptr<DecoderSurfaceFilter> videoDecoder_; 160 #endif 161 std::shared_ptr<MediaSyncManager> syncManager_; 162 std::atomic<PlayerStateId> curState_; 163 HiPlayerCallbackLooper callbackLooper_{}; 164 sptr<Surface> surface_ {nullptr}; 165 std::string url_; 166 std::shared_ptr<IMediaDataSource> dataSrc_{nullptr}; 167 int32_t videoWidth_{0}; 168 int32_t videoHeight_{0}; 169 170 std::shared_ptr<Meta> audioRenderInfo_{nullptr}; 171 std::shared_ptr<Meta> audioInterruptMode_{nullptr}; 172 173 bool isStreaming_{false}; 174 175 std::mutex drmMutex_; 176 std::condition_variable drmConfigCond_; 177 bool isDrmProtected_ = false; 178 bool isDrmPrepared_ = false; 179 bool stopWaitingDrmConfig_ = false; 180 sptr<DrmStandard::IMediaKeySessionService> keySessionServiceProxy_{nullptr}; 181 int32_t svpMode_ = HiplayerSvpMode::SVP_CLEAR; 182 183 bool isInitialPlay_ = true; 184 std::vector<std::pair<EventType, bool>> initialAVStates_; 185 std::vector<std::pair<std::string, bool>> completeState_; 186 std::mutex seekMutex_; 187 188 int32_t rotation90 = 90; 189 int32_t rotation270 = 270; 190 }; 191 } // namespace Media 192 } // namespace OHOS 193 #endif // HI_PLAYER_IMPL_H 194