15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_ANDROID_MEDIA_PLAYER_BRIDGE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_ANDROID_MEDIA_PLAYER_BRIDGE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <jni.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/string16.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "media/base/android/media_player_android.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MediaPlayerManager; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This class serves as a bridge between the native code and Android MediaPlayer 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Java class. For more information on Android MediaPlayer, check 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://developer.android.com/reference/android/media/MediaPlayer.html 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The actual Android MediaPlayer instance is created lazily when Start(), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pause(), SeekTo() gets called. As a result, media information may not 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be available until one of those operations is performed. After that, we 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will cache those information in case the mediaplayer gets released. 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The class uses the corresponding MediaPlayerBridge Java class to talk to 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// the Android MediaPlayer instance. 35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool RegisterMediaPlayerBridge(JNIEnv* env); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Construct a MediaPlayerBridge object. This object needs to call |manager|'s 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // RequestMediaResources() before decoding the media stream. This allows 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |manager| to track unused resources and free them when needed. 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // MediaPlayerBridge also forwards Android MediaPlayer callbacks to 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the |manager| when needed. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaPlayerBridge(int player_id, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& first_party_for_cookies, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& user_agent, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hide_url_log, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaPlayerManager* manager, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const RequestMediaResourcesCB& request_media_resources_cb, 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL& frame_url, 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool allow_credentials); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~MediaPlayerBridge(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Initialize this object and extract the metadata from the media. 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Initialize(); 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // MediaPlayerAndroid implementation. 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetVideoSurface(gfx::ScopedJavaSurface surface) OVERRIDE; 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void Start() OVERRIDE; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void Pause(bool is_media_related_action ALLOW_UNUSED) OVERRIDE; 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) virtual void SeekTo(base::TimeDelta timestamp) OVERRIDE; 63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void Release() OVERRIDE; 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE; 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual int GetVideoWidth() OVERRIDE; 66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual int GetVideoHeight() OVERRIDE; 67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual base::TimeDelta GetCurrentTime() OVERRIDE; 68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual base::TimeDelta GetDuration() OVERRIDE; 69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool IsPlaying() OVERRIDE; 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool CanPause() OVERRIDE; 71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool CanSeekForward() OVERRIDE; 72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool CanSeekBackward() OVERRIDE; 73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool IsPlayerReady() OVERRIDE; 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GURL GetUrl() OVERRIDE; 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GURL GetFirstPartyForCookies() OVERRIDE; 761675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnDidSetDataUriDataSource(JNIEnv* env, jobject obj, jboolean success); 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetJavaMediaPlayerBridge(jobject j_media_player_bridge); 810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::android::ScopedJavaLocalRef<jobject> GetJavaMediaPlayerBridge(); 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetDuration(base::TimeDelta time); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void PendingSeekInternal(const base::TimeDelta& time); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare the player for playback, asynchronously. When succeeds, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnMediaPrepared() will be called. Otherwise, OnMediaError() will 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called with an error type. 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Prepare(); 901675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch 911675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // MediaPlayerAndroid implementation. 921675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch virtual void OnVideoSizeChanged(int width, int height) override; 931675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch virtual void OnPlaybackComplete() override; 941675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch virtual void OnMediaInterrupted() override; 951675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch virtual void OnMediaPrepared() override; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Create the corresponding Java class instance. 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CreateJavaMediaPlayerBridge(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Get allowed operations from the player. 1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual base::android::ScopedJavaLocalRef<jobject> GetAllowedOperations(); 1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the data source for the media player. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDataSource(const std::string& url); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Functions that implements media player control. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartInternal(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PauseInternal(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SeekInternal(base::TimeDelta time); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Called when |time_update_timer_| fires. 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void OnTimeUpdateTimerFired(); 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Update allowed operations from the player. 1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void UpdateAllowedOperations(); 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Callback function passed to |resource_getter_|. Called when the cookies 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // are retrieved. 120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void OnCookiesRetrieved(const std::string& cookies); 121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Callback function passed to |resource_getter_|. Called when the auth 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // credentials are retrieved. 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnAuthCredentialsRetrieved( 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::string16& username, const base::string16& password); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Extract the media metadata from a url, asynchronously. 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OnMediaMetadataExtracted() will be called when this call finishes. 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ExtractMediaMetadata(const std::string& url); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnMediaMetadataExtracted(base::TimeDelta duration, int width, int height, 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Returns true if a MediaUrlInterceptor registered by the embedder has 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // intercepted the url. 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool InterceptMediaUrl( 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& url, int* fd, int64* offset, int64* size); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the player is prepared for playback. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prepared_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pending play event while player is preparing. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pending_play_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pending seek time while player is preparing. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta pending_seek_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475b62eb5758cb7b791cfdd45cf78f35dc060631b6Ben Murdoch // Whether a seek should be performed after preparing. 1485b62eb5758cb7b791cfdd45cf78f35dc060631b6Ben Murdoch bool should_seek_on_prepare_; 1495b62eb5758cb7b791cfdd45cf78f35dc060631b6Ben Murdoch 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Url for playback. 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First party url for cookies. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL first_party_for_cookies_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // User agent string to be used for media player. 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string user_agent_; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide url log from media player. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hide_url_log_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stats about the media. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Meta data about actions can be taken. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_pause_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_seek_forward_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_seek_backward_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cookies for |url_|. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cookies_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Java MediaPlayerBridge instance. 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::android::ScopedJavaGlobalRef<jobject> j_media_player_bridge_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<MediaPlayerBridge> time_update_timer_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Volume of playback. 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double volume_; 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Whether user credentials are allowed to be passed. 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool allow_credentials_; 1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // NOTE: Weak pointers must be invalidated before all other member variables. 18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::WeakPtrFactory<MediaPlayerBridge> weak_factory_; 18823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaPlayerBridge); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_ANDROID_MEDIA_PLAYER_BRIDGE_H_ 195