[M120 Migration][MM] Make video hole work properly.
[platform/framework/web/chromium-efl.git] / tizen_src / chromium_impl / content / browser / media / tizen_renderer_impl.h
1 // Copyright 2022 Samsung Electronics Inc. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MEDIA_RENDERERS_TIZEN_RENDERER_IMPL_H_
6 #define MEDIA_RENDERERS_TIZEN_RENDERER_IMPL_H_
7
8 #include <vector>
9
10 #include "base/memory/raw_ptr.h"
11 #include "content/common/content_export.h"
12 #include "media/base/demuxer_stream.h"
13 #include "media/base/media_export.h"
14 #include "media/base/media_resource.h"
15 #include "media/base/pipeline_status.h"
16 #include "media/base/renderer.h"
17 #include "media/base/renderer_client.h"
18 #include "media/base/video_renderer_sink.h"
19 #include "media/base/waiting.h"
20 #include "media/mojo/mojom/renderer_extensions.mojom.h"
21 #include "mojo/public/cpp/bindings/pending_receiver.h"
22 #include "mojo/public/cpp/bindings/pending_remote.h"
23 #include "mojo/public/cpp/bindings/receiver.h"
24 #include "mojo/public/cpp/bindings/remote.h"
25 #include "third_party/abseil-cpp/absl/types/optional.h"
26 #include "ui/gfx/geometry/size.h"
27
28 namespace base {
29 class SingleThreadTaskRunner;
30 }
31
32 namespace media {
33 class MediaPlayerTizen;
34 class MediaResource;
35 }  // namespace media
36
37 namespace content {
38
39 class WebContents;
40 class MediaPlayerRendererWebContentsObserver;
41
42 class CONTENT_EXPORT TizenRendererImpl
43     : public media::Renderer,
44       public media::mojom::MediaPlayerRendererExtension {
45  public:
46   using RendererExtension = media::mojom::MediaPlayerRendererExtension;
47   using ClientExtension = media::mojom::MediaPlayerRendererClientExtension;
48
49   TizenRendererImpl(
50       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
51       media::VideoRendererSink* sink);
52   TizenRendererImpl(
53       int process_id,
54       int routing_id,
55       WebContents* web_contents,
56       mojo::PendingReceiver<RendererExtension> renderer_extension_receiver,
57       mojo::PendingRemote<ClientExtension> client_extension_remote);
58   TizenRendererImpl(const TizenRendererImpl&) = delete;
59   TizenRendererImpl& operator=(const TizenRendererImpl&) = delete;
60   ~TizenRendererImpl();
61
62   // Renderer implementation.
63   void Initialize(media::MediaResource* media_resource,
64                   media::RendererClient* client,
65                   media::PipelineStatusCallback init_cb) override;
66   void SetCdm(media::CdmContext* cdm_context,
67               CdmAttachedCB cdm_attached_cb) override;
68   void SetLatencyHint(absl::optional<base::TimeDelta> latency_hint) override;
69   void SetPreservesPitch(bool preserves_pitch) override;
70   void Flush(base::OnceClosure flush_cb) override;
71   void StartPlayingFrom(base::TimeDelta time) override;
72   void SetPlaybackRate(double playback_rate) override;
73   void SetVolume(float volume) override;
74   base::TimeDelta GetMediaTime() override;
75   media::RendererType GetRendererType() override;
76   void OnSelectedVideoTracksChanged(
77       const std::vector<media::DemuxerStream*>& enabled_tracks,
78       base::OnceClosure change_completed_cb) override;
79   void OnEnabledAudioTracksChanged(
80       const std::vector<media::DemuxerStream*>& enabled_tracks,
81       base::OnceClosure change_completed_cb) override;
82   void InitiateScopedSurfaceRequest(
83       InitiateScopedSurfaceRequestCallback callback) override;
84   void OnUpdateAudioMutingState(bool muted) {}
85   void OnWebContentsDestroyed();
86
87   // Should be removed.
88   void Seek(base::TimeDelta time, base::OnceClosure seek_cb);
89
90   void Suspend() override;
91
92   // Proxy functions for MediaPlayerRendererClientExtension
93   void OnVideoSizeChange(const gfx::Size& size);
94   void OnDurationChange(base::TimeDelta duration);
95   void OnBufferUpdate(base::TimeDelta time);
96
97 #if defined(TIZEN_VIDEO_HOLE)
98   void SetVideoHole(bool is_video_hole) final;
99   void SetMediaGeometry(const gfx::RectF& rect) final;
100
101   gfx::Rect GetViewportRect() const;
102 #endif
103
104   void OnNewFrameAvailable(uint32_t playerId,
105                            base::UnsafeSharedMemoryRegion frame,
106                            uint32_t size,
107                            base::TimeDelta timestamp,
108                            uint32_t width,
109                            uint32_t height);
110
111 #if defined(TIZEN_TBM_SUPPORT)
112   void OnNewTbmFrameAvailable(uint32_t player_id,
113                               gfx::TbmBufferHandle tbm_handle,
114                               base::TimeDelta timestamp);
115   void OnTbmBufferExhausted(const gfx::TbmBufferHandle& tbm_handle) override;
116 #endif
117
118   void OnRequestSuspend(bool resource_conflict);
119
120  private:
121   class RendererClientInternal;
122   const float kDefaultVolume = 1.0;
123
124   enum State {
125     STATE_UNINITIALIZED,
126     STATE_INIT_PENDING_CDM,  // Initialization is waiting for the CDM to be set.
127     STATE_INITIALIZING,      // Initializing audio/video renderers.
128     STATE_FLUSHING,          // Flushing is in progress.
129     STATE_FLUSHED,           // After initialization or after flush completed.
130     STATE_PLAYING,           // After StartPlayingFrom has been called.
131     STATE_ERROR
132   };
133
134   void SetStreamInfo();
135   void SetPlayerVolume();
136 #if defined(TIZEN_VIDEO_HOLE)
137   void SetPlayerVideoHole();
138   void SetPlayerMediaGeometry();
139   void OnWebViewMoved();
140 #endif
141   void OnRendererEnded();
142   void OnError(media::PipelineStatus error);
143   void OnStatisticsUpdate(const media::PipelineStatistics& stats);
144   void OnBufferingStateChange(media::BufferingState new_buffering_state,
145                               media::BufferingStateChangeReason reason);
146   void OnWaiting(media::WaitingReason reason);
147   void OnAudioConfigChange(const media::AudioDecoderConfig& config);
148   void OnVideoConfigChange(const media::VideoDecoderConfig& config);
149   void OnVideoNaturalSizeChange(const gfx::Size& size);
150   void OnVideoOpacityChange(bool opaque);
151   void OnVideoFrameRateChange(absl::optional<int> fps);
152
153   void OnRequestSeek(base::TimeDelta time);
154
155   media::RendererClient* client_ = nullptr;
156
157   State state_ = STATE_UNINITIALIZED;
158
159   // Task runner used to execute pipeline tasks.
160   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
161
162   media::VideoRendererSink* const sink_ = nullptr;
163   mojo::Remote<ClientExtension> client_extension_;
164
165   int player_id_ = 0;
166
167   // Identifiers to find the RenderFrameHost that created |this|.
168   // NOTE: We store these IDs rather than a RenderFrameHost* because we do not
169   // know when the RenderFrameHost is destroyed.
170   int render_process_id_ = 0;
171   int routing_id_ = 0;
172
173   // Temporary callback used for Initialize().
174   media::PipelineStatusCallback init_cb_;
175
176   std::unique_ptr<RendererClientInternal> audio_renderer_client_;
177   std::unique_ptr<RendererClientInternal> video_renderer_client_;
178
179   media::MediaResource* media_resource_ = nullptr;
180   media::DemuxerStream* audio_stream_ = nullptr;
181   media::DemuxerStream* video_stream_ = nullptr;
182
183   std::unique_ptr<media::MediaPlayerTizen> media_player_;
184   double volume_ = kDefaultVolume;
185   double playback_rate_ = 0.0;
186
187   // The time to start playback from after starting/seeking has completed.
188   base::TimeDelta start_time_;
189
190   media::BufferingState audio_buffering_state_ = media::BUFFERING_HAVE_NOTHING;
191   media::BufferingState video_buffering_state_ = media::BUFFERING_HAVE_NOTHING;
192
193   // Whether we've received the audio/video ended events.
194   bool media_ended_ = false;
195   bool web_contents_muted_ = false;
196   mojo::Receiver<MediaPlayerRendererExtension> renderer_extension_receiver_;
197   raw_ptr<content::MediaPlayerRendererWebContentsObserver>
198       web_contents_observer_ = nullptr;
199
200   // Indicates if a serious error has been encountered by the |media_player_|.
201   bool has_error_ = false;
202   bool resource_conflicted_ = true;
203   bool is_suspended_ = false;
204
205 #if defined(TIZEN_VIDEO_HOLE)
206   bool is_video_hole_ = false;
207   gfx::RectF video_rect_;
208 #endif
209
210   WebContents* web_contents_ = nullptr;
211
212   base::WeakPtrFactory<TizenRendererImpl> weak_factory_{this};
213 };
214
215 }  // namespace content
216
217 #endif  // MEDIA_RENDERERS_TIZEN_RENDERER_IMPL_H_