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