Index: webkit/media/android/webmediaplayer_android.cc |
diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc |
index 2eeb3b38f1d77174e10416012b8d5a54a2f0644e..4c4e4391aef1bbe6f48e0e20602f90aec3b2b2c0 100644 |
--- a/webkit/media/android/webmediaplayer_android.cc |
+++ b/webkit/media/android/webmediaplayer_android.cc |
@@ -28,6 +28,8 @@ |
#if defined(GOOGLE_TV) |
#include "webkit/media/android/media_source_delegate.h" |
+#include "webkit/media/media_stream_audio_renderer.h" |
+#include "webkit/media/media_stream_client.h" |
#endif |
static const uint32 kGLTextureExternalOES = 0x8D65; |
@@ -68,7 +70,8 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
video_frame_provider_client_(NULL), |
proxy_(proxy), |
current_time_(0), |
- media_log_(media_log) { |
+ media_log_(media_log), |
+ media_stream_client_(NULL) { |
main_loop_->AddDestructionObserver(this); |
if (manager_) |
player_id_ = manager_->RegisterMediaPlayer(this); |
@@ -78,6 +81,9 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_); |
ReallocateVideoFrame(); |
} |
+#if defined(GOOGLE_TV) |
+ demuxer_ = NULL; |
+#endif |
} |
WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
@@ -95,6 +101,12 @@ WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
if (main_loop_) |
main_loop_->RemoveDestructionObserver(this); |
+#if defined(GOOGLE_TV) |
+ if (demuxer_ && !destroy_demuxer_cb_.is_null()) { |
+ media_source_delegate_.reset(); |
+ destroy_demuxer_cb_.Run(); |
+ } |
+#endif |
} |
void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { |
@@ -107,24 +119,44 @@ void WebMediaPlayerAndroid::load(const WebURL& url, |
if (cors_mode != CORSModeUnspecified) |
NOTIMPLEMENTED() << "No CORS support"; |
- scoped_ptr<WebKit::WebMediaSource> scoped_media_source(media_source); |
+ MediaPlayerAndroid::SourceType media_source_type = |
+ MediaPlayerAndroid::SOURCE_TYPE_URL; |
+ |
+ if (media_source) |
+ media_source_type = MediaPlayerAndroid::SOURCE_TYPE_MSE; |
#if defined(GOOGLE_TV) |
- if (media_source) { |
- media_source_delegate_.reset( |
- new MediaSourceDelegate( |
- frame_, client_, proxy_, player_id_, media_log_)); |
+ if (media_stream_client_) { |
+ LOG_IF(WARNING, media_source) << "It is absurd to have both media source " |
acolwell GONE FROM CHROMIUM
2013/05/20 21:23:22
nit: DCHECK(!media_source) is sufficient.
wonsik
2013/05/21 10:09:29
Done.
|
+ "and media stream set at the same time."; |
+ media_source_type = MediaPlayerAndroid::SOURCE_TYPE_STREAM; |
+ } |
+ |
+ if (media_source_type != MediaPlayerAndroid::SOURCE_TYPE_URL) { |
// |media_source_delegate_| is owned, so Unretained() is safe here. |
- media_source_delegate_->Initialize( |
- scoped_media_source.Pass(), |
+ media_source_delegate_.reset(new MediaSourceDelegate( |
+ proxy_, |
+ player_id_, |
base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
- base::Unretained(this))); |
+ base::Unretained(this)))); |
+ if (media_source_type == MediaPlayerAndroid::SOURCE_TYPE_MSE) { |
+ media_source_delegate_->InitializeMediaSource( |
+ frame_, client_, media_source, media_log_); |
+ } else if (media_source_type == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { |
+ media_source_delegate_->InitializeMediaStream(demuxer_); |
+ } |
} |
#endif |
+ InitializeMediaPlayer(url, media_source_type); |
+} |
+ |
+void WebMediaPlayerAndroid::InitializeMediaPlayer( |
+ const WebURL& url, |
+ MediaPlayerAndroid::SourceType media_source_type) { |
url_ = url; |
GURL first_party_url = frame_->document().firstPartyForCookies(); |
if (proxy_) { |
- proxy_->Initialize(player_id_, url_, media_source != NULL, first_party_url); |
+ proxy_->Initialize(player_id_, url, media_source_type, first_party_url); |
if (manager_->IsInFullscreen(frame_)) |
proxy_->EnterFullscreen(player_id_); |
} |
@@ -140,7 +172,6 @@ void WebMediaPlayerAndroid::cancelLoad() { |
void WebMediaPlayerAndroid::play() { |
#if defined(GOOGLE_TV) |
if (hasVideo() && needs_external_surface_) { |
- DCHECK(!needs_establish_peer_); |
if (proxy_) |
proxy_->RequestExternalSurface(player_id_, last_computed_rect_); |
} |
@@ -467,7 +498,6 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { |
CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
switches::kUseExternalVideoSurfaceThresholdInPixels), |
&threshold); |
- |
if ((parsed_arg && threshold <= width * height) || |
// Use H/W surface for MSE as the content is protected. |
media_source_delegate_) { |
@@ -657,10 +687,10 @@ bool WebMediaPlayerAndroid::RetrieveGeometryChange(gfx::RectF* rect) { |
return true; |
} |
-WebMediaPlayer::MediaKeyException |
-WebMediaPlayerAndroid::generateKeyRequest(const WebString& key_system, |
- const unsigned char* init_data, |
- unsigned init_data_length) { |
+WebMediaPlayer::MediaKeyException WebMediaPlayerAndroid::generateKeyRequest( |
+ const WebString& key_system, |
+ const unsigned char* init_data, |
+ unsigned init_data_length) { |
if (media_source_delegate_) { |
return media_source_delegate_->GenerateKeyRequest( |
key_system, init_data, init_data_length); |
@@ -697,6 +727,17 @@ void WebMediaPlayerAndroid::OnReadFromDemuxer( |
else |
NOTIMPLEMENTED(); |
} |
+ |
+bool WebMediaPlayerAndroid::InjectMediaStream( |
+ MediaStreamClient* media_stream_client, |
+ media::Demuxer* demuxer, |
+ const base::Closure& destroy_demuxer_cb) { |
+ DCHECK(!demuxer); |
+ media_stream_client_ = media_stream_client; |
+ demuxer_ = demuxer; |
+ destroy_demuxer_cb_ = destroy_demuxer_cb; |
+ return true; |
+} |
#endif |
void WebMediaPlayerAndroid::enterFullscreen() { |