Index: content/renderer/media/android/webmediaplayer_android.cc |
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc |
index 35d5b4789581db70f3f34b2e66ff4f6f9b7e3c0c..ecd41cc1247f0408c333a2f748fa66fe4d5f8c7d 100644 |
--- a/content/renderer/media/android/webmediaplayer_android.cc |
+++ b/content/renderer/media/android/webmediaplayer_android.cc |
@@ -24,7 +24,6 @@ |
#include "content/public/common/content_switches.h" |
#include "content/public/common/renderer_preferences.h" |
#include "content/public/renderer/render_frame.h" |
-#include "content/renderer/media/android/renderer_demuxer_android.h" |
#include "content/renderer/media/android/renderer_media_player_manager.h" |
#include "content/renderer/render_frame_impl.h" |
#include "content/renderer/render_thread_impl.h" |
@@ -37,7 +36,6 @@ |
#include "media/base/android/media_common_android.h" |
#include "media/base/android/media_player_android.h" |
#include "media/base/bind_to_current_loop.h" |
-#include "media/base/cdm_context.h" |
#include "media/base/media_content_type.h" |
#include "media/base/media_keys.h" |
#include "media/base/media_log.h" |
@@ -141,7 +139,6 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
const media::WebMediaPlayerParams& params) |
: frame_(frame), |
client_(client), |
- encrypted_client_(encrypted_client), |
delegate_(delegate), |
delegate_id_(0), |
defer_load_cb_(params.defer_load_cb()), |
@@ -171,7 +168,6 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
player_type_(MEDIA_PLAYER_TYPE_URL), |
is_remote_(false), |
media_log_(params.media_log()), |
- cdm_context_(nullptr), |
allow_stored_credentials_(false), |
is_local_resource_(false), |
interpolator_(&default_tick_clock_), |
@@ -193,11 +189,6 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
TryCreateStreamTextureProxyIfNeeded(); |
interpolator_.SetUpperBound(base::TimeDelta()); |
- |
- if (params.initial_cdm()) { |
- cdm_context_ = media::ToWebContentDecryptionModuleImpl(params.initial_cdm()) |
- ->GetCdmContext(); |
- } |
} |
WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
@@ -229,17 +220,6 @@ WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
delegate_->PlayerGone(delegate_id_); |
delegate_->RemoveObserver(delegate_id_); |
} |
- |
- if (media_source_delegate_) { |
- // Part of |media_source_delegate_| needs to be stopped on the media thread. |
- // Wait until |media_source_delegate_| is fully stopped before tearing |
- // down other objects. |
- base::WaitableEvent waiter(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
- base::WaitableEvent::InitialState::NOT_SIGNALED); |
- media_source_delegate_->Stop( |
- base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); |
- waiter.Wait(); |
- } |
} |
void WebMediaPlayerAndroid::load(LoadType load_type, |
@@ -263,59 +243,16 @@ void WebMediaPlayerAndroid::DoLoad(LoadType load_type, |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
media::ReportMetrics(load_type, GURL(url), frame_->getSecurityOrigin()); |
- |
- switch (load_type) { |
- case LoadTypeURL: |
- player_type_ = MEDIA_PLAYER_TYPE_URL; |
- break; |
- |
- case LoadTypeMediaSource: |
- player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; |
- break; |
- |
- case LoadTypeMediaStream: |
- CHECK(false) << "WebMediaPlayerAndroid doesn't support MediaStream on " |
- "this platform"; |
- return; |
- } |
+ DCHECK_EQ(load_type, LoadTypeURL) |
+ << "WebMediaPlayerAndroid doesn't support MediaStream or " |
+ "MediaSource on this platform"; |
url_ = url; |
is_local_resource_ = IsLocalResource(); |
- int demuxer_client_id = 0; |
- if (player_type_ != MEDIA_PLAYER_TYPE_URL) { |
- RendererDemuxerAndroid* demuxer = |
- RenderThreadImpl::current()->renderer_demuxer(); |
- demuxer_client_id = demuxer->GetNextDemuxerClientID(); |
- |
- media_source_delegate_.reset(new MediaSourceDelegate( |
- demuxer, demuxer_client_id, media_task_runner_, media_log_)); |
- |
- if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { |
- media_source_delegate_->InitializeMediaSource( |
- base::Bind(&WebMediaPlayerAndroid::OnMediaSourceOpened, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::OnEncryptedMediaInitData, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::SetCdmReadyCB, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::OnDurationChanged, |
- weak_factory_.GetWeakPtr()), |
- base::Bind(&WebMediaPlayerAndroid::OnWaitingForDecryptionKey, |
- weak_factory_.GetWeakPtr())); |
- InitializePlayer(url_, frame_->document().firstPartyForCookies(), |
- true, demuxer_client_id); |
- } |
- } else { |
- info_loader_.reset( |
- new MediaInfoLoader( |
- url, |
- cors_mode, |
- base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo, |
- weak_factory_.GetWeakPtr()))); |
- info_loader_->Start(frame_); |
- } |
+ info_loader_.reset(new MediaInfoLoader( |
+ url, cors_mode, base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo, |
+ weak_factory_.GetWeakPtr()))); |
+ info_loader_->Start(frame_); |
UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); |
UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
@@ -327,15 +264,14 @@ void WebMediaPlayerAndroid::DidLoadMediaInfo( |
const GURL& first_party_for_cookies, |
bool allow_stored_credentials) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
- DCHECK(!media_source_delegate_); |
if (status == MediaInfoLoader::kFailed) { |
info_loader_.reset(); |
UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); |
return; |
} |
redirected_url_ = redirected_url; |
- InitializePlayer( |
- redirected_url, first_party_for_cookies, allow_stored_credentials, 0); |
+ InitializePlayer(redirected_url, first_party_for_cookies, |
+ allow_stored_credentials); |
UpdateNetworkState(WebMediaPlayer::NetworkStateIdle); |
} |
@@ -409,27 +345,13 @@ void WebMediaPlayerAndroid::seek(double seconds) { |
if (seeking_) { |
if (new_seek_time == seek_time_) { |
- if (media_source_delegate_) { |
- // Don't suppress any redundant in-progress MSE seek. There could have |
- // been changes to the underlying buffers after seeking the demuxer and |
- // before receiving OnSeekComplete() for the currently in-progress seek. |
- MEDIA_LOG(DEBUG, media_log_) |
- << "Detected MediaSource seek to same time as in-progress seek to " |
- << seek_time_ << "."; |
- } else { |
- // Suppress all redundant seeks if unrestricted by media source |
- // demuxer API. |
- pending_seek_ = false; |
- return; |
- } |
+ pending_seek_ = false; |
+ return; |
} |
pending_seek_ = true; |
pending_seek_time_ = new_seek_time; |
- if (media_source_delegate_) |
- media_source_delegate_->CancelPendingSeek(pending_seek_time_); |
- |
// Later, OnSeekComplete will trigger the pending seek. |
return; |
} |
@@ -437,9 +359,6 @@ void WebMediaPlayerAndroid::seek(double seconds) { |
seeking_ = true; |
seek_time_ = new_seek_time; |
- if (media_source_delegate_) |
- media_source_delegate_->StartWaitingForSeek(seek_time_); |
- |
// Kick off the asynchronous seek! |
player_manager_->Seek(player_id_, seek_time_); |
} |
@@ -527,9 +446,6 @@ double WebMediaPlayerAndroid::duration() const { |
double WebMediaPlayerAndroid::timelineOffset() const { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
base::Time timeline_offset; |
- if (media_source_delegate_) |
- timeline_offset = media_source_delegate_->GetTimelineOffset(); |
- |
if (timeline_offset.is_null()) |
return std::numeric_limits<double>::quiet_NaN(); |
@@ -567,8 +483,6 @@ blink::WebString WebMediaPlayerAndroid::getErrorMessage() { |
} |
blink::WebTimeRanges WebMediaPlayerAndroid::buffered() const { |
- if (media_source_delegate_) |
- return media_source_delegate_->Buffered(); |
return buffered_; |
} |
@@ -741,29 +655,21 @@ double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const { |
} |
unsigned WebMediaPlayerAndroid::decodedFrameCount() const { |
- if (media_source_delegate_) |
- return media_source_delegate_->DecodedFrameCount(); |
NOTIMPLEMENTED(); |
return 0; |
} |
unsigned WebMediaPlayerAndroid::droppedFrameCount() const { |
- if (media_source_delegate_) |
- return media_source_delegate_->DroppedFrameCount(); |
NOTIMPLEMENTED(); |
return 0; |
} |
size_t WebMediaPlayerAndroid::audioDecodedByteCount() const { |
- if (media_source_delegate_) |
- return media_source_delegate_->AudioDecodedByteCount(); |
NOTIMPLEMENTED(); |
return 0; |
} |
size_t WebMediaPlayerAndroid::videoDecodedByteCount() const { |
- if (media_source_delegate_) |
- return media_source_delegate_->VideoDecodedByteCount(); |
NOTIMPLEMENTED(); |
return 0; |
} |
@@ -790,12 +696,8 @@ void WebMediaPlayerAndroid::OnMediaMetadataChanged( |
// Client readyState transition from HAVE_NOTHING to HAVE_METADATA |
// already triggers a durationchanged event. If this is a different |
// transition, remember to signal durationchanged. |
- // Do not ever signal durationchanged on metadata change in MSE case |
- // because OnDurationChanged() handles this. |
- if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && |
- player_type_ != MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { |
+ if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing) |
need_to_signal_duration_changed = true; |
- } |
} |
if (ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { |
@@ -1015,21 +917,6 @@ void WebMediaPlayerAndroid::OnRemoteRouteAvailabilityChanged( |
client_->remoteRouteAvailabilityChanged(routes_available); |
} |
-void WebMediaPlayerAndroid::OnDurationChanged(const base::TimeDelta& duration) { |
- DCHECK(main_thread_checker_.CalledOnValidThread()); |
- // Only MSE |player_type_| registers this callback. |
- DCHECK_EQ(player_type_, MEDIA_PLAYER_TYPE_MEDIA_SOURCE); |
- |
- // Cache the new duration value and trust it over any subsequent duration |
- // values received in OnMediaMetadataChanged(). |
- duration_ = duration; |
- ignore_metadata_duration_change_ = true; |
- |
- // Notify MediaPlayerClient that duration has changed, if > HAVE_NOTHING. |
- if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing) |
- client_->durationChanged(); |
-} |
- |
void WebMediaPlayerAndroid::UpdateNetworkState( |
WebMediaPlayer::NetworkState state) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
@@ -1089,21 +976,17 @@ void WebMediaPlayerAndroid::SuspendAndReleaseResources() { |
void WebMediaPlayerAndroid::InitializePlayer( |
const GURL& url, |
const GURL& first_party_for_cookies, |
- bool allow_stored_credentials, |
- int demuxer_client_id) { |
+ bool allow_stored_credentials) { |
ReportHLSMetrics(); |
allow_stored_credentials_ = allow_stored_credentials; |
- player_manager_->Initialize( |
- player_type_, player_id_, url, first_party_for_cookies, demuxer_client_id, |
- frame_->document().url(), allow_stored_credentials, delegate_id_); |
+ player_manager_->Initialize(player_type_, player_id_, url, |
+ first_party_for_cookies, frame_->document().url(), |
+ allow_stored_credentials, delegate_id_); |
is_player_initialized_ = true; |
if (is_fullscreen_) |
player_manager_->EnterFullscreen(player_id_); |
- |
- if (cdm_context_) |
- SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); |
} |
void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { |
@@ -1353,69 +1236,9 @@ void WebMediaPlayerAndroid::setContentDecryptionModule( |
blink::WebContentDecryptionModuleResult result) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
- // Once the CDM is set it can't be cleared as there may be frames being |
- // decrypted on other threads. So fail this request. |
- // http://crbug.com/462365#c7. |
- if (!cdm) { |
- result.completeWithError( |
- blink::WebContentDecryptionModuleExceptionInvalidStateError, 0, |
- "The existing MediaKeys object cannot be removed at this time."); |
- return; |
- } |
- |
- cdm_context_ = media::ToWebContentDecryptionModuleImpl(cdm)->GetCdmContext(); |
- |
- if (is_player_initialized_) { |
- SetCdmInternal( |
- base::Bind(&WebMediaPlayerAndroid::ContentDecryptionModuleAttached, |
- weak_factory_.GetWeakPtr(), result)); |
- } else { |
- // No pipeline/decoder connected, so resolve the promise. When something |
- // is connected, setting the CDM will happen in SetCdmReadyCB(). |
- ContentDecryptionModuleAttached(result, true); |
- } |
-} |
- |
-void WebMediaPlayerAndroid::ContentDecryptionModuleAttached( |
- blink::WebContentDecryptionModuleResult result, |
- bool success) { |
- if (success) { |
- result.complete(); |
- return; |
- } |
- |
result.completeWithError( |
- blink::WebContentDecryptionModuleExceptionNotSupportedError, |
- 0, |
- "Unable to set MediaKeys object"); |
-} |
- |
-void WebMediaPlayerAndroid::OnMediaSourceOpened( |
- blink::WebMediaSource* web_media_source) { |
- client_->mediaSourceOpened(web_media_source); |
-} |
- |
-void WebMediaPlayerAndroid::OnEncryptedMediaInitData( |
- media::EmeInitDataType init_data_type, |
- const std::vector<uint8_t>& init_data) { |
- DCHECK(main_thread_checker_.CalledOnValidThread()); |
- |
- // TODO(xhwang): Update this UMA name. https://crbug.com/589251 |
- UMA_HISTOGRAM_COUNTS("Media.EME.NeedKey", 1); |
- |
- DCHECK(init_data_type != media::EmeInitDataType::UNKNOWN); |
- |
- encrypted_client_->encrypted(ConvertToWebInitDataType(init_data_type), |
- init_data.data(), init_data.size()); |
-} |
- |
-void WebMediaPlayerAndroid::OnWaitingForDecryptionKey() { |
- encrypted_client_->didBlockPlaybackWaitingForKey(); |
- |
- // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called |
- // when a key has been successfully added (e.g. OnSessionKeysChange() with |
- // |has_additional_usable_key| = true). http://crbug.com/461903 |
- encrypted_client_->didResumePlaybackBlockedForKey(); |
+ blink::WebContentDecryptionModuleExceptionInvalidStateError, 0, |
wolenetz
2016/09/30 23:23:24
nit: blink::WebContentDecryptionModuleExceptionNot
DaleCurtis
2016/09/30 23:34:24
Deleted.
|
+ "EME is not supported for this playback."); |
} |
void WebMediaPlayerAndroid::OnHidden() { |
@@ -1464,88 +1287,6 @@ void WebMediaPlayerAndroid::OnVolumeMultiplierUpdate(double multiplier) { |
setVolume(volume_); |
} |
-void WebMediaPlayerAndroid::OnCdmContextReady(media::CdmContext* cdm_context) { |
- DCHECK(!cdm_context_); |
- |
- if (!cdm_context) { |
- LOG(ERROR) << "CdmContext not available (e.g. CDM creation failed)."; |
- return; |
- } |
- |
- cdm_context_ = cdm_context; |
- |
- if (is_player_initialized_) |
- SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); |
-} |
- |
-void WebMediaPlayerAndroid::SetCdmInternal( |
- const media::CdmAttachedCB& cdm_attached_cb) { |
- DCHECK(main_thread_checker_.CalledOnValidThread()); |
- DCHECK(cdm_context_ && is_player_initialized_); |
- DCHECK(cdm_context_->GetDecryptor() || |
- cdm_context_->GetCdmId() != media::CdmContext::kInvalidCdmId) |
- << "CDM should support either a Decryptor or a CDM ID."; |
- |
- if (cdm_ready_cb_.is_null()) { |
- cdm_attached_cb.Run(true); |
- return; |
- } |
- |
- // Satisfy |cdm_ready_cb_|. Use BindToCurrentLoop() since the callback could |
- // be fired on other threads. |
- base::ResetAndReturn(&cdm_ready_cb_) |
- .Run(cdm_context_, media::BindToCurrentLoop(base::Bind( |
- &WebMediaPlayerAndroid::OnCdmAttached, |
- weak_factory_.GetWeakPtr(), cdm_attached_cb))); |
-} |
- |
-void WebMediaPlayerAndroid::OnCdmAttached( |
- const media::CdmAttachedCB& cdm_attached_cb, |
- bool success) { |
- DVLOG(1) << __FUNCTION__ << ": success: " << success; |
- DCHECK(main_thread_checker_.CalledOnValidThread()); |
- |
- if (!success) { |
- if (cdm_context_->GetCdmId() == media::CdmContext::kInvalidCdmId) { |
- NOTREACHED() << "CDM cannot be attached to media player."; |
- cdm_attached_cb.Run(false); |
- return; |
- } |
- |
- // If the CDM is not attached (e.g. the CDM does not support a Decryptor), |
- // MediaSourceDelegate will fall back to use a browser side (IPC-based) CDM. |
- player_manager_->SetCdm(player_id_, cdm_context_->GetCdmId()); |
- } |
- |
- cdm_attached_cb.Run(true); |
-} |
- |
-void WebMediaPlayerAndroid::SetCdmReadyCB( |
- const MediaSourceDelegate::CdmReadyCB& cdm_ready_cb) { |
- DCHECK(main_thread_checker_.CalledOnValidThread()); |
- DCHECK(is_player_initialized_); |
- |
- // Cancels the previous CDM request. |
- if (cdm_ready_cb.is_null()) { |
- if (!cdm_ready_cb_.is_null()) { |
- base::ResetAndReturn(&cdm_ready_cb_) |
- .Run(nullptr, base::Bind(&media::IgnoreCdmAttached)); |
- } |
- return; |
- } |
- |
- // TODO(xhwang): Support multiple CDM notification request (e.g. from |
- // video and audio). The current implementation is okay for the current |
- // media pipeline since we initialize audio and video decoders in sequence. |
- // But WebMediaPlayerAndroid should not depend on media pipeline's |
- // implementation detail. |
- DCHECK(cdm_ready_cb_.is_null()); |
- cdm_ready_cb_ = cdm_ready_cb; |
- |
- if (cdm_context_) |
- SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); |
-} |
- |
bool WebMediaPlayerAndroid::supportsOverlayFullscreenVideo() { |
return true; |
} |