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