• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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