media_player_bridge.h revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "media/base/android/media_player_android.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/android/media_player_listener.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 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |manager| to track unused resources and free them when needed. On the other 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // hand, it needs to call ReleaseMediaResources() when it is done with 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // decoding. MediaPlayerBridge also forwards Android MediaPlayer callbacks to 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the |manager| when needed. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaPlayerBridge(int player_id, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& first_party_for_cookies, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hide_url_log, 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MediaPlayerManager* manager); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~MediaPlayerBridge(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Initialize this object and extract the metadata from the media. 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void Initialize(); 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // MediaPlayerAndroid implementation. 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetVideoSurface(gfx::ScopedJavaSurface surface) OVERRIDE; 57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void Start() OVERRIDE; 58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void Pause() OVERRIDE; 59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SeekTo(base::TimeDelta time) OVERRIDE; 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void Release() OVERRIDE; 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE; 62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual int GetVideoWidth() OVERRIDE; 63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual int GetVideoHeight() OVERRIDE; 64b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual base::TimeDelta GetCurrentTime() OVERRIDE; 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual base::TimeDelta GetDuration() OVERRIDE; 66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool IsPlaying() OVERRIDE; 67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool CanPause() OVERRIDE; 68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool CanSeekForward() OVERRIDE; 69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool CanSeekBackward() OVERRIDE; 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool IsPlayerReady() OVERRIDE; 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GURL GetUrl() OVERRIDE; 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual GURL GetFirstPartyForCookies() OVERRIDE; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetJavaMediaPlayerBridge(jobject j_media_player_bridge); 76b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void SetMediaPlayerListener(); 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetDuration(base::TimeDelta time); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // MediaPlayerAndroid implementation. 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void OnVideoSizeChanged(int width, int height) OVERRIDE; 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void OnPlaybackComplete() OVERRIDE; 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void OnMediaInterrupted() OVERRIDE; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void PendingSeekInternal(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(); 90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void OnMediaPrepared(); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Create the corresponding Java class instance. 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CreateJavaMediaPlayerBridge(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the data source for the media player. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDataSource(const std::string& url); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Functions that implements media player control. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartInternal(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PauseInternal(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SeekInternal(base::TimeDelta time); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Get allowed operations from the player. 105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void GetAllowedOperations(); 106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Callback function passed to |resource_getter_|. Called when the cookies 108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // are retrieved. 109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void OnCookiesRetrieved(const std::string& cookies); 110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Extract the media metadata from a url, asynchronously. 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OnMediaMetadataExtracted() will be called when this call finishes. 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ExtractMediaMetadata(const std::string& url); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnMediaMetadataExtracted(base::TimeDelta duration, int width, int height, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the player is prepared for playback. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prepared_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pending play event while player is preparing. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pending_play_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pending seek time while player is preparing. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta pending_seek_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Url for playback. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First party url for cookies. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL first_party_for_cookies_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide url log from media player. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hide_url_log_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stats about the media. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Meta data about actions can be taken. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_pause_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_seek_forward_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_seek_backward_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cookies for |url_|. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cookies_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Java MediaPlayerBridge instance. 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::android::ScopedJavaGlobalRef<jobject> j_media_player_bridge_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<MediaPlayerBridge> time_update_timer_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak pointer passed to |listener_| for callbacks. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<MediaPlayerBridge> weak_this_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listener object that listens to all the media player events. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaPlayerListener listener_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) friend class MediaPlayerListener; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaPlayerBridge); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_ANDROID_MEDIA_PLAYER_BRIDGE_H_ 166