1 /*
2  * Copyright (c) 2022-2024 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 {
36 class ImageAnalyzerManager;
37 }
38 namespace OHOS::Ace::NG {
39 class VideoPattern : public Pattern {
40     DECLARE_ACE_TYPE(VideoPattern, Pattern);
41 
42 public:
43     using HiddenChangeEvent = std::function<void(bool)>;
44 
45     VideoPattern() = delete;
46     explicit VideoPattern(const RefPtr<VideoControllerV2>& videoController);
47     ~VideoPattern() override;
48 
CreateEventHub()49     RefPtr<EventHub> CreateEventHub() override
50     {
51         return MakeRefPtr<VideoEventHub>();
52     }
53 
CreateLayoutProperty()54     RefPtr<LayoutProperty> CreateLayoutProperty() override
55     {
56         return MakeRefPtr<VideoLayoutProperty>();
57     }
58 
CreateLayoutAlgorithm()59     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
60     {
61         return MakeRefPtr<VideoLayoutAlgorithm>();
62     }
63 
CreateAccessibilityProperty()64     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
65     {
66         return MakeRefPtr<VideoAccessibilityProperty>();
67     }
68 
IsSupportDrawModifier()69     bool IsSupportDrawModifier() const override
70     {
71         return false;
72     }
73 
UpdateMuted(bool muted)74     void UpdateMuted(bool muted)
75     {
76         muted_ = muted;
77     }
78 
GetMuted()79     bool GetMuted() const
80     {
81         return muted_;
82     }
83 
UpdateAutoPlay(bool autoPlay)84     void UpdateAutoPlay(bool autoPlay)
85     {
86         autoPlay_ = autoPlay;
87     }
88 
GetAutoPlay()89     bool GetAutoPlay() const
90     {
91         return autoPlay_;
92     }
93 
UpdateLoop(bool loop)94     void UpdateLoop(bool loop)
95     {
96         loop_ = loop;
97     }
98 
GetLoop()99     bool GetLoop() const
100     {
101         return loop_;
102     }
103 
104     virtual bool IsFullScreen() const;
105 
106     void OnColorConfigurationUpdate() override;
UpdateProgressRate(double progressRate)107     void UpdateProgressRate(double progressRate)
108     {
109         progressRate_ = progressRate;
110     }
111 
GetProgressRate()112     double GetProgressRate() const
113     {
114         return progressRate_;
115     }
116 
GetFocusPattern()117     FocusPattern GetFocusPattern() const override
118     {
119         // Video focus type is scope, it is a container, inner focus is on slider now.
120         return { FocusType::SCOPE, true };
121     }
122 
123     RefPtr<FrameNode> CreateControlBar(int32_t nodeId = -1);
124 
SetHiddenChangeEvent(HiddenChangeEvent && hiddenChangeEvent)125     void SetHiddenChangeEvent(HiddenChangeEvent&& hiddenChangeEvent)
126     {
127         hiddenChangeEvent_ = std::move(hiddenChangeEvent);
128     }
129 
GetCurrentPos()130     uint32_t GetCurrentPos() const
131     {
132         return currentPos_;
133     }
134 
GetDuration()135     uint32_t GetDuration() const
136     {
137         return duration_;
138     }
139 
GetInitialState()140     bool GetInitialState() const
141     {
142         return isInitialState_;
143     }
144 
OnBackPressed()145     virtual bool OnBackPressed()
146     {
147         return false;
148     }
149 
150     void OnVisibleChange(bool isVisible) override;
151 
152     void OnAreaChangedInner() override;
153 
154     // It is used to init mediaplayer on background.
155     void UpdateMediaPlayerOnBg();
156     void ResetMediaPlayer();
157 
SetIsStop(bool isStop)158     void SetIsStop(bool isStop)
159     {
160         isStop_ = isStop;
161     }
162 
GetIsStop()163     bool GetIsStop() const
164     {
165         return isStop_;
166     }
167 
IsInitialState()168     bool IsInitialState() const
169     {
170         return isInitialState_;
171     }
172 
GetSrc()173     const std::string& GetSrc() const
174     {
175         return videoSrcInfo_.src;
176     }
177 
UpdateMediaParam(const RefPtr<MediaPlayer> & mediaPlayer,const RefPtr<RenderSurface> & renderSurface,const RefPtr<RenderContext> & renderContext)178     void UpdateMediaParam(const RefPtr<MediaPlayer>& mediaPlayer, const RefPtr<RenderSurface>& renderSurface,
179         const RefPtr<RenderContext>& renderContext)
180     {
181         mediaPlayer_ = AceType::Claim(AceType::RawPtr(mediaPlayer));
182         renderSurface_ = AceType::Claim(AceType::RawPtr(renderSurface));
183         renderContextForMediaPlayer_ = AceType::Claim(AceType::RawPtr(renderContext));
184     }
185 
ResetMediaParam()186     void ResetMediaParam()
187     {
188         mediaPlayer_.Reset();
189         renderSurface_.Reset();
190         RemoveMediaPlayerSurfaceNode();
191         renderContextForMediaPlayer_.Reset();
192     }
193 
194     void RemoveMediaPlayerSurfaceNode();
195 
196     void OnFullScreenChange(bool isFullScreen);
197 
198     void RecoverState(const RefPtr<VideoPattern>& videoPattern);
199 
200     bool NeedLift() const;
201 
GetFullScreenNode()202     RefPtr<FrameNode> GetFullScreenNode() const
203     {
204         if (!fullScreenNodeId_.has_value()) {
205             return nullptr;
206         }
207         return FrameNode::GetFrameNode(V2::VIDEO_ETS_TAG, fullScreenNodeId_.value());
208     }
209 
210     void OnPlayerStatus(PlaybackStatus status);
211 
212     void OnCurrentTimeChange(uint32_t currentPos);
213 
214     void OnError(const std::string& errorId);
215 
216     void OnResolutionChange() const;
217 
218     void OnStartRenderFrameCb() const;
219 
ResetLastBoundsRect()220     void ResetLastBoundsRect()
221     {
222         lastBoundsRect_.SetRect(0.0f, 0.0f, 0.0f, 0.0f);
223     }
224 
225     RefPtr<VideoPattern> GetTargetVideoPattern();
226     void EnableAnalyzer(bool enable);
227     void SetImageAnalyzerConfig(void* config);
228     void SetImageAIOptions(void* options);
229     bool GetAnalyzerState();
UpdateAnalyzerState(bool isCreated)230     void UpdateAnalyzerState(bool isCreated)
231     {
232         isAnalyzerCreated_ = isCreated;
233     }
SetIsSeeking(bool isSeeking)234     void SetIsSeeking(bool isSeeking)
235     {
236         isSeeking_ = isSeeking;
237     }
238 
239 #ifdef RENDER_EXTRACT_SUPPORTED
240     void OnTextureRefresh(void* surface);
241 #endif
242 
243 protected:
244     void OnUpdateTime(uint32_t time, int pos) const;
245     void RegisterMediaPlayerEvent();
246 
247     RefPtr<MediaPlayer> mediaPlayer_ = MediaPlayer::Create();
248     RefPtr<RenderSurface> renderSurface_ = RenderSurface::Create();
249     RefPtr<RenderContext> renderContextForMediaPlayer_ = RenderContext::Create();
250 
251     int32_t instanceId_;
252 
253 #if defined(RENDER_EXTRACT_SUPPORTED) && defined(ENABLE_ROSEN_BACKEND)
254     WeakPtr<RenderSurface> renderSurfaceWeakPtr_;
255     WeakPtr<RenderContext> renderContextForMediaPlayerWeakPtr_;
256 #endif
257 
258 private:
259     void OnAttachToFrameNode() override;
260     void OnDetachFromFrameNode(FrameNode* frameNode) override;
261     void OnDetachFromMainTree() override;
262     void OnModifyDone() override;
263     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
264     void OnRebuildFrame() override;
265     void OnWindowHide() override;
266 
267     // Set properties for media player.
268     void PrepareMediaPlayer();
269     void SetStartImpl(
270         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
271     void SetPausetImpl(
272         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
273     void SetStopImpl(
274         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
275     void SetSeekToImpl(
276         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
277     void SetRequestFullscreenImpl(
278         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
279     void SetExitFullscreenImpl(
280         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
281     void SetResetImpl(
282         const RefPtr<VideoController>& videoController, const SingleTaskExecutor& uiTaskExecutor);
283 
284     void SetMethodCall();
285 
286     bool SetSourceForMediaPlayer();
287     void UpdateLooping();
288     void UpdateSpeed();
289     void UpdateMuted();
290     void PrepareSurface();
291 
292     bool HasPlayer() const;
293 
294     // Functions for the video controller.
295     void Start();
296     void Pause();
297     void Stop();
298     void FullScreen();
299 
300     void SetCurrentTime(float currentPos, SeekMode seekMode = SeekMode::SEEK_PREVIOUS_SYNC);
301     void SetFullScreenButtonCallBack(RefPtr<FrameNode>& fullScreenBtn);
302 
303     void OnPrepared(uint32_t duration, uint32_t currentPos, bool needFireEvent);
304     void OnCompletion();
305     void OnSliderChange(float posTime, int32_t mode);
306 
307     void UpdatePreviewImage();
308     void UpdateControllerBar();
309     void UpdateVideoProperty();
310 
311     RefPtr<FrameNode> CreateSVG();
312     RefPtr<FrameNode> CreateText(uint32_t time);
313     RefPtr<FrameNode> CreateSlider();
314     void ChangePlayButtonTag();
315     void ChangePlayButtonTag(RefPtr<FrameNode>& playBtn);
316 
317     void ChangeFullScreenButtonTag(bool isFullScreen, RefPtr<FrameNode>& fullScreenBtn);
318     void ResetStatus();
319     void HiddenChange(bool hidden);
320     void PrintPlayerStatus(PlaybackStatus status);
321 
322     void UpdateFsState();
323     void checkNeedAutoPlay();
324 
325     // Fire error manually, eg. src is not existed. It must run on ui.
326     void FireError();
327 
328     HiddenChangeEvent CreateHiddenChangeEvent();
329 
SetMediaFullScreen(bool isFullScreen)330     void SetMediaFullScreen(bool isFullScreen)
331     {
332         mediaPlayer_->FullScreenChange(isFullScreen);
333         if (SystemProperties::GetExtSurfaceEnabled()) {
334             renderSurface_->SetIsFullScreen(isFullScreen);
335         }
336     }
337 
338 #ifdef RENDER_EXTRACT_SUPPORTED
339     void* GetNativeWindow(int32_t instanceId, int64_t textureId);
340 #endif
341 
342     void RegisterRenderContextCallBack();
343     void ChangePlayerStatus(bool isPlaying, const PlaybackStatus& status);
344 
345     bool IsSupportImageAnalyzer();
346     bool ShouldUpdateImageAnalyzer();
347     void StartImageAnalyzer();
348     void StartUpdateImageAnalyzer();
349     void CreateAnalyzerOverlay();
350     void DestroyAnalyzerOverlay();
351     void UpdateAnalyzerOverlay();
352     void UpdateAnalyzerUIConfig(const RefPtr<NG::GeometryNode>& geometryNode);
353     void UpdateOverlayVisibility(VisibleType type);
354 
355     RefPtr<VideoControllerV2> videoControllerV2_;
356     RefPtr<FrameNode> controlBar_;
357 
358     GestureEventFunc playBtnCallBack_;
359     GestureEventFunc pauseBtnCallBack_;
360     HiddenChangeEvent hiddenChangeEvent_;
361 
362     // Video src.
363     VideoSourceInfo videoSrcInfo_;
364     bool isInitialState_ = true; // Initial state is true. Play or seek will set it to false.
365     bool isPlaying_ = false;
366 
367     bool isStop_ = false;
368 
369     bool muted_ = false;
370     bool autoPlay_ = false;
371     bool loop_ = false;
372 
373     bool pastPlayingStatus_ = false;
374 
375     bool isEnableAnalyzer_ = false;
376     bool isAnalyzerCreated_ = false;
377     bool isPaused_ = false;
378     bool isContentSizeChanged_ = false;
379     bool isSeeking_ = false;
380 
381     uint32_t currentPos_ = 0;
382     uint32_t duration_ = 0;
383 
384     // full screen node id
385     std::optional<int32_t> fullScreenNodeId_;
386 
387     // Video playback speed.
388     double progressRate_ = 1.0;
389 
390     Rect lastBoundsRect_;
391     Rect contentRect_;
392     std::shared_ptr<ImageAnalyzerManager> imageAnalyzerManager_;
393 
394     ACE_DISALLOW_COPY_AND_MOVE(VideoPattern);
395 };
396 } // namespace OHOS::Ace::NG
397 
398 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_PATTERN_H
399