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