• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_PATTERN_H
18 #include "base/geometry/dimension.h"
19 #include "base/geometry/size.h"
20 #include "base/memory/referenced.h"
21 #include "base/utils/noncopyable.h"
22 #include "core/components/video/video_controller_v2.h"
23 #include "core/components_ng/image_provider/image_loading_context.h"
24 #include "core/components_ng/pattern/pattern.h"
25 #include "core/components_ng/pattern/video/video_accessibility_property.h"
26 #include "core/components_ng/pattern/video/video_event_hub.h"
27 #include "core/components_ng/pattern/video/video_layout_algorithm.h"
28 #include "core/components_ng/pattern/video/video_layout_property.h"
29 #include "core/components_ng/property/property.h"
30 #include "core/components_ng/render/media_player.h"
31 #include "core/components_ng/render/render_surface.h"
32 #include "core/pipeline_ng/pipeline_context.h"
33 #include "frameworks/base/geometry/rect.h"
34 
35 namespace OHOS::Ace::NG {
36 class VideoPattern : public Pattern {
37     DECLARE_ACE_TYPE(VideoPattern, Pattern);
38 
39 public:
40     using HiddenChangeEvent = std::function<void(bool)>;
41 
42     VideoPattern() = delete;
43     explicit VideoPattern(const RefPtr<VideoControllerV2>& videoController);
44     ~VideoPattern() override;
45 
CreateEventHub()46     RefPtr<EventHub> CreateEventHub() override
47     {
48         return MakeRefPtr<VideoEventHub>();
49     }
50 
CreateLayoutProperty()51     RefPtr<LayoutProperty> CreateLayoutProperty() override
52     {
53         return MakeRefPtr<VideoLayoutProperty>();
54     }
55 
CreateLayoutAlgorithm()56     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
57     {
58         return MakeRefPtr<VideoLayoutAlgorithm>();
59     }
60 
CreateAccessibilityProperty()61     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
62     {
63         return MakeRefPtr<VideoAccessibilityProperty>();
64     }
65 
DefaultSupportDrag()66     bool DefaultSupportDrag() override
67     {
68         return true;
69     }
70 
UpdateMuted(bool muted)71     void UpdateMuted(bool muted)
72     {
73         muted_ = muted;
74     }
75 
GetMuted()76     bool GetMuted() const
77     {
78         return muted_;
79     }
80 
UpdateAutoPlay(bool autoPlay)81     void UpdateAutoPlay(bool autoPlay)
82     {
83         autoPlay_ = autoPlay;
84     }
85 
GetAutoPlay()86     bool GetAutoPlay() const
87     {
88         return autoPlay_;
89     }
90 
UpdateLoop(bool loop)91     void UpdateLoop(bool loop)
92     {
93         loop_ = loop;
94     }
95 
GetLoop()96     bool GetLoop() const
97     {
98         return loop_;
99     }
100 
101     virtual bool IsFullScreen() const;
102 
103     void OnColorConfigurationUpdate() override;
UpdateProgressRate(double progressRate)104     void UpdateProgressRate(double progressRate)
105     {
106         progressRate_ = progressRate;
107     }
108 
GetProgressRate()109     double GetProgressRate() const
110     {
111         return progressRate_;
112     }
113 
GetFocusPattern()114     FocusPattern GetFocusPattern() const override
115     {
116         // Video focus type is scope, it is a container, inner focus is on slider now.
117         return { FocusType::SCOPE, true };
118     }
119 
120     RefPtr<FrameNode> CreateControlBar(int32_t nodeId = -1);
121 
SetHiddenChangeEvent(HiddenChangeEvent && hiddenChangeEvent)122     void SetHiddenChangeEvent(HiddenChangeEvent&& hiddenChangeEvent)
123     {
124         hiddenChangeEvent_ = std::move(hiddenChangeEvent);
125     }
126 
GetCurrentPos()127     uint32_t GetCurrentPos() const
128     {
129         return currentPos_;
130     }
131 
GetDuration()132     uint32_t GetDuration() const
133     {
134         return duration_;
135     }
136 
GetInitialState()137     bool GetInitialState() const
138     {
139         return isInitialState_;
140     }
141 
OnBackPressed()142     virtual bool OnBackPressed()
143     {
144         return false;
145     }
146 
147     void OnVisibleChange(bool isVisible) override;
148 
149     void OnAreaChangedInner() override;
150 
151     // It is used to init mediaplayer on background.
152     void UpdateMediaPlayerOnBg();
153     void ResetMediaPlayer();
154 
155     void EnableDrag();
SetIsStop(bool isStop)156     void SetIsStop(bool isStop)
157     {
158         isStop_ = isStop;
159     }
160 
GetIsStop()161     bool GetIsStop() const
162     {
163         return isStop_;
164     }
165 
SetIsDrag(bool isDrag)166     void SetIsDrag(bool isDrag)
167     {
168         isDrag_ = isDrag;
169     }
170 
IsInitialState()171     bool IsInitialState() const
172     {
173         return isInitialState_;
174     }
175 
SetIsDragEndAutoPlay(bool isDragEndAutoPlay)176     void SetIsDragEndAutoPlay(bool isDragEndAutoPlay)
177     {
178         dragEndAutoPlay_ = isDragEndAutoPlay;
179     }
180 
GetSrc()181     const std::string& GetSrc() const
182     {
183         return src_;
184     }
185 
UpdateMediaParam(const RefPtr<MediaPlayer> & mediaPlayer,const RefPtr<RenderSurface> & renderSurface,const RefPtr<RenderContext> & renderContext)186     void UpdateMediaParam(const RefPtr<MediaPlayer>& mediaPlayer, const RefPtr<RenderSurface>& renderSurface,
187         const RefPtr<RenderContext>& renderContext)
188     {
189         mediaPlayer_ = AceType::Claim(AceType::RawPtr(mediaPlayer));
190         renderSurface_ = AceType::Claim(AceType::RawPtr(renderSurface));
191         renderContextForMediaPlayer_ = AceType::Claim(AceType::RawPtr(renderContext));
192     }
193 
ResetMediaParam()194     void ResetMediaParam()
195     {
196         mediaPlayer_.Reset();
197         renderSurface_.Reset();
198         renderContextForMediaPlayer_.Reset();
199     }
200 
201     void OnFullScreenChange(bool isFullScreen);
202 
203     void RecoverState(const RefPtr<VideoPattern>& videoPattern);
204 
205     bool NeedLift() const;
206 
GetFullScreenNode()207     RefPtr<FrameNode> GetFullScreenNode() const
208     {
209         if (!fullScreenNodeId_.has_value()) {
210             return nullptr;
211         }
212         return FrameNode::GetFrameNode(V2::VIDEO_ETS_TAG, fullScreenNodeId_.value());
213     }
214 
215     void OnPlayerStatus(PlaybackStatus status);
216 
217     void OnCurrentTimeChange(uint32_t currentPos);
218 
219     void OnError(const std::string& errorId);
220 
221     void OnResolutionChange() const;
222 
223     void OnStartRenderFrameCb() const;
224 
ResetLastBoundsRect()225     void ResetLastBoundsRect()
226     {
227         lastBoundsRect_.SetRect(0.0f, 0.0f, 0.0f, 0.0f);
228     }
229 
230     RefPtr<VideoPattern> GetTargetVideoPattern();
231 
232 #ifdef VIDEO_TEXTURE_SUPPORTED
233     void OnTextureRefresh(void* surface);
234 #endif
235 
236 protected:
237     void OnUpdateTime(uint32_t time, int pos) const;
238     void RegisterMediaPlayerEvent();
239 
240     RefPtr<MediaPlayer> mediaPlayer_ = MediaPlayer::Create();
241     RefPtr<RenderSurface> renderSurface_ = RenderSurface::Create();
242     RefPtr<RenderContext> renderContextForMediaPlayer_ = RenderContext::Create();
243 
244     int32_t instanceId_;
245 
246 #if defined(VIDEO_TEXTURE_SUPPORTED) && defined(ENABLE_ROSEN_BACKEND)
247     WeakPtr<RenderSurface> renderSurfaceWeakPtr_;
248     WeakPtr<RenderContext> renderContextForMediaPlayerWeakPtr_;
249 #endif
250 
251 private:
252     void OnAttachToFrameNode() override;
253     void OnDetachFromMainTree() override;
254     void OnModifyDone() override;
255     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
256     void OnRebuildFrame() override;
257 
258     // Set properties for media player.
259     void PrepareMediaPlayer();
260     void SetMethodCall();
261 
262     bool SetSourceForMediaPlayer();
263     void UpdateLooping();
264     void UpdateSpeed();
265     void UpdateMuted();
266     void PrepareSurface();
267 
268     bool HasPlayer() const;
269 
270     // Functions for the video controller.
271     void Start();
272     void Pause();
273     void Stop();
274     void FullScreen();
275 
276     void SetCurrentTime(float currentPos, SeekMode seekMode = SeekMode::SEEK_PREVIOUS_SYNC);
277     void SetFullScreenButtonCallBack(RefPtr<FrameNode>& fullScreenBtn);
278 
279     void OnPrepared(double width, double height, uint32_t duration, uint32_t currentPos, bool needFireEvent);
280     void OnCompletion();
281     void OnSliderChange(float posTime, int32_t mode);
282 
283     void UpdatePreviewImage();
284     void UpdateControllerBar();
285     void UpdateVideoProperty();
286 
287     static RefPtr<FrameNode> CreateSVG();
288     RefPtr<FrameNode> CreateText(uint32_t time);
289     RefPtr<FrameNode> CreateSlider();
290     void ChangePlayButtonTag();
291     void ChangePlayButtonTag(RefPtr<FrameNode>& playBtn);
292 
293     void ChangeFullScreenButtonTag(bool isFullScreen, RefPtr<FrameNode>& fullScreenBtn);
294     void ResetStatus();
295     void HiddenChange(bool hidden);
296     void PrintPlayerStatus(PlaybackStatus status);
297 
298     void UpdateFsState();
299     void checkNeedAutoPlay();
300 
301     // Fire error manually, eg. src is not existed. It must run on ui.
302     void FireError();
303 
SetMediaFullScreen(bool isFullScreen)304     void SetMediaFullScreen(bool isFullScreen)
305     {
306         mediaPlayer_->FullScreenChange(isFullScreen);
307         if (SystemProperties::GetExtSurfaceEnabled()) {
308             renderSurface_->SetIsFullScreen(isFullScreen);
309         }
310     }
311 
312 #ifdef VIDEO_TEXTURE_SUPPORTED
313     void* GetNativeWindow(int32_t instanceId, int64_t textureId);
314 #endif
315 
316     void RegisterRenderContextCallBack();
317 
318     RefPtr<VideoControllerV2> videoControllerV2_;
319     RefPtr<FrameNode> controlBar_;
320 
321     GestureEventFunc playBtnCallBack_;
322     GestureEventFunc pauseBtnCallBack_;
323     HiddenChangeEvent hiddenChangeEvent_;
324 
325     // Video src.
326     std::string src_;
327     bool isInitialState_ = true; // Initial state is true. Play or seek will set it to false.
328     bool isPlaying_ = false;
329 
330     bool isStop_ = false;
331     bool isDrag_ = false;
332 
333     bool muted_ = false;
334     bool autoPlay_ = false;
335     bool loop_ = false;
336 
337     bool pastPlayingStatus_ = false;
338 
339     bool dragEndAutoPlay_ = false;
340 
341     uint32_t currentPos_ = 0;
342     uint32_t duration_ = 0;
343 
344     // full screen node id
345     std::optional<int32_t> fullScreenNodeId_;
346 
347     // Video playback speed.
348     double progressRate_ = 1.0;
349 
350     Rect lastBoundsRect_;
351 
352     ACE_DISALLOW_COPY_AND_MOVE(VideoPattern);
353 };
354 } // namespace OHOS::Ace::NG
355 
356 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_PATTERN_H
357