// Copyright (c) 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 MEDIA_BASE_ANDROID_MEDIA_PLAYER_ANDROID_H_ #define MEDIA_BASE_ANDROID_MEDIA_PLAYER_ANDROID_H_ #include #include #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "media/base/android/media_player_listener.h" #include "media/base/media_export.h" #include "ui/gfx/geometry/size.h" #include "ui/gl/android/scoped_java_surface.h" #include "url/gurl.h" namespace media { class MediaKeys; class MediaPlayerManager; enum { // Id used for players not participating in any media sessions // because of undefined behavior in the specification. When all // media session interactions have been worked out, this id should // no longer be used. kInvalidMediaSessionId = -1, // The media session for media elements that don't have an explicit // user created media session set. Must be in-sync with // WebMediaSession::DefaultID in blink. kDefaultMediaSessionId = 0 }; // This class serves as the base class for different media player // implementations on Android. Subclasses need to provide their own // MediaPlayerAndroid::Create() implementation. class MEDIA_EXPORT MediaPlayerAndroid { public: virtual ~MediaPlayerAndroid(); // Error types for MediaErrorCB. enum MediaErrorType { MEDIA_ERROR_FORMAT, MEDIA_ERROR_DECODE, MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK, MEDIA_ERROR_INVALID_CODE, MEDIA_ERROR_SERVER_DIED, }; static const double kDefaultVolumeMultiplier; // Callback when the player releases decoding resources. typedef base::Callback OnDecoderResourcesReleasedCB; // Virtual destructor. // For most subclasses we can delete on the caller thread. virtual void DeleteOnCorrectThread(); // Passing an external java surface object to the player. virtual void SetVideoSurface(gfx::ScopedJavaSurface surface) = 0; // Start playing the media. virtual void Start() = 0; // Pause the media. virtual void Pause(bool is_media_related_action) = 0; // Seek to a particular position, based on renderer signaling actual seek // with MediaPlayerHostMsg_Seek. If eventual success, OnSeekComplete() will be // called. virtual void SeekTo(base::TimeDelta timestamp) = 0; // Release the player resources. virtual void Release() = 0; // Set the player volume, and take effect immediately. // The volume should be between 0.0 and 1.0. void SetVolume(double volume); // Set the player volume multiplier, and take effect immediately. // The volume should be between 0.0 and 1.0. void SetVolumeMultiplier(double volume_multiplier); // Get the media information from the player. virtual bool HasVideo() const = 0; virtual bool HasAudio() const = 0; virtual int GetVideoWidth() = 0; virtual int GetVideoHeight() = 0; virtual base::TimeDelta GetDuration() = 0; virtual base::TimeDelta GetCurrentTime() = 0; virtual bool IsPlaying() = 0; virtual bool CanPause() = 0; virtual bool CanSeekForward() = 0; virtual bool CanSeekBackward() = 0; virtual bool IsPlayerReady() = 0; virtual GURL GetUrl(); virtual GURL GetFirstPartyForCookies(); // Associates the |cdm| with this player. virtual void SetCdm(const scoped_refptr& cdm); // Requests playback permission from MediaPlayerManager. // Overridden in MediaCodecPlayer to pass data between threads. virtual void RequestPermissionAndPostResult(base::TimeDelta duration, bool has_audio) {} // Overridden in MediaCodecPlayer to pass data between threads. virtual void OnMediaMetadataChanged(base::TimeDelta duration, const gfx::Size& video_size) {} // Overridden in MediaCodecPlayer to pass data between threads. virtual void OnTimeUpdate(base::TimeDelta current_timestamp, base::TimeTicks current_time_ticks) {} int player_id() { return player_id_; } GURL frame_url() { return frame_url_; } int media_session_id() { return media_session_id_; } // Attach/Detaches |listener_| for listening to all the media events. If // |j_media_player| is NULL, |listener_| only listens to the system media // events. Otherwise, it also listens to the events from |j_media_player|. void AttachListener(jobject j_media_player); void DetachListener(); protected: MediaPlayerAndroid( int player_id, MediaPlayerManager* manager, const OnDecoderResourcesReleasedCB& on_decoder_resources_released_cb, const GURL& frame_url, int media_session_id); // TODO(qinmin): Simplify the MediaPlayerListener class to only listen to // media interrupt events. And have a separate child class to listen to all // the events needed by MediaPlayerBridge. http://crbug.com/422597. // MediaPlayerListener callbacks. virtual void OnVideoSizeChanged(int width, int height); virtual void OnMediaError(int error_type); virtual void OnBufferingUpdate(int percent); virtual void OnPlaybackComplete(); virtual void OnMediaInterrupted(); virtual void OnSeekComplete(); virtual void OnMediaPrepared(); double GetEffectiveVolume() const; void UpdateEffectiveVolume(); // When destroying a subclassed object on a non-UI thread // it is still required to destroy the |listener_| related stuff // on the UI thread. void DestroyListenerOnUIThread(); MediaPlayerManager* manager() { return manager_; } base::WeakPtr WeakPtrForUIThread(); OnDecoderResourcesReleasedCB on_decoder_resources_released_cb_; private: // Set the effective player volume, implemented by children classes. virtual void UpdateEffectiveVolumeInternal(double effective_volume) = 0; friend class MediaPlayerListener; // Player ID assigned to this player. int player_id_; // The player volume. Should be between 0.0 and 1.0. double volume_; // The player volume multiplier. Should be between 0.0 and 1.0. This // should be a cached version of the MediaSession volume multiplier, // and should keep updated. double volume_multiplier_; // Resource manager for all the media players. MediaPlayerManager* manager_; // Url for the frame that contains this player. GURL frame_url_; // Listener object that listens to all the media player events. scoped_ptr listener_; // Media session ID assigned to this player. int media_session_id_; // Weak pointer passed to |listener_| for callbacks. // NOTE: Weak pointers must be invalidated before all other member variables. base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(MediaPlayerAndroid); }; } // namespace media #endif // MEDIA_BASE_ANDROID_MEDIA_PLAYER_ANDROID_H_