1 // Copyright 2017 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.
5 #ifndef MEDIA_BASE_TIZEN_SUSPENDING_MEDIA_PLAYER_H_
6 #define MEDIA_BASE_TIZEN_SUSPENDING_MEDIA_PLAYER_H_
11 #include "base/memory/ptr_util.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "media/base/timestamp_constants.h"
14 #include "media/base/tizen/demuxer_efl.h"
15 #include "media/base/tizen/media_player_efl.h"
16 #include "media/base/tizen/media_player_interface_efl.h"
17 #include "media/base/tizen/media_player_manager_efl.h"
21 class SuspendingMediaPlayer;
23 class SuspendingMediaSourcePlayer : public DemuxerEflClient, public DemuxerEfl {
25 SuspendingMediaSourcePlayer(SuspendingMediaPlayer* parent,
26 std::unique_ptr<DemuxerEfl> demuxer)
28 demuxer_client_(nullptr),
29 demuxer_(std::move(demuxer)) {}
31 // DemuxerEflClient interface
32 void OnDemuxerConfigsAvailable(const DemuxerConfigs& params) override;
33 void OnDemuxerDataAvailable(base::SharedMemoryHandle foreign_memory_handle,
34 const DemuxedBufferMetaData& meta_data) override;
35 void OnDemuxerSeekDone(
36 const base::TimeDelta& actual_browser_seek_time) override;
37 void OnDemuxerDurationChanged(base::TimeDelta duration) override;
38 #if defined(OS_TIZEN_TV_PRODUCT)
39 void OnDemuxerStateChanged(const DemuxerConfigs& params) override;
42 // DemuxerEfl interface
43 void Initialize(DemuxerEflClient* client) override;
44 void RequestDemuxerSeek(const base::TimeDelta& time_to_seek) override;
45 void RequestDemuxerData(DemuxerStream::Type type) override;
48 SuspendingMediaPlayer* const parent_;
49 DemuxerEflClient* demuxer_client_;
50 const std::unique_ptr<DemuxerEfl> demuxer_;
53 class SuspendingMediaPlayer : public MediaPlayerInterfaceEfl,
54 public MediaPlayerManager {
55 struct constructor_tag {};
58 static MediaPlayerInterfaceEfl* CreatePlayer(int player_id,
60 const std::string& mime_type,
61 MediaPlayerManager* manager,
62 const std::string& user_agent,
63 int audio_latency_mode,
65 auto suspending_player =
66 base::MakeUnique<SuspendingMediaPlayer>(constructor_tag());
67 suspending_player->InjectMediaPlayer(MediaPlayerEfl::CreatePlayer(
68 player_id, url, mime_type, suspending_player->InjectManager(manager),
69 user_agent, audio_latency_mode, video_hole));
70 return suspending_player.release();
73 static MediaPlayerInterfaceEfl* CreatePlayer(
75 std::unique_ptr<DemuxerEfl> demuxer,
76 MediaPlayerManager* manager,
78 auto suspending_player =
79 base::MakeUnique<SuspendingMediaPlayer>(constructor_tag());
80 suspending_player->InjectMediaPlayer(MediaPlayerEfl::CreatePlayer(
81 player_id, suspending_player->InjectDemuxer(std::move(demuxer)),
82 suspending_player->InjectManager(manager), video_hole));
83 return suspending_player.release();
86 explicit SuspendingMediaPlayer(constructor_tag) : SuspendingMediaPlayer() {}
88 // MediaPlayerEfl interface
89 int GetPlayerId() const override;
90 void Initialize() override;
92 void Pause(bool is_media_related_action) override;
93 void SetRate(double rate) override;
94 void Seek(base::TimeDelta time) override;
95 void SetVolume(double volume) override;
96 base::TimeDelta GetCurrentTime() override;
97 void EnteredFullscreen() override;
98 void ExitedFullscreen() override;
100 #if defined(TIZEN_SOUND_FOCUS)
101 // SoundFocusClient interface
102 void SetResumePlayingBySFM(bool resume_playing) override;
103 void OnFocusAcquired() override;
104 void OnFocusReleased(bool resume_playing) override;
107 #if defined(TIZEN_EXTERNAL_MEDIA_EVENT)
108 void ReleaseKeyGrab(int player_id) override;
109 void AcquireKeyGrab(int player_id) override;
112 // Interface for resource handling
113 MediaTypeFlags GetMediaType() const override;
114 bool IsPlayerSuspended() const;
115 bool IsPlayerFullyResumed() const;
116 bool IsPlayerResuming() const;
117 void Suspend() override;
118 void Resume() override;
120 double GetStartDate() override;
122 #if defined(TIZEN_VIDEO_HOLE)
123 void SetGeometry(const gfx::RectF&) override;
124 void OnWebViewMoved() override;
127 #if defined(TIZEN_MULTIMEDIA_SUPPORT)
128 void LaunchSystemVolumeController() override;
131 // MediaPlayerManager interface
132 MediaPlayerInterfaceEfl* GetPlayer(int player_id) override;
133 void OnTimeChanged(int player_id) override;
134 void OnTimeUpdate(int player_id, base::TimeDelta current_time) override;
135 void OnRequestSeek(int player_id, base::TimeDelta seek_time) override;
136 void OnPauseStateChange(int player_id, bool state) override;
137 void OnSeekComplete(int player_id) override;
138 void OnBufferUpdate(int player_id, int buffering_percentage) override;
139 void OnDurationChange(int player_id, base::TimeDelta duration) override;
140 void OnReadyStateChange(int player_id,
141 blink::WebMediaPlayer::ReadyState state) override;
142 void OnNetworkStateChange(int player_id,
143 blink::WebMediaPlayer::NetworkState state) override;
144 void OnMediaDataChange(int player_id,
148 void OnNewFrameAvailable(int player_id,
149 base::SharedMemoryHandle handle,
151 base::TimeDelta timestamp) override;
152 void OnInitComplete(int player_id, bool success) override;
153 void OnResumeComplete(int player_id) override;
154 void OnSuspendComplete(int player_id) override;
156 #if defined(TIZEN_VIDEO_HOLE)
157 gfx::Rect GetViewportRect() const override;
160 #if defined(TIZEN_TBM_SUPPORT)
161 void OnNewTbmBufferAvailable(int player_id,
162 gfx::TbmBufferHandle tbm_handle,
163 base::TimeDelta timestamp) override;
166 #if defined(OS_TIZEN_TV_PRODUCT)
167 void OnAddAudioTrack(int player_id,
168 const std::string& kind,
169 const std::string& language,
170 const std::string& id,
171 bool selected) override;
172 void OnAddVideoTrack(int player_id,
173 const std::string& kind,
174 const std::string& language,
175 const std::string& id,
176 bool selected) override;
177 void OnAddTextTrack(int player_id,
178 const std::string& label,
179 const std::string& language,
180 const std::string& id) override;
182 void OnSeekableTimeChange(int player_id,
183 base::TimeDelta min_time,
184 base::TimeDelta max_time) override;
186 void OnInbandEventTextTrack(int player_id, const std::string& info) override;
187 void OnInbandEventTextCue(int player_id,
188 const std::string& info,
190 long long int start_time,
191 long long int end_time) override;
193 void OnDrmError(int player_id) override;
196 void StorePosition(const base::TimeDelta& position);
198 content::WebContents* GetWebContents(int player_id) override;
200 bool IsPaused() const override { return player_->IsPaused(); }
202 void OnPlayerSuspendRequest(int player_id) override;
204 bool ShouldSeekAfterResume() const override {
205 return player_->ShouldSeekAfterResume();
208 bool HasConfigs() const override { return player_->HasConfigs(); }
210 #if defined(TIZEN_MULTIMEDIA_SUPPORT)
211 void OnSystemVolumeChange(int player_id, int volume) override;
215 SuspendingMediaPlayer()
216 : task_runner_(base::ThreadTaskRunnerHandle::Get()),
217 weak_factory_(this) {}
219 enum class player_state {
226 enum class action_after_resume { NONE, PLAY, PAUSE };
228 enum class seek_state { SEEK_NONE, SEEK_ON_DEMUXER, SEEK_ON_PLAYER };
230 MediaPlayerManager* InjectManager(MediaPlayerManager* manager) {
235 // Must take ownership
236 MediaPlayerInterfaceEfl* InjectMediaPlayer(MediaPlayerInterfaceEfl* player) {
237 player_ = std::unique_ptr<MediaPlayerInterfaceEfl>(player);
241 std::unique_ptr<DemuxerEfl> InjectDemuxer(
242 std::unique_ptr<DemuxerEfl> demuxer) {
243 return base::MakeUnique<SuspendingMediaSourcePlayer>(this,
247 void AddFunctionToQueue(std::function<void()> function);
248 void ExecuteFunction(const std::function<void()>& function);
249 void ExecuteQueuedFunctionsAfterResume();
251 std::unique_ptr<MediaPlayerInterfaceEfl> player_;
252 MediaPlayerManager* manager_ = nullptr;
254 player_state state_{player_state::RESUMED};
255 seek_state seek_state_{seek_state::SEEK_NONE};
256 bool is_paused_{false};
257 bool is_seek_after_resume_{false};
258 base::TimeDelta stored_position_;
259 action_after_resume action_after_resume_{action_after_resume::NONE};
261 std::queue<std::function<void()>> functions_to_be_called_after_resume_;
263 const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
264 base::WeakPtrFactory<SuspendingMediaPlayer> weak_factory_;
266 friend class SuspendingMediaSourcePlayer;
268 DISALLOW_COPY_AND_ASSIGN(SuspendingMediaPlayer);
273 #endif // MEDIA_BASE_TIZEN_SUSPENDING_MEDIA_PLAYER_H_