Index: chrome/browser/media/android/remote/remote_media_player_bridge.h |
diff --git a/chrome/browser/media/android/remote/remote_media_player_bridge.h b/chrome/browser/media/android/remote/remote_media_player_bridge.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f1f506c0f3735028c0b17db5c138d54ba34f064c |
--- /dev/null |
+++ b/chrome/browser/media/android/remote/remote_media_player_bridge.h |
@@ -0,0 +1,154 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_MEDIA_ANDROID_REMOTE_REMOTE_MEDIA_PLAYER_BRIDGE_H_ |
+#define CHROME_BROWSER_MEDIA_ANDROID_REMOTE_REMOTE_MEDIA_PLAYER_BRIDGE_H_ |
+ |
+#include <jni.h> |
+#include <vector> |
+ |
+#include "base/time/time.h" |
+#include "base/timer/timer.h" |
+#include "media/base/android/media_player_bridge.h" |
+ |
+class SkBitmap; |
+ |
+// This is the version of MediaPlayerBridge that handles the remote media |
+// playback. |
+ |
+namespace remote_media { |
+ |
+class RemoteMediaPlayerManager; |
+ |
+class RemoteMediaPlayerBridge : public media::MediaPlayerAndroid { |
+ public: |
+ RemoteMediaPlayerBridge( |
+ MediaPlayerAndroid* local_player, |
+ const std::string& user_agent, |
+ bool hide_url_log, |
+ RemoteMediaPlayerManager* manager); |
+ ~RemoteMediaPlayerBridge() override; |
+ |
+ static bool RegisterRemoteMediaPlayerBridge(JNIEnv* env); |
+ |
+ // Initialize this object. |
+ virtual void Initialize(); |
+ |
+ // MediaPlayerAndroid implementation. |
+ void SetVideoSurface(gfx::ScopedJavaSurface surface) override; |
+ void Start() override; |
+ void Pause(bool is_media_related_action) override; |
+ void SeekTo(base::TimeDelta timestamp) override; |
+ void Release() override; |
+ void SetVolume(double volume) override; |
+ int GetVideoWidth() override; |
+ int GetVideoHeight() override; |
+ base::TimeDelta GetCurrentTime() override; |
+ base::TimeDelta GetDuration() override; |
+ bool IsPlaying() override; |
+ bool CanPause() override; |
+ bool CanSeekForward() override; |
+ bool CanSeekBackward() override; |
+ bool IsPlayerReady() override; |
+ GURL GetUrl() override; |
+ GURL GetFirstPartyForCookies() override; |
+ |
+ // JNI functions |
+ base::android::ScopedJavaLocalRef<jstring> GetFrameUrl( |
+ JNIEnv* env, jobject obj); |
+ void OnPlaying(JNIEnv* env, jobject obj); |
+ void OnPaused(JNIEnv* env, jobject obj); |
+ void OnRouteSelected(JNIEnv* env, jobject obj, jstring castingMessage); |
+ void OnRouteUnselected(JNIEnv* env, jobject obj); |
+ void OnPlaybackFinished(JNIEnv* env, jobject obj); |
+ void OnRouteAvailabilityChanged(JNIEnv* env, jobject obj, jboolean available); |
+ base::android::ScopedJavaLocalRef<jstring> GetTitle(JNIEnv* env, jobject obj); |
+ |
+ // Wrappers for calls to Java used by the remote media player manager |
+ void RequestRemotePlayback(); |
+ void RequestRemotePlaybackControl(); |
+ void SetNativePlayer(); |
+ void OnPlayerCreated(); |
+ void OnPlayerDestroyed(); |
+ bool IsRemotePlaybackAvailable() const; |
+ bool IsRemotePlaybackPreferredForFrame() const; |
+ |
+ // Returns true if the we can play the media remotely |
+ bool IsMediaPlayableRemotely() const; |
+ |
+ // Gets the message to display on the embedded player while casting. |
+ std::string GetCastingMessage(); |
+ |
+ // Tell the java side about the poster image for a given media. |
+ void SetPosterBitmap(const std::vector<SkBitmap>& bitmaps); |
+ |
+ protected: |
+ // MediaPlayerAndroid implementation. |
+ void OnVideoSizeChanged(int width, int height) override; |
+ void OnPlaybackComplete() override; |
+ void OnMediaInterrupted() override; |
+ void OnMediaPrepared() override; |
+ |
+ private: |
+ // Functions that implements media player control. |
+ void StartInternal(); |
+ void PauseInternal(); |
+ void SeekInternal(base::TimeDelta time); |
+ |
+ // Called when |time_update_timer_| fires. |
+ void OnTimeUpdateTimerFired(); |
+ |
+ // Callback function passed to |resource_getter_|. Called when the cookies |
+ // are retrieved. |
+ void OnCookiesRetrieved(const std::string& cookies); |
+ |
+ void PendingSeekInternal(const base::TimeDelta& time); |
+ |
+ // Prepare the player for playback, asynchronously. When succeeds, |
+ // OnMediaPrepared() will be called. Otherwise, OnMediaError() will |
+ // be called with an error type. |
+ void Prepare(); |
+ |
+ long start_position_millis_; |
+ MediaPlayerAndroid* local_player_; |
+ bool in_use_; |
+ bool prepared_; |
+ bool pending_play_; |
+ int width_; |
+ int height_; |
+ base::RepeatingTimer<RemoteMediaPlayerBridge> time_update_timer_; |
+ base::TimeDelta duration_; |
+ bool should_seek_on_prepare_; |
+ base::TimeDelta pending_seek_; |
+ |
+ // Hide url log from media player. |
+ bool hide_url_log_; |
+ |
+ // Volume of playback. |
+ double volume_; |
+ |
+ // Url for playback. |
+ GURL url_; |
+ |
+ // First party url for cookies. |
+ GURL first_party_for_cookies_; |
+ |
+ // Cookies for |url_|. |
+ std::string cookies_; |
+ |
+ // User agent string to be used for media player. |
+ const std::string user_agent_; |
+ |
+ base::android::ScopedJavaGlobalRef<jobject> java_bridge_; |
+ scoped_ptr<std::string> casting_message_; |
+ |
+ // NOTE: Weak pointers must be invalidated before all other member variables. |
+ base::WeakPtrFactory<RemoteMediaPlayerBridge> weak_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RemoteMediaPlayerBridge); |
+}; |
+ |
+} // namespace remote_media |
+ |
+#endif // CHROME_BROWSER_MEDIA_ANDROID_REMOTE_REMOTE_MEDIA_PLAYER_BRIDGE_H_ |