1 // Copyright 2016 Samsung Electronics. 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 CONTENT_BROWSER_RENDERER_HOST_PEPPER_MEDIA_PLAYER_TIZEN_PEPPER_MEDIA_PLAYER_PRIVATE_TIZEN_H_
6 #define CONTENT_BROWSER_RENDERER_HOST_PEPPER_MEDIA_PLAYER_TIZEN_PEPPER_MEDIA_PLAYER_PRIVATE_TIZEN_H_
14 #include "base/timer/timer.h"
15 #include "base/single_thread_task_runner.h"
16 #include "content/browser/renderer_host/pepper/media_player/pepper_media_player_private.h"
17 #include "content/browser/renderer_host/pepper/media_player/pepper_media_data_source_private.h"
18 #include "content/browser/renderer_host/pepper/media_player/tizen/pepper_tizen_drm_manager.h"
19 #include "content/browser/renderer_host/pepper/media_player/tizen/pepper_tizen_player_dispatcher.h"
20 #include "content/browser/renderer_host/pepper/media_player/tizen/pepper_player_adapter_interface.h"
21 #include "ppapi/c/pp_errors.h"
22 #include "ppapi/c/samsung/pp_media_player_samsung.h"
24 namespace tracked_objects {
26 } // namespace tracked_objects
30 class PepperMediaDataSourcePrivate;
32 class PepperMediaPlayerPrivateTizen : public PepperMediaPlayerPrivate {
34 static scoped_refptr<PepperMediaPlayerPrivateTizen> Create(
35 std::unique_ptr<PepperPlayerAdapterInterface> player);
37 // PepperMediaPlayerPrivate
38 void SetBufferingListener(std::unique_ptr<BufferingListenerPrivate>) override;
39 void SetDRMListener(std::unique_ptr<DRMListenerPrivate>) override;
40 void SetMediaEventsListener(
41 std::unique_ptr<MediaEventsListenerPrivate>) override;
42 void SetSubtitleListener(std::unique_ptr<SubtitleListenerPrivate>) override;
44 void AttachDataSource(const scoped_refptr<PepperMediaDataSourcePrivate>&,
45 const base::Callback<void(int32_t)>& callback) override;
46 void DetachDataSource();
48 void Play(const base::Callback<void(int32_t)>& callback) override;
49 void Pause(const base::Callback<void(int32_t)>& callback) override;
50 void Stop(const base::Callback<void(int32_t)>& callback) override;
51 void Seek(PP_TimeTicks,
52 const base::Callback<void(int32_t)>& callback) override;
54 void SetPlaybackRate(double rate,
55 const base::Callback<void(int32_t)>& callback) override;
57 const base::Callback<void(int32_t, PP_TimeDelta)>& callback) override;
59 const base::Callback<void(int32_t, PP_TimeTicks)>& callback) override;
61 void GetPlayerState(const base::Callback<void(int32_t, PP_MediaPlayerState)>&
64 void GetVideoTracksList(const base::Callback<
65 void(int32_t, const std::vector<PP_VideoTrackInfo>&)>&
67 void GetCurrentVideoTrackInfo(
68 const base::Callback<void(int32_t, const PP_VideoTrackInfo&)>& callback)
71 void GetAudioTracksList(const base::Callback<
72 void(int32_t, const std::vector<PP_AudioTrackInfo>&)>&
74 void GetCurrentAudioTrackInfo(
75 const base::Callback<void(int32_t, const PP_AudioTrackInfo&)>& callback)
78 void GetTextTracksList(
79 const base::Callback<void(int32_t, const std::vector<PP_TextTrackInfo>&)>&
81 void GetCurrentTextTrackInfo(
82 const base::Callback<void(int32_t, const PP_TextTrackInfo&)>& callback)
85 void SelectTrack(PP_ElementaryStream_Type_Samsung,
87 const base::Callback<void(int32_t)>& callback) override;
89 void AddExternalSubtitles(
90 const std::string& file_path,
91 const std::string& encoding,
92 const base::Callback<void(int32_t, const PP_TextTrackInfo&)>& callback)
94 void SetSubtitlesDelay(
96 const base::Callback<void(int32_t)>& callback) override;
98 void SetDisplayRect(const PP_Rect& display_rect,
99 const PP_FloatRect& crop_ratio_rect,
100 const base::Callback<void(int32_t)>& callback) override;
102 void SetDRMSpecificData(
103 PP_MediaPlayerDRMType,
104 PP_MediaPlayerDRMOperation,
107 const base::Callback<void(int32_t)>& callback) override;
110 void OnLicenseRequest(const std::vector<uint8_t>& request);
112 void OnErrorEvent(PP_MediaPlayerError error_code);
113 void OnSeekCompleted();
114 void OnDRMEvent(int event_type, void* msg_data);
117 friend class base::RefCountedThreadSafe<PepperMediaPlayerPrivateTizen>;
118 explicit PepperMediaPlayerPrivateTizen(
119 std::unique_ptr<PepperPlayerAdapterInterface> player);
120 ~PepperMediaPlayerPrivateTizen() override;
122 // Aborts all pending callbacks.
123 void AbortCallbacks(int32_t reason);
125 // Invalidates player's dispatcher when it can't be reused in further calls.
126 // This can happen eg. when muse-server has crashed
127 void InvalidatePlayer();
129 void StartCurrentTimeNotifier();
130 void StopCurrentTimeNotifier();
132 // Executes and resets a given callback. Logs on_cb_empty_message if
133 // callback is not set, or skips printing if it's nullptr.
134 // Please note callbacks must only be executed on the main thread.
135 void ExecuteCallback(int32_t result,
136 base::Callback<void(int32_t)>* callback,
137 const char* on_cb_empty_message = nullptr);
138 // dispatcher call helpers
140 // Returns false if there is no need to fail (i.e. data source is attached)
141 // or runs a callback with an error and then returns true.
142 template <typename Functor, typename... Args>
143 bool FailIfNotAttached(const tracked_objects::Location& from_here,
144 const Functor& callback,
145 const Args&... args) {
149 base::MessageLoop::current()->task_runner()->PostTask(
151 base::Bind(callback, static_cast<int32_t>(PP_ERROR_FAILED), args...));
157 void UpdateDisplayRect(const base::Callback<void(int32_t)>&);
159 void OnDataSourceAttached(int32_t result);
161 void SeekOnPlayerThread(PP_TimeTicks, PepperPlayerAdapterInterface*);
163 void GetAudioTracksListOnPlayerThread(
164 const base::Callback<void(int32_t,
165 const std::vector<PP_AudioTrackInfo>&)>&,
166 PepperPlayerAdapterInterface*);
167 void GetCurrentAudioTrackInfoOnPlayerThread(
168 const base::Callback<void(int32_t, const PP_AudioTrackInfo&)>&,
169 PepperPlayerAdapterInterface*);
170 void GetTextTracksListOnPlayerThread(
171 const base::Callback<void(int32_t,
172 const std::vector<PP_TextTrackInfo>&)>&,
173 PepperPlayerAdapterInterface*);
174 void GetCurrentTextTrackInfoOnPlayerThread(
175 const base::Callback<void(int32_t, const PP_TextTrackInfo&)>&,
176 PepperPlayerAdapterInterface*);
177 void InitializeDisplayOnPlayerThread(PepperPlayerAdapterInterface* player);
178 void SetDisplayCropRatioOnPlayerThread(
180 const base::Callback<void(int32_t)>& callback,
181 PepperPlayerAdapterInterface*);
183 int32_t SetExternalSubtitlePathOnPlayerThread(const std::string& path,
184 const std::string& encoding,
185 PepperPlayerAdapterInterface*,
188 void SetSubtitleEncodingOnPlayerThread(PepperPlayerAdapterInterface* player);
190 void OnTimeNeedsUpdate();
192 void OnStoppedReply(int32_t result);
194 std::unique_ptr<PepperTizenPlayerDispatcher> dispatcher_;
195 scoped_refptr<PepperMediaDataSourcePrivate> data_source_;
197 std::unique_ptr<DRMListenerPrivate> drm_listener_;
199 base::RepeatingTimer time_update_timer_;
201 base::Callback<void(int32_t)> attach_callback_;
202 base::Callback<void(int32_t)> stop_callback_;
203 base::Callback<void(int32_t)> seek_callback_;
204 scoped_refptr<base::SingleThreadTaskRunner> main_cb_runner_;
206 PP_Rect display_rect_;
207 PP_FloatRect crop_ratio_rect_;
209 PP_TimeTicks current_time_;
211 std::string player_subtitle_encoding_;
213 base::WeakPtrFactory<PepperMediaPlayerPrivateTizen> weak_ptr_factory_;
215 PepperTizenDRMManager drm_manager_;
217 Evas_Object* video_window_;
220 } // namespace content
222 #endif // CONTENT_BROWSER_RENDERER_HOST_PEPPER_MEDIA_PLAYER_TIZEN_PEPPER_MEDIA_PLAYER_PRIVATE_TIZEN_H_