Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(924)

Unified Diff: content/renderer/media/android/webmediaplayer_android.cc

Issue 2283493003: Delete browser MSE implementation. (Closed)
Patch Set: Actually delete MSP. Cleanse references. Remove AudioTrack usage. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698