diff options
Diffstat (limited to 'content')
24 files changed, 19 insertions, 1190 deletions
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc index 77ce9d1..04cde98 100644 --- a/content/browser/media/android/browser_media_player_manager.cc +++ b/content/browser/media/android/browser_media_player_manager.cc @@ -64,7 +64,6 @@ ContentViewCoreImpl* BrowserMediaPlayerManager::GetContentViewCore() const { return ContentViewCoreImpl::FromWebContents(web_contents()); } -#if !defined(GOOGLE_TV) // static MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( MediaPlayerHostMsg_Initialize_Type type, @@ -112,7 +111,6 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( NOTREACHED(); return NULL; } -#endif BrowserMediaPlayerManager::BrowserMediaPlayerManager( RenderViewHost* render_view_host) diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index cf63b96..3296794 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -1138,9 +1138,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer( switches::kEnableWebRtcHWVp8Encoding, switches::kEnableWebRtcTcpServerSocket, #endif -#if defined(GOOGLE_TV) - switches::kUseExternalVideoSurfaceThresholdInPixels, -#endif #if defined(OS_ANDROID) switches::kDisableGestureRequirementForMediaPlayback, switches::kDisableLowEndDeviceMode, diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 5352e56..b907e90 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc @@ -19,14 +19,12 @@ namespace content { static void SetRuntimeFeatureDefaultsForPlatform() { #if defined(OS_ANDROID) -#if !defined(GOOGLE_TV) // MSE/EME implementation needs Android MediaCodec API. if (!media::MediaCodecBridge::IsAvailable()) { WebRuntimeFeatures::enableWebKitMediaSource(false); WebRuntimeFeatures::enableMediaSource(false); WebRuntimeFeatures::enablePrefixedEncryptedMedia(false); } -#endif // !defined(GOOGLE_TV) // WebAudio is enabled by default only on ARM and only when the // MediaCodec API is available. WebRuntimeFeatures::enableWebAudio( diff --git a/content/common/media/media_player_messages_android.h b/content/common/media/media_player_messages_android.h index 8d56526..145fc0b 100644 --- a/content/common/media/media_player_messages_android.h +++ b/content/common/media/media_player_messages_android.h @@ -42,9 +42,6 @@ IPC_STRUCT_TRAITS_BEGIN(media::DemuxerConfigs) IPC_STRUCT_TRAITS_MEMBER(video_extra_data) IPC_STRUCT_TRAITS_MEMBER(duration_ms) -#if defined(GOOGLE_TV) - IPC_STRUCT_TRAITS_MEMBER(key_system) -#endif // defined(GOOGLE_TV) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(media::DemuxerData) diff --git a/content/common/media/media_player_messages_enums_android.h b/content/common/media/media_player_messages_enums_android.h index fe45950..97818ff 100644 --- a/content/common/media/media_player_messages_enums_android.h +++ b/content/common/media/media_player_messages_enums_android.h @@ -9,9 +9,6 @@ enum MediaPlayerHostMsg_Initialize_Type { MEDIA_PLAYER_TYPE_URL, MEDIA_PLAYER_TYPE_MEDIA_SOURCE, -#if defined(GOOGLE_TV) - MEDIA_PLAYER_TYPE_MEDIA_STREAM, -#endif }; #endif // CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_ANDROID_H_ diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index 260ad05..c98e6ed 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi @@ -705,14 +705,6 @@ 'renderer/media/webrtc_logging.h', ], }], - ['enable_webrtc==1 and google_tv==1', { - 'sources': [ - 'renderer/media/rtc_video_decoder_bridge_tv.cc', - 'renderer/media/rtc_video_decoder_bridge_tv.h', - 'renderer/media/rtc_video_decoder_factory_tv.cc', - 'renderer/media/rtc_video_decoder_factory_tv.h', - ], - }], ['enable_plugins==1', { 'dependencies': [ '../ppapi/ppapi_internal.gyp:ppapi_host', diff --git a/content/content_tests.gypi b/content/content_tests.gypi index b02f7a7..6c4cf22 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -821,11 +821,6 @@ 'browser/renderer_host/input/tap_suppression_controller_unittest.cc', ], }], - ['enable_webrtc==1 and google_tv==1', { - 'sources': [ - 'renderer/media/rtc_video_decoder_factory_tv_unittest.cc', - ], - }], ['use_dbus==0', { 'sources!': [ 'browser/geolocation/wifi_data_provider_linux_unittest.cc', diff --git a/content/public/android/java/src/org/chromium/content/browser/DeviceUtils.java b/content/public/android/java/src/org/chromium/content/browser/DeviceUtils.java index 17c8235..f472dc9 100644 --- a/content/public/android/java/src/org/chromium/content/browser/DeviceUtils.java +++ b/content/public/android/java/src/org/chromium/content/browser/DeviceUtils.java @@ -5,7 +5,6 @@ package org.chromium.content.browser; import android.content.Context; -import android.content.pm.PackageManager; import org.chromium.base.CommandLine; import org.chromium.content.common.ContentSwitches; @@ -20,7 +19,6 @@ public class DeviceUtils { */ private static final int MINIMUM_TABLET_WIDTH_DP = 600; - private static Boolean sIsTv = null; private static Boolean sIsTablet = null; /** @@ -29,10 +27,6 @@ public class DeviceUtils { */ public static boolean isTablet(Context context) { if (sIsTablet == null) { - if (isTv(context)) { - sIsTablet = true; - return sIsTablet; - } int minimumScreenWidthDp = context.getResources().getConfiguration(). smallestScreenWidthDp; sIsTablet = minimumScreenWidthDp >= MINIMUM_TABLET_WIDTH_DP; @@ -41,26 +35,6 @@ public class DeviceUtils { } /** - * Checks if the device should be treated as TV. Note that this should be - * invoked before {@link #isTablet(Context)} to get the correct result - * since they are not orthogonal. - * - * @param context Android context - * @return {@code true} if the device should be treated as TV. - */ - public static boolean isTv(Context context) { - if (sIsTv == null) { - PackageManager manager = context.getPackageManager(); - if (manager != null) { - sIsTv = manager.hasSystemFeature(PackageManager.FEATURE_TELEVISION); - return sIsTv; - } - sIsTv = false; - } - return sIsTv; - } - - /** * Appends the switch specifying which user agent should be used for this device. * @param context The context for the caller activity. */ diff --git a/content/public/android/java/src/org/chromium/content/browser/PepperPluginManager.java b/content/public/android/java/src/org/chromium/content/browser/PepperPluginManager.java index 6d9271e..4db35fe 100644 --- a/content/public/android/java/src/org/chromium/content/browser/PepperPluginManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/PepperPluginManager.java @@ -15,8 +15,6 @@ import android.content.pm.ServiceInfo; import android.os.Bundle; import android.util.Log; -import org.chromium.base.ContextTypes; - import java.util.List; /** @@ -90,11 +88,6 @@ public class PepperPluginManager { * @return Description string for plugins */ public static String getPlugins(final Context context) { - if (DeviceUtils.isTv(context) && - !ContextTypes.isRunningInWebapp(context)) { - // Chrome-for-tv enables plugins only on webapp mode. - return null; - } StringBuffer ret = new StringBuffer(); PackageManager pm = context.getPackageManager(); List<ResolveInfo> plugins = pm.queryIntentServices( diff --git a/content/renderer/media/android/media_source_delegate.cc b/content/renderer/media/android/media_source_delegate.cc index bd4cf1a..0476633 100644 --- a/content/renderer/media/android/media_source_delegate.cc +++ b/content/renderer/media/android/media_source_delegate.cc @@ -58,7 +58,6 @@ MediaSourceDelegate::MediaSourceDelegate( demuxer_client_(demuxer_client), demuxer_client_id_(demuxer_client_id), media_log_(media_log), - demuxer_(NULL), is_demuxer_ready_(false), audio_stream_(NULL), video_stream_(NULL), @@ -66,9 +65,6 @@ MediaSourceDelegate::MediaSourceDelegate( doing_browser_seek_(false), browser_seek_time_(media::kNoTimestamp()), expecting_regular_seek_(false), -#if defined(GOOGLE_TV) - key_added_(false), -#endif access_unit_size_(0) { DCHECK(main_loop_->BelongsToCurrentThread()); } @@ -77,7 +73,6 @@ MediaSourceDelegate::~MediaSourceDelegate() { DCHECK(main_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; DCHECK(!chunk_demuxer_); - DCHECK(!demuxer_); DCHECK(!demuxer_client_); DCHECK(!audio_decrypting_demuxer_stream_); DCHECK(!video_decrypting_demuxer_stream_); @@ -89,7 +84,7 @@ void MediaSourceDelegate::Destroy() { DCHECK(main_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; - if (!demuxer_) { + if (!chunk_demuxer_) { DCHECK(!demuxer_client_); delete this; return; @@ -102,8 +97,7 @@ void MediaSourceDelegate::Destroy() { main_weak_factory_.InvalidateWeakPtrs(); DCHECK(!main_weak_factory_.HasWeakPtrs()); - if (chunk_demuxer_) - chunk_demuxer_->Shutdown(); + chunk_demuxer_->Shutdown(); // |this| will be transferred to the callback StopDemuxer() and // OnDemuxerStopDone(). They own |this| and OnDemuxerStopDone() will delete @@ -115,7 +109,7 @@ void MediaSourceDelegate::Destroy() { void MediaSourceDelegate::StopDemuxer() { DCHECK(media_loop_->BelongsToCurrentThread()); - DCHECK(demuxer_); + DCHECK(chunk_demuxer_); demuxer_client_->RemoveDelegate(demuxer_client_id_); demuxer_client_ = NULL; @@ -132,8 +126,8 @@ void MediaSourceDelegate::StopDemuxer() { // The callback OnDemuxerStopDone() owns |this| and will delete it when // called. Hence using base::Unretained(this) is safe here. - demuxer_->Stop(base::Bind(&MediaSourceDelegate::OnDemuxerStopDone, - base::Unretained(this))); + chunk_demuxer_->Stop(base::Bind(&MediaSourceDelegate::OnDemuxerStopDone, + base::Unretained(this))); } void MediaSourceDelegate::InitializeMediaSource( @@ -157,7 +151,6 @@ void MediaSourceDelegate::InitializeMediaSource( media::BindToCurrentLoop(base::Bind( &MediaSourceDelegate::OnNeedKey, main_weak_this_)), base::Bind(&LogMediaSourceError, media_log_))); - demuxer_ = chunk_demuxer_.get(); // |this| will be retained until StopDemuxer() is posted, so Unretained() is // safe here. @@ -169,31 +162,12 @@ void MediaSourceDelegate::InitializeMediaSource( void MediaSourceDelegate::InitializeDemuxer() { DCHECK(media_loop_->BelongsToCurrentThread()); demuxer_client_->AddDelegate(demuxer_client_id_, this); - demuxer_->Initialize(this, base::Bind(&MediaSourceDelegate::OnDemuxerInitDone, + chunk_demuxer_->Initialize(this, + base::Bind(&MediaSourceDelegate::OnDemuxerInitDone, media_weak_factory_.GetWeakPtr()), - false); + false); } -#if defined(GOOGLE_TV) -void MediaSourceDelegate::InitializeMediaStream( - media::Demuxer* demuxer, - const UpdateNetworkStateCB& update_network_state_cb) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK(demuxer); - demuxer_ = demuxer; - update_network_state_cb_ = media::BindToCurrentLoop(update_network_state_cb); - // When playing Media Stream, don't wait to accumulate multiple packets per - // IPC communication. - access_unit_size_ = 1; - - // |this| will be retained until StopDemuxer() is posted, so Unretained() is - // safe here. - media_loop_->PostTask(FROM_HERE, - base::Bind(&MediaSourceDelegate::InitializeDemuxer, - base::Unretained(this))); -} -#endif - const blink::WebTimeRanges& MediaSourceDelegate::Buffered() { buffered_web_time_ranges_ = ConvertToWebTimeRanges(buffered_time_ranges_); @@ -313,7 +287,7 @@ void MediaSourceDelegate::Seek( void MediaSourceDelegate::SeekInternal(const base::TimeDelta& seek_time) { DCHECK(media_loop_->BelongsToCurrentThread()); DCHECK(IsSeeking()); - demuxer_->Seek(seek_time, base::Bind( + chunk_demuxer_->Seek(seek_time, base::Bind( &MediaSourceDelegate::OnDemuxerSeekDone, media_weak_factory_.GetWeakPtr())); } @@ -388,7 +362,7 @@ void MediaSourceDelegate::OnBufferReady( << ((!buffer || buffer->end_of_stream()) ? -1 : buffer->timestamp().InMilliseconds()) << ") : " << demuxer_client_id_; - DCHECK(demuxer_); + DCHECK(chunk_demuxer_); // No new OnReadFromDemuxer() will be called during seeking. So this callback // must be from previous OnReadFromDemuxer() call and should be ignored. @@ -451,7 +425,6 @@ void MediaSourceDelegate::OnBufferReady( data->access_units[index].data.assign( buffer->data(), buffer->data() + buffer->data_size()); -#if !defined(GOOGLE_TV) // Vorbis needs 4 extra bytes padding on Android. Check // NuMediaExtractor.cpp in Android source code. if (is_audio && media::kCodecVorbis == @@ -460,7 +433,6 @@ void MediaSourceDelegate::OnBufferReady( data->access_units[index].data.end(), kVorbisPadding, kVorbisPadding + 4); } -#endif if (buffer->decrypt_config()) { data->access_units[index].key_id = std::vector<char>( buffer->decrypt_config()->key_id().begin(), @@ -508,15 +480,15 @@ void MediaSourceDelegate::RemoveTextStream( void MediaSourceDelegate::OnDemuxerInitDone(media::PipelineStatus status) { DCHECK(media_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << "(" << status << ") : " << demuxer_client_id_; - DCHECK(demuxer_); + DCHECK(chunk_demuxer_); if (status != media::PIPELINE_OK) { OnDemuxerError(status); return; } - audio_stream_ = demuxer_->GetStream(DemuxerStream::AUDIO); - video_stream_ = demuxer_->GetStream(DemuxerStream::VIDEO); + audio_stream_ = chunk_demuxer_->GetStream(DemuxerStream::AUDIO); + video_stream_ = chunk_demuxer_->GetStream(DemuxerStream::VIDEO); if (audio_stream_ && audio_stream_->audio_decoder_config().is_encrypted() && !set_decryptor_ready_cb_.is_null()) { @@ -568,7 +540,7 @@ void MediaSourceDelegate::OnAudioDecryptingDemuxerStreamInitDone( media::PipelineStatus status) { DCHECK(media_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << "(" << status << ") : " << demuxer_client_id_; - DCHECK(demuxer_); + DCHECK(chunk_demuxer_); if (status != media::PIPELINE_OK) audio_decrypting_demuxer_stream_.reset(); @@ -591,7 +563,7 @@ void MediaSourceDelegate::OnVideoDecryptingDemuxerStreamInitDone( media::PipelineStatus status) { DCHECK(media_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << "(" << status << ") : " << demuxer_client_id_; - DCHECK(demuxer_); + DCHECK(chunk_demuxer_); if (status != media::PIPELINE_OK) video_decrypting_demuxer_stream_.reset(); @@ -666,7 +638,6 @@ void MediaSourceDelegate::DeleteSelf() { DCHECK(main_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; chunk_demuxer_.reset(); - demuxer_ = NULL; delete this; } @@ -677,42 +648,9 @@ void MediaSourceDelegate::OnMediaConfigRequest() { NotifyDemuxerReady(); } -#if defined(GOOGLE_TV) -// TODO(kjyoun): Enhance logic to detect when to call NotifyDemuxerReady() -// For now, we call it when the first key is added. See http://crbug.com/255781 -void MediaSourceDelegate::NotifyKeyAdded(const std::string& key_system) { - if (!media_loop_->BelongsToCurrentThread()) { - media_loop_->PostTask(FROM_HERE, - base::Bind(&MediaSourceDelegate::NotifyKeyAdded, - base::Unretained(this), key_system)); - return; - } - DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; - if (key_added_) - return; - key_added_ = true; - key_system_ = key_system; - if (!CanNotifyDemuxerReady()) - return; - if (HasEncryptedStream()) - NotifyDemuxerReady(); -} -#endif // defined(GOOGLE_TV) - bool MediaSourceDelegate::CanNotifyDemuxerReady() { DCHECK(media_loop_->BelongsToCurrentThread()); - // This can happen when a key is added before the demuxer is initialized. - // See NotifyKeyAdded(). - // TODO(kjyoun): Remove NotifyDemxuerReady() call from NotifyKeyAdded() so - // that we can remove all is_demuxer_ready_/key_added_/key_system_ madness. - // See http://crbug.com/255781 - if (!is_demuxer_ready_) - return false; -#if defined(GOOGLE_TV) - if (HasEncryptedStream() && !key_added_) - return false; -#endif // defined(GOOGLE_TV) - return true; + return is_demuxer_ready_; } void MediaSourceDelegate::NotifyDemuxerReady() { @@ -741,10 +679,6 @@ void MediaSourceDelegate::NotifyDemuxerReady() { } configs->duration_ms = GetDurationMs(); -#if defined(GOOGLE_TV) - configs->key_system = HasEncryptedStream() ? key_system_ : ""; -#endif - if (demuxer_client_) demuxer_client_->DemuxerReady(demuxer_client_id_, *configs); } diff --git a/content/renderer/media/android/media_source_delegate.h b/content/renderer/media/android/media_source_delegate.h index e627a1f..c872efb 100644 --- a/content/renderer/media/android/media_source_delegate.h +++ b/content/renderer/media/android/media_source_delegate.h @@ -67,12 +67,6 @@ class MediaSourceDelegate : public media::DemuxerHost { const UpdateNetworkStateCB& update_network_state_cb, const DurationChangeCB& duration_change_cb); -#if defined(GOOGLE_TV) - void InitializeMediaStream( - media::Demuxer* demuxer, - const UpdateNetworkStateCB& update_network_state_cb); -#endif - const blink::WebTimeRanges& Buffered(); size_t DecodedFrameCount() const; size_t DroppedFrameCount() const; @@ -100,8 +94,6 @@ class MediaSourceDelegate : public media::DemuxerHost { // cached data since last keyframe. See http://crbug.com/304234. void Seek(const base::TimeDelta& seek_time, bool is_browser_seek); - void NotifyKeyAdded(const std::string& key_system); - // Called when DemuxerStreamPlayer needs to read data from ChunkDemuxer. void OnReadFromDemuxer(media::DemuxerStream::Type type); @@ -211,7 +203,6 @@ class MediaSourceDelegate : public media::DemuxerHost { DurationChangeCB duration_change_cb_; scoped_ptr<media::ChunkDemuxer> chunk_demuxer_; - media::Demuxer* demuxer_; bool is_demuxer_ready_; media::SetDecryptorReadyCB set_decryptor_ready_cb_; @@ -230,10 +221,6 @@ class MediaSourceDelegate : public media::DemuxerHost { MediaSourceOpenedCB media_source_opened_cb_; media::Demuxer::NeedKeyCB need_key_cb_; - // The currently selected key system. Empty string means that no key system - // has been selected. - blink::WebString current_key_system_; - // Temporary for EME v0.1. In the future the init data type should be passed // through GenerateKeyRequest() directly from WebKit. std::string init_data_type_; @@ -251,11 +238,6 @@ class MediaSourceDelegate : public media::DemuxerHost { base::TimeDelta browser_seek_time_; bool expecting_regular_seek_; -#if defined(GOOGLE_TV) - bool key_added_; - std::string key_system_; -#endif // defined(GOOGLE_TV) - size_t access_unit_size_; DISALLOW_COPY_AND_ASSIGN(MediaSourceDelegate); diff --git a/content/renderer/media/android/renderer_media_player_manager.h b/content/renderer/media/android/renderer_media_player_manager.h index 371ab40..b68f394 100644 --- a/content/renderer/media/android/renderer_media_player_manager.h +++ b/content/renderer/media/android/renderer_media_player_manager.h @@ -17,10 +17,6 @@ #include "media/base/media_keys.h" #include "url/gurl.h" -#if defined(GOOGLE_TV) -#include "ui/gfx/rect_f.h" -#endif - namespace blink { class WebFrame; } diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc index 6cef1cc..33af4ca 100644 --- a/content/renderer/media/android/webmediaplayer_android.cc +++ b/content/renderer/media/android/webmediaplayer_android.cc @@ -41,11 +41,6 @@ #include "ui/gfx/image/image.h" #include "webkit/renderer/compositor_bindings/web_layer_impl.h" -#if defined(GOOGLE_TV) -#include "content/renderer/media/media_stream_audio_renderer.h" -#include "content/renderer/media/media_stream_client.h" -#endif - static const uint32 kGLTextureExternalOES = 0x8D65; using blink::WebMediaPlayer; @@ -111,11 +106,6 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( stream_texture_factory_(factory), needs_external_surface_(false), video_frame_provider_client_(NULL), -#if defined(GOOGLE_TV) - external_surface_threshold_(-1), - demuxer_(NULL), - media_stream_client_(NULL), -#endif // defined(GOOGLE_TV) pending_playback_(false), player_type_(MEDIA_PLAYER_TYPE_URL), current_time_(0), @@ -131,18 +121,6 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( player_id_ = manager_->RegisterMediaPlayer(this); -#if defined(GOOGLE_TV) - if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kUseExternalVideoSurfaceThresholdInPixels)) { - if (!base::StringToInt( - CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kUseExternalVideoSurfaceThresholdInPixels), - &external_surface_threshold_)) { - external_surface_threshold_ = -1; - } - } -#endif // defined(GOOGLE_TV) - #if defined(VIDEO_HOLE) // Defer stream texture creation until we are sure it's necessary. needs_establish_peer_ = false; @@ -192,24 +170,6 @@ WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE && delegate_) delegate_->PlayerGone(this); - -#if defined(GOOGLE_TV) - if (audio_renderer_) { - if (audio_renderer_->IsLocalRenderer()) { - audio_renderer_->Stop(); - } else if (!paused()) { - // The |audio_renderer_| can be shared by multiple remote streams, and - // it will be stopped when WebRtcAudioDeviceImpl goes away. So we simply - // pause the |audio_renderer_| here to avoid re-creating the - // |audio_renderer_|. - audio_renderer_->Pause(); - } - } - if (demuxer_ && !destroy_demuxer_cb_.is_null()) { - media_source_delegate_.reset(); - destroy_demuxer_cb_.Run(); - } -#endif } void WebMediaPlayerAndroid::load(LoadType load_type, @@ -225,14 +185,9 @@ void WebMediaPlayerAndroid::load(LoadType load_type, break; case LoadTypeMediaStream: -#if defined(GOOGLE_TV) - player_type_ = MEDIA_PLAYER_TYPE_MEDIA_STREAM; - break; -#else CHECK(false) << "WebMediaPlayerAndroid doesn't support MediaStream on " "this platform"; return; -#endif } has_media_metadata_ = false; @@ -267,19 +222,6 @@ void WebMediaPlayerAndroid::load(LoadType load_type, base::Bind(&WebMediaPlayerAndroid::OnDurationChanged, weak_factory_.GetWeakPtr())); } -#if defined(GOOGLE_TV) - // TODO(xhwang): Pass set_decryptor_ready_cb in InitializeMediaStream() to - // enable ClearKey support for Google TV. - if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_STREAM) { - media_source_delegate_->InitializeMediaStream( - demuxer_, - base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, - weak_factory_.GetWeakPtr())); - audio_renderer_ = media_stream_client_->GetAudioRenderer(url); - if (audio_renderer_) - audio_renderer_->Start(); - } -#endif } else { info_loader_.reset( new MediaInfoLoader( @@ -332,10 +274,6 @@ void WebMediaPlayerAndroid::play() { manager_->RequestExternalSurface(player_id_, last_computed_rect_); } #endif // defined(VIDEO_HOLE) -#if defined(GOOGLE_TV) - if (audio_renderer_ && paused()) - audio_renderer_->Play(); -#endif // defined(GOOGLE_TV) TryCreateStreamTextureProxyIfNeeded(); if (hasVideo() && needs_establish_peer_) @@ -731,14 +669,9 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { return; #if defined(VIDEO_HOLE) - bool has_surface_size_restriction = false; -#if defined(GOOGLE_TV) - has_surface_size_restriction = external_surface_threshold_ >= 0 && - external_surface_threshold_ <= width * height; -#endif // defined(GOOGLE_TV) // Use H/W surface for MSE as the content might be protected. // TODO(qinmin): Change this so that only EME needs the H/W surface - if (media_source_delegate_ || has_surface_size_restriction) { + if (media_source_delegate_) { needs_external_surface_ = true; if (!paused() && !manager_->IsInFullscreen(frame_)) manager_->RequestExternalSurface(player_id_, last_computed_rect_); @@ -920,10 +853,6 @@ void WebMediaPlayerAndroid::Detach() { } void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { -#if defined(GOOGLE_TV) - if (audio_renderer_ && !paused()) - audio_renderer_->Pause(); -#endif manager_->Pause(player_id_, is_media_related_action); UpdatePlayingState(false); } @@ -1366,11 +1295,6 @@ WebMediaPlayerAndroid::CancelKeyRequestInternal( void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) { EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); -#if defined(GOOGLE_TV) - if (media_source_delegate_) - media_source_delegate_->NotifyKeyAdded(current_key_system_.utf8()); -#endif // defined(GOOGLE_TV) - client_->keyAdded(current_key_system_, WebString::fromUTF8(session_id)); } @@ -1429,19 +1353,6 @@ void WebMediaPlayerAndroid::OnNeedKey(const std::string& type, init_data.size()); } -#if defined(GOOGLE_TV) -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::DoReleaseRemotePlaybackTexture(uint32 sync_point) { DCHECK(main_thread_checker_.CalledOnValidThread()); DCHECK(remote_playback_texture_id_); diff --git a/content/renderer/media/android/webmediaplayer_android.h b/content/renderer/media/android/webmediaplayer_android.h index d2e9e51..3cdc6ac 100644 --- a/content/renderer/media/android/webmediaplayer_android.h +++ b/content/renderer/media/android/webmediaplayer_android.h @@ -32,7 +32,6 @@ #include "ui/gfx/rect_f.h" namespace media { -class Demuxer; class MediaLog; } @@ -48,11 +47,6 @@ namespace content { class WebMediaPlayerDelegate; class RendererMediaPlayerManager; -#if defined(GOOGLE_TV) -class MediaStreamAudioRenderer; -class MediaStreamClient; -#endif - // This class implements blink::WebMediaPlayer by keeping the android // media player in the browser process. It listens to all the status changes // sent from the browser process and sends playback controls to the media @@ -225,12 +219,6 @@ class WebMediaPlayerAndroid void OnNeedKey(const std::string& type, const std::vector<uint8>& init_data); -#if defined(GOOGLE_TV) - bool InjectMediaStream(MediaStreamClient* media_stream_client, - media::Demuxer* demuxer, - const base::Closure& destroy_demuxer_cb); -#endif - // Can be called on any thread. static void OnReleaseRemotePlaybackTexture( const scoped_refptr<base::MessageLoopProxy>& main_loop, @@ -402,18 +390,6 @@ class WebMediaPlayerAndroid gfx::RectF last_computed_rect_; #endif // defined(VIDEO_HOLE) -#if defined(GOOGLE_TV) - // Pixel threshold for external surface usage. Negative value means that the - // threshold is not defined, so that external surface is never used. - int external_surface_threshold_; - - // Media Stream related fields. - media::Demuxer* demuxer_; - base::Closure destroy_demuxer_cb_; - scoped_refptr<MediaStreamAudioRenderer> audio_renderer_; - MediaStreamClient* media_stream_client_; -#endif - scoped_ptr<MediaSourceDelegate, MediaSourceDelegate::Destroyer> media_source_delegate_; diff --git a/content/renderer/media/crypto/key_systems.cc b/content/renderer/media/crypto/key_systems.cc index 4102533..ac3f4aa 100644 --- a/content/renderer/media/crypto/key_systems.cc +++ b/content/renderer/media/crypto/key_systems.cc @@ -36,7 +36,6 @@ const char kMp4a[] = "mp4a"; const char kMp4aAvc1Avc3[] = "mp4a,avc1,avc3"; #endif // defined(USE_PROPRIETARY_CODECS) -#if !defined(GOOGLE_TV) inline std::string KeySystemNameForUMAInternal( const blink::WebString& key_system) { if (key_system == kClearKeyKeySystem) @@ -47,10 +46,6 @@ inline std::string KeySystemNameForUMAInternal( #endif // WIDEVINE_CDM_AVAILABLE return "Unknown"; } -#else -// Declares the function, which is defined in another file. -std::string KeySystemNameForUMAInternal(const blink::WebString& key_system); -#endif // !defined(GOOGLE_TV) // Convert a WebString to ASCII, falling back on an empty string in the case // of a non-ASCII string. diff --git a/content/renderer/media/crypto/ppapi_decryptor.cc b/content/renderer/media/crypto/ppapi_decryptor.cc index b60afaa..cf7808c 100644 --- a/content/renderer/media/crypto/ppapi_decryptor.cc +++ b/content/renderer/media/crypto/ppapi_decryptor.cc @@ -143,18 +143,7 @@ void PpapiDecryptor::ReleaseSession(uint32 session_id) { } media::Decryptor* PpapiDecryptor::GetDecryptor() { -#if defined(GOOGLE_TV) - // Google TV only uses PpapiDecrytor as a MediaKeys and does not need the - // Decryptor interface of the PpapiDecryptor. - // Details: If we don't do this GTV will be broken. The reason is that during - // initialization, MediaSourceDelegate tries to use DecryptingDemuxerStream - // to decrypt the stream in the renderer process (for ClearKey support). - // However, for GTV, PpapiDecryptor cannot do decryption at all. By returning - // NULL, DDS init will fail and we fallback to what GTV used to do. - return NULL; -#else return this; -#endif // defined(GOOGLE_TV) } void PpapiDecryptor::RegisterNewKeyCB(StreamType stream_type, diff --git a/content/renderer/media/media_stream_dependency_factory.cc b/content/renderer/media/media_stream_dependency_factory.cc index a55ed36..ab436ee 100644 --- a/content/renderer/media/media_stream_dependency_factory.cc +++ b/content/renderer/media/media_stream_dependency_factory.cc @@ -46,10 +46,6 @@ #include "net/socket/nss_ssl_util.h" #endif -#if defined(GOOGLE_TV) -#include "content/renderer/media/rtc_video_decoder_factory_tv.h" -#endif - #if defined(OS_ANDROID) #include "media/base/android/media_codec_bridge.h" #endif @@ -202,9 +198,6 @@ class SourceStateObserver : public webrtc::ObserverInterface, MediaStreamDependencyFactory::MediaStreamDependencyFactory( P2PSocketDispatcher* p2p_socket_dispatcher) : network_manager_(NULL), -#if defined(GOOGLE_TV) - decoder_factory_tv_(NULL), -#endif p2p_socket_dispatcher_(p2p_socket_dispatcher), signaling_thread_(NULL), worker_thread_(NULL), @@ -585,16 +578,10 @@ bool MediaStreamDependencyFactory::CreatePeerConnectionFactory() { const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories = RenderThreadImpl::current()->GetGpuFactories(); -#if !defined(GOOGLE_TV) if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) { if (gpu_factories) decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); } -#else - // PeerConnectionFactory will hold the ownership of this - // VideoDecoderFactory. - decoder_factory.reset(decoder_factory_tv_ = new RTCVideoDecoderFactoryTv()); -#endif if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) { if (gpu_factories) diff --git a/content/renderer/media/media_stream_dependency_factory.h b/content/renderer/media/media_stream_dependency_factory.h index 22bbc54..13bfa3f 100644 --- a/content/renderer/media/media_stream_dependency_factory.h +++ b/content/renderer/media/media_stream_dependency_factory.h @@ -53,10 +53,6 @@ class WebRtcLoggingHandlerImpl; class WebRtcLoggingMessageFilter; struct StreamDeviceInfo; -#if defined(GOOGLE_TV) -class RTCVideoDecoderFactoryTv; -#endif - // Object factory for RTC MediaStreams and RTC PeerConnections. class CONTENT_EXPORT MediaStreamDependencyFactory : NON_EXPORTED_BASE(public base::NonThreadSafe), @@ -151,10 +147,6 @@ class CONTENT_EXPORT MediaStreamDependencyFactory WebRtcAudioDeviceImpl* GetWebRtcAudioDevice(); -#if defined(GOOGLE_TV) - RTCVideoDecoderFactoryTv* decoder_factory_tv() { return decoder_factory_tv_; } -#endif - static void AddNativeTrackToBlinkTrack( webrtc::MediaStreamTrackInterface* native_track, const blink::WebMediaStreamTrack& webkit_track, @@ -255,12 +247,6 @@ class CONTENT_EXPORT MediaStreamDependencyFactory scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_; -#if defined(GOOGLE_TV) - // |pc_factory_| will hold the ownership of this object, and |pc_factory_| - // outlives this object. Thus weak pointer is sufficient. - RTCVideoDecoderFactoryTv* decoder_factory_tv_; -#endif - scoped_refptr<P2PSocketDispatcher> p2p_socket_dispatcher_; scoped_refptr<WebRtcAudioDeviceImpl> audio_device_; diff --git a/content/renderer/media/rtc_video_decoder_bridge_tv.cc b/content/renderer/media/rtc_video_decoder_bridge_tv.cc deleted file mode 100644 index 68a798a..0000000 --- a/content/renderer/media/rtc_video_decoder_bridge_tv.cc +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 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. - -#include "content/renderer/media/rtc_video_decoder_bridge_tv.h" - -#include <queue> - -#include "base/bind.h" -#include "base/callback_helpers.h" -#include "base/location.h" -#include "base/logging.h" -#include "base/memory/ref_counted.h" -#include "base/memory/singleton.h" -#include "base/message_loop/message_loop_proxy.h" -#include "base/time/time.h" -#include "content/renderer/media/rtc_video_decoder_factory_tv.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/decoder_buffer.h" -#include "third_party/libjingle/source/talk/base/ratetracker.h" - -namespace content { - -RTCVideoDecoderBridgeTv::RTCVideoDecoderBridgeTv( - RTCVideoDecoderFactoryTv* factory) - : factory_(factory), - is_initialized_(false), - first_frame_(true) {} - -RTCVideoDecoderBridgeTv::~RTCVideoDecoderBridgeTv() {} - -int32_t RTCVideoDecoderBridgeTv::InitDecode( - const webrtc::VideoCodec* codec_settings, - int32_t number_of_cores) { - // We don't support non-VP8 codec, feedback mode, nor double-initialization - if (codec_settings->codecType != webrtc::kVideoCodecVP8 || - codec_settings->codecSpecific.VP8.feedbackModeOn || is_initialized_) - return WEBRTC_VIDEO_CODEC_ERROR; - size_ = gfx::Size(codec_settings->width, codec_settings->height); - - is_initialized_ = true; - first_frame_ = true; - factory_->InitializeStream(size_); - - return WEBRTC_VIDEO_CODEC_OK; -} - -int32_t RTCVideoDecoderBridgeTv::Decode( - const webrtc::EncodedImage& input_image, - bool missing_frames, - const webrtc::RTPFragmentationHeader* fragmentation, - const webrtc::CodecSpecificInfo* codec_specific_info, - int64_t render_time_ms) { - // Unlike the SW decoder in libvpx, hw decoder can not handle broken frames. - // Here, we return an error in order to request a key frame. - if (missing_frames || !input_image._completeFrame) - return WEBRTC_VIDEO_CODEC_ERROR; - - if (!is_initialized_) - return WEBRTC_VIDEO_CODEC_UNINITIALIZED; - - if (first_frame_) { - // If the first frame is not a key frame, return an error to request a key - // frame. - if (input_image._frameType != webrtc::kKeyFrame) - return WEBRTC_VIDEO_CODEC_ERROR; - - // Google TV expects timestamp from 0, so we store the initial timestamp as - // an offset and subtract the value from every timestamps to meet the - // expectation. - timestamp_offset_millis_ = render_time_ms; - } - first_frame_ = false; - gfx::Size new_size; - if (input_image._frameType == webrtc::kKeyFrame && - input_image._encodedWidth != 0 && input_image._encodedHeight != 0) { - // Only a key frame has a meaningful size. - new_size.SetSize(input_image._encodedWidth, input_image._encodedHeight); - if (size_ == new_size) - new_size = gfx::Size(); - else - size_ = new_size; - } - // |input_image_| may be destroyed after this call, so we make a copy of the - // buffer so that we can queue the buffer asynchronously. - scoped_refptr<media::DecoderBuffer> buffer = - media::DecoderBuffer::CopyFrom(input_image._buffer, input_image._length); - if (render_time_ms != -1) { - buffer->set_timestamp(base::TimeDelta::FromMilliseconds( - render_time_ms - timestamp_offset_millis_)); - } - - factory_->QueueBuffer(buffer, new_size); - - return WEBRTC_VIDEO_CODEC_OK; -} - -int32_t RTCVideoDecoderBridgeTv::RegisterDecodeCompleteCallback( - webrtc::DecodedImageCallback* callback) { - return WEBRTC_VIDEO_CODEC_OK; -} - -int32_t RTCVideoDecoderBridgeTv::Release() { - is_initialized_ = false; - return WEBRTC_VIDEO_CODEC_OK; -} - -int32_t RTCVideoDecoderBridgeTv::Reset() { - first_frame_ = true; - return WEBRTC_VIDEO_CODEC_OK; -} - -} // namespace content diff --git a/content/renderer/media/rtc_video_decoder_bridge_tv.h b/content/renderer/media/rtc_video_decoder_bridge_tv.h deleted file mode 100644 index 2ab6fde..0000000 --- a/content/renderer/media/rtc_video_decoder_bridge_tv.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 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 CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_BRIDGE_TV_H_ -#define CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_BRIDGE_TV_H_ - -#include "base/basictypes.h" -#include "base/compiler_specific.h" -#include "content/common/content_export.h" -#include "third_party/webrtc/modules/video_coding/codecs/interface/video_codec_interface.h" -#include "ui/gfx/size.h" - -namespace content { - -class MediaStreamDependencyFactory; -class RTCVideoDecoderFactoryTv; - -// An object shared between WebMediaPlayerAndroid and WebRTC Video Engine. -// Note that this class provides the first remote stream. -class CONTENT_EXPORT RTCVideoDecoderBridgeTv - : NON_EXPORTED_BASE(public webrtc::VideoDecoder) { - public: - explicit RTCVideoDecoderBridgeTv(RTCVideoDecoderFactoryTv* factory); - virtual ~RTCVideoDecoderBridgeTv(); - - // webrtc::VideoDecoder implementation. - virtual int32_t InitDecode(const webrtc::VideoCodec* codec_settings, - int32_t number_of_cores) OVERRIDE; - virtual int32_t Decode( - const webrtc::EncodedImage& input_image, - bool missing_frames, - const webrtc::RTPFragmentationHeader* fragmentation, - const webrtc::CodecSpecificInfo* codec_specific_info, - int64_t render_time_ms) OVERRIDE; - virtual int32_t RegisterDecodeCompleteCallback( - webrtc::DecodedImageCallback* callback) OVERRIDE; - virtual int32_t Release() OVERRIDE; - virtual int32_t Reset() OVERRIDE; - - private: - // The factory outlives this object, so weak pointer is fine. - RTCVideoDecoderFactoryTv* factory_; - - gfx::Size size_; - bool is_initialized_; - bool first_frame_; - int64_t timestamp_offset_millis_; - - DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderBridgeTv); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_BRIDGE_TV_H_ diff --git a/content/renderer/media/rtc_video_decoder_factory_tv.cc b/content/renderer/media/rtc_video_decoder_factory_tv.cc deleted file mode 100644 index 5a9df70..0000000 --- a/content/renderer/media/rtc_video_decoder_factory_tv.cc +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 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. - -#include "content/renderer/media/rtc_video_decoder_factory_tv.h" - -#include "base/callback_helpers.h" -#include "content/renderer/media/rtc_video_decoder_bridge_tv.h" -#include "media/base/audio_decoder_config.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/decoder_buffer.h" -#include "media/base/video_decoder_config.h" -#include "third_party/libjingle/source/talk/base/ratetracker.h" - -using media::DemuxerStream; - -namespace content { - -// RTCDemuxerStream ------------------------------------------------------------ - -class RTCDemuxerStream : public DemuxerStream { - public: - explicit RTCDemuxerStream(const gfx::Size& size); - virtual ~RTCDemuxerStream(); - - // DemuxerStream implementation. - virtual void Read(const ReadCB& read_cb) OVERRIDE; - virtual media::AudioDecoderConfig audio_decoder_config() OVERRIDE; - virtual media::VideoDecoderConfig video_decoder_config() OVERRIDE; - virtual Type type() OVERRIDE; - virtual void EnableBitstreamConverter() OVERRIDE; - - void QueueBuffer(scoped_refptr<media::DecoderBuffer> buffer, - const gfx::Size& new_size); - void Destroy(); - - private: - struct BufferEntry { - BufferEntry(const scoped_refptr<media::DecoderBuffer>& decoder_buffer_param, - const gfx::Size& new_size_param) - : decoder_buffer(decoder_buffer_param), - new_size(new_size_param) {} - - scoped_refptr<media::DecoderBuffer> decoder_buffer; - // When |!new_size.isEmpty()|, it means that config change with new size - // |new_size| happened. - gfx::Size new_size; - }; - - void RunReadCallback_Locked(); - - base::Lock lock_; - bool is_destroyed_; - std::queue<BufferEntry> buffer_queue_; - ReadCB read_cb_; - - media::AudioDecoderConfig dummy_audio_decoder_config_; - media::VideoDecoderConfig video_decoder_config_; - talk_base::RateTracker frame_rate_tracker_; -}; - -RTCDemuxerStream::RTCDemuxerStream(const gfx::Size& size) - : is_destroyed_(false), - video_decoder_config_(media::kCodecVP8, - media::VP8PROFILE_MAIN, - media::VideoFrame::NATIVE_TEXTURE, - size, - gfx::Rect(size), - size, - NULL, - 0, - false) {} - -RTCDemuxerStream::~RTCDemuxerStream() { DCHECK(is_destroyed_); } - -media::AudioDecoderConfig RTCDemuxerStream::audio_decoder_config() { - NOTIMPLEMENTED() << "Does not support audio."; - return dummy_audio_decoder_config_; -} - -media::VideoDecoderConfig RTCDemuxerStream::video_decoder_config() { - base::AutoLock lock(lock_); - return video_decoder_config_; -} - -DemuxerStream::Type RTCDemuxerStream::type() { return DemuxerStream::VIDEO; } - -void RTCDemuxerStream::EnableBitstreamConverter() { NOTREACHED(); } - -void RTCDemuxerStream::QueueBuffer(scoped_refptr<media::DecoderBuffer> buffer, - const gfx::Size& new_size) { - base::AutoLock lock(lock_); - if (is_destroyed_) - return; - buffer_queue_.push(BufferEntry(buffer, new_size)); - if (buffer) - frame_rate_tracker_.Update(1); - DVLOG(1) << "frame rate received : " << frame_rate_tracker_.units_second(); - RunReadCallback_Locked(); -} - -void RTCDemuxerStream::Read(const ReadCB& read_cb) { - base::AutoLock lock(lock_); - DCHECK(read_cb_.is_null()); - if (is_destroyed_) { - base::MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( - read_cb, DemuxerStream::kAborted, NULL)); - return; - } - read_cb_ = media::BindToCurrentLoop(read_cb); - RunReadCallback_Locked(); -} - -void RTCDemuxerStream::Destroy() { - base::AutoLock lock(lock_); - DCHECK(!is_destroyed_); - is_destroyed_ = true; - if (!read_cb_.is_null()) - base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kAborted, NULL); - while (!buffer_queue_.empty()) - buffer_queue_.pop(); -} - -void RTCDemuxerStream::RunReadCallback_Locked() { - if (read_cb_.is_null() || buffer_queue_.empty()) - return; - - BufferEntry& front = buffer_queue_.front(); - if (!front.new_size.IsEmpty()) { - // No VideoFrame actually reaches GL renderer in Google TV case. We just - // make coded_size == visible_rect == natural_size here. - video_decoder_config_.Initialize(media::kCodecVP8, - media::VP8PROFILE_MAIN, - media::VideoFrame::NATIVE_TEXTURE, - front.new_size, - gfx::Rect(front.new_size), - front.new_size, - NULL, - 0, - false, - false); - base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kConfigChanged, NULL); - front.new_size.SetSize(0, 0); - return; - } - base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kOk, front.decoder_buffer); - buffer_queue_.pop(); -} - -// RTCVideoDecoderFactoryTv ---------------------------------------------------- - -RTCVideoDecoderFactoryTv::RTCVideoDecoderFactoryTv() : is_acquired_(false) {} -RTCVideoDecoderFactoryTv::~RTCVideoDecoderFactoryTv() {} - -webrtc::VideoDecoder* RTCVideoDecoderFactoryTv::CreateVideoDecoder( - webrtc::VideoCodecType type) { - base::AutoLock lock(lock_); - // One decoder at a time! - if (decoder_) - return NULL; - // Only VP8 is supported --- returning NULL will make WebRTC fall back to SW - // decoder. - if (type != webrtc::kVideoCodecVP8) - return NULL; - decoder_.reset(new RTCVideoDecoderBridgeTv(this)); - return decoder_.get(); -} - -void RTCVideoDecoderFactoryTv::DestroyVideoDecoder( - webrtc::VideoDecoder* decoder) { - base::AutoLock lock(lock_); - DCHECK_EQ(decoder_.get(), decoder); - decoder_.reset(); -} - -bool RTCVideoDecoderFactoryTv::AcquireDemuxer() { - base::AutoLock lock(lock_); - if (is_acquired_) - return false; - is_acquired_ = true; - return true; -} - -void RTCVideoDecoderFactoryTv::ReleaseDemuxer() { - base::AutoLock lock(lock_); - DCHECK(is_acquired_); - is_acquired_ = false; - // Clean up internal state as a demuxer. - init_cb_.Reset(); - if (stream_) { - stream_->Destroy(); - stream_.reset(); - } -} - -void RTCVideoDecoderFactoryTv::Initialize(media::DemuxerHost* /*host*/, - const media::PipelineStatusCB& cb, - bool /*enable_text_tracks*/) { - base::AutoLock lock(lock_); - init_cb_ = media::BindToCurrentLoop(cb); - if (stream_) - base::ResetAndReturn(&init_cb_).Run(media::PIPELINE_OK); -} - -void RTCVideoDecoderFactoryTv::Seek(base::TimeDelta time, - const media::PipelineStatusCB& status_cb) { - DCHECK(!status_cb.is_null()); - status_cb.Run(media::PIPELINE_OK); -} - -void RTCVideoDecoderFactoryTv::Stop(const base::Closure& callback) { - DCHECK(!callback.is_null()); - callback.Run(); -} - -void RTCVideoDecoderFactoryTv::OnAudioRendererDisabled() { -} - -DemuxerStream* RTCVideoDecoderFactoryTv::GetStream(DemuxerStream::Type type) { - base::AutoLock lock(lock_); - if (type == DemuxerStream::VIDEO) - return stream_.get(); - return NULL; -} - -base::TimeDelta RTCVideoDecoderFactoryTv::GetStartTime() const { - return base::TimeDelta(); -} - -void RTCVideoDecoderFactoryTv::InitializeStream(const gfx::Size& size) { - base::AutoLock lock(lock_); - DCHECK(!stream_); - stream_.reset(new RTCDemuxerStream(size)); - if (!init_cb_.is_null()) - base::ResetAndReturn(&init_cb_).Run(media::PIPELINE_OK); -} - -void RTCVideoDecoderFactoryTv::QueueBuffer( - scoped_refptr<media::DecoderBuffer> buffer, - const gfx::Size& new_size) { - base::AutoLock lock(lock_); - DCHECK(stream_); - stream_->QueueBuffer(buffer, new_size); -} - -} // namespace content diff --git a/content/renderer/media/rtc_video_decoder_factory_tv.h b/content/renderer/media/rtc_video_decoder_factory_tv.h deleted file mode 100644 index cd51cdc..0000000 --- a/content/renderer/media/rtc_video_decoder_factory_tv.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 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 CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_FACTORY_TV_H_ -#define CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_FACTORY_TV_H_ - -#include "base/basictypes.h" -#include "base/compiler_specific.h" -#include "base/message_loop/message_loop.h" -#include "content/common/content_export.h" -#include "media/base/demuxer.h" -#include "third_party/libjingle/source/talk/media/webrtc/webrtcvideodecoderfactory.h" -#include "ui/gfx/size.h" - -namespace webrtc { -class VideoDecoder; -} - -namespace content { - -class MediaStreamDependencyFactory; -class RTCDemuxerStream; -class RTCVideoDecoderBridgeTv; - -// A factory object generating |RTCVideoDecoderBridgeTv| objects. This object -// also functions as a |media::Demuxer| object to receive encoded streams from -// the |RTCVideoDecoderBridgeTv| object (which inherits from -// |webrtc::VideoDecoder|). -class CONTENT_EXPORT RTCVideoDecoderFactoryTv - : NON_EXPORTED_BASE(public cricket::WebRtcVideoDecoderFactory), - public media::Demuxer { - public: - RTCVideoDecoderFactoryTv(); - virtual ~RTCVideoDecoderFactoryTv(); - - // cricket::WebRtcVideoDecoderFactory implementation. - virtual webrtc::VideoDecoder* CreateVideoDecoder( - webrtc::VideoCodecType type) OVERRIDE; - virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) OVERRIDE; - - // Acquires and releases the demuxer functionality of this object. Only one - // client object can access demuxer functionality at a time. No calls to - // |media::Demuxer| implementations should be made without acquiring it first. - bool AcquireDemuxer(); - void ReleaseDemuxer(); - - // media::Demuxer implementation. - virtual void Initialize(media::DemuxerHost* host, - const media::PipelineStatusCB& cb, - bool enable_text_tracks) OVERRIDE; - virtual void Seek(base::TimeDelta time, - const media::PipelineStatusCB& status_cb) OVERRIDE; - virtual void Stop(const base::Closure& callback) OVERRIDE; - virtual void OnAudioRendererDisabled() OVERRIDE; - virtual media::DemuxerStream* GetStream( - media::DemuxerStream::Type type) OVERRIDE; - virtual base::TimeDelta GetStartTime() const OVERRIDE; - - // For RTCVideoDecoderBridgeTv to talk to RTCDemuxerStream. - void InitializeStream(const gfx::Size& size); - void QueueBuffer(scoped_refptr<media::DecoderBuffer> buffer, - const gfx::Size& size); - - private: - // All private variables are lock protected. - base::Lock lock_; - scoped_ptr<RTCVideoDecoderBridgeTv> decoder_; - - media::PipelineStatusCB init_cb_; - scoped_ptr<RTCDemuxerStream> stream_; - - bool is_acquired_; - - DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderFactoryTv); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_FACTORY_TV_H_ diff --git a/content/renderer/media/rtc_video_decoder_factory_tv_unittest.cc b/content/renderer/media/rtc_video_decoder_factory_tv_unittest.cc deleted file mode 100644 index 31b3143..0000000 --- a/content/renderer/media/rtc_video_decoder_factory_tv_unittest.cc +++ /dev/null @@ -1,348 +0,0 @@ -// Copyright 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. - -#include "base/synchronization/waitable_event.h" -#include "base/task_runner_util.h" -#include "base/threading/thread.h" -#include "content/renderer/media/rtc_video_decoder_factory_tv.h" -#include "media/base/decoder_buffer.h" -#include "media/base/video_decoder_config.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/webrtc/modules/video_coding/codecs/interface/mock/mock_video_codec_interface.h" -#include "ui/gfx/rect.h" - -using ::testing::_; -using ::testing::Return; - -namespace content { - -class RTCVideoDecoderFactoryTvTest : public ::testing::Test { - public: - RTCVideoDecoderFactoryTvTest() - : factory_(new RTCVideoDecoderFactoryTv), - decoder_(NULL), - is_demuxer_acquired_(false), - video_stream_(NULL), - size_(1280, 720), - input_image_(&data_, sizeof(data_), sizeof(data_)), - data_('a'), - read_event_(false, false), - decoder_thread_("Test decoder thread"), - decoder_thread_event_(false, false) { - memset(&codec_, 0, sizeof(codec_)); - message_loop_proxy_ = base::MessageLoopProxy::current(); - input_image_._frameType = webrtc::kKeyFrame; - input_image_._encodedWidth = size_.width(); - input_image_._encodedHeight = size_.height(); - input_image_._completeFrame = true; - decoder_thread_.Start(); - } - - virtual ~RTCVideoDecoderFactoryTvTest() { - if (is_demuxer_acquired_) { - factory_->ReleaseDemuxer(); - is_demuxer_acquired_ = false; - } - if (decoder_) { - factory_->DestroyVideoDecoder(decoder_); - decoder_ = NULL; - } - - decoder_thread_.Stop(); - } - - void ReadCallback(media::DemuxerStream::Status status, - const scoped_refptr<media::DecoderBuffer>& decoder_buffer) { - switch (status) { - case media::DemuxerStream::kOk: - EXPECT_TRUE(decoder_buffer); - break; - case media::DemuxerStream::kConfigChanged: - case media::DemuxerStream::kAborted: - EXPECT_FALSE(decoder_buffer); - break; - } - last_decoder_buffer_ = decoder_buffer; - read_event_.Signal(); - } - - void ExpectEqualsAndSignal(int32_t expected, int32_t actual) { - EXPECT_EQ(expected, actual); - decoder_thread_event_.Signal(); - } - - void ExpectNotEqualsAndSignal(int32_t unexpected, int32_t actual) { - EXPECT_NE(unexpected, actual); - decoder_thread_event_.Signal(); - } - - protected: - base::Callback<void(int32_t)> BindExpectEquals(int32_t expected) { - return base::Bind(&RTCVideoDecoderFactoryTvTest::ExpectEqualsAndSignal, - base::Unretained(this), - expected); - } - - base::Callback<void(int32_t)> BindExpectNotEquals(int32_t unexpected) { - return base::Bind(&RTCVideoDecoderFactoryTvTest::ExpectNotEqualsAndSignal, - base::Unretained(this), - unexpected); - } - - base::Callback<int32_t(void)> BindInitDecode(const webrtc::VideoCodec* codec, - int32_t num_cores) { - return base::Bind(&webrtc::VideoDecoder::InitDecode, - base::Unretained(decoder_), - codec, - num_cores); - } - - base::Callback<int32_t(void)> BindDecode( - const webrtc::EncodedImage& input_image, - bool missing_frames, - const webrtc::RTPFragmentationHeader* fragmentation, - const webrtc::CodecSpecificInfo* info, - int64_t render_time_ms) { - return base::Bind(&webrtc::VideoDecoder::Decode, - base::Unretained(decoder_), - input_image, - missing_frames, - fragmentation, - info, - render_time_ms); - } - - void CreateDecoderAndAcquireDemuxer() { - decoder_ = factory_->CreateVideoDecoder(webrtc::kVideoCodecVP8); - ASSERT_TRUE(decoder_); - ASSERT_TRUE(factory_->AcquireDemuxer()); - is_demuxer_acquired_ = true; - } - - void InitDecode() { - codec_.codecType = webrtc::kVideoCodecVP8; - codec_.width = size_.width(); - codec_.height = size_.height(); - base::PostTaskAndReplyWithResult(decoder_thread_.message_loop_proxy(), - FROM_HERE, - BindInitDecode(&codec_, 1), - BindExpectEquals(WEBRTC_VIDEO_CODEC_OK)); - decoder_thread_event_.Wait(); - base::PostTaskAndReplyWithResult( - decoder_thread_.message_loop_proxy(), - FROM_HERE, - base::Bind(&webrtc::VideoDecoder::RegisterDecodeCompleteCallback, - base::Unretained(decoder_), - &decode_complete_callback_), - BindExpectEquals(WEBRTC_VIDEO_CODEC_OK)); - decoder_thread_event_.Wait(); - } - - void GetVideoStream() { - video_stream_ = factory_->GetStream(media::DemuxerStream::VIDEO); - ASSERT_TRUE(video_stream_); - EXPECT_EQ(media::kCodecVP8, video_stream_->video_decoder_config().codec()); - EXPECT_EQ(size_, video_stream_->video_decoder_config().coded_size()); - EXPECT_EQ(gfx::Rect(size_), - video_stream_->video_decoder_config().visible_rect()); - EXPECT_EQ(size_, video_stream_->video_decoder_config().natural_size()); - } - - void PostDecodeAndWait(int32_t expected, - const webrtc::EncodedImage& input_image, - bool missing_frames, - const webrtc::RTPFragmentationHeader* fragmentation, - const webrtc::CodecSpecificInfo* info, - int64_t render_time_ms) { - base::PostTaskAndReplyWithResult( - decoder_thread_.message_loop_proxy(), - FROM_HERE, - BindDecode( - input_image, missing_frames, fragmentation, info, render_time_ms), - BindExpectEquals(expected)); - decoder_thread_event_.Wait(); - } - - RTCVideoDecoderFactoryTv* factory_; - webrtc::VideoDecoder* decoder_; - bool is_demuxer_acquired_; - base::MessageLoopProxy* message_loop_proxy_; - media::DemuxerStream* video_stream_; - webrtc::VideoCodec codec_; - gfx::Size size_; - webrtc::EncodedImage input_image_; - unsigned char data_; - webrtc::MockDecodedImageCallback decode_complete_callback_; - base::WaitableEvent read_event_; - base::Thread decoder_thread_; - base::WaitableEvent decoder_thread_event_; - scoped_refptr<media::DecoderBuffer> last_decoder_buffer_; -}; - -TEST_F(RTCVideoDecoderFactoryTvTest, CreateAndDestroyDecoder) { - // Only VP8 decoder is supported. - ASSERT_FALSE(factory_->CreateVideoDecoder(webrtc::kVideoCodecI420)); - decoder_ = factory_->CreateVideoDecoder(webrtc::kVideoCodecVP8); - ASSERT_TRUE(decoder_); - // Only one decoder at a time will be created. - ASSERT_FALSE(factory_->CreateVideoDecoder(webrtc::kVideoCodecVP8)); - factory_->DestroyVideoDecoder(decoder_); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, AcquireDemuxerAfterCreateDecoder) { - decoder_ = factory_->CreateVideoDecoder(webrtc::kVideoCodecVP8); - ASSERT_TRUE(decoder_); - ASSERT_TRUE(factory_->AcquireDemuxer()); - is_demuxer_acquired_ = true; - // Demuxer can be acquired only once. - ASSERT_FALSE(factory_->AcquireDemuxer()); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, AcquireDemuxerBeforeCreateDecoder) { - ASSERT_TRUE(factory_->AcquireDemuxer()); - is_demuxer_acquired_ = true; - decoder_ = factory_->CreateVideoDecoder(webrtc::kVideoCodecVP8); - ASSERT_TRUE(decoder_); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, InitDecodeReturnsErrorOnNonVP8Codec) { - CreateDecoderAndAcquireDemuxer(); - codec_.codecType = webrtc::kVideoCodecI420; - base::PostTaskAndReplyWithResult(decoder_thread_.message_loop_proxy(), - FROM_HERE, - BindInitDecode(&codec_, 1), - BindExpectNotEquals(WEBRTC_VIDEO_CODEC_OK)); - decoder_thread_event_.Wait(); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, InitDecodeReturnsErrorOnFeedbackMode) { - CreateDecoderAndAcquireDemuxer(); - codec_.codecType = webrtc::kVideoCodecVP8; - codec_.codecSpecific.VP8.feedbackModeOn = true; - base::PostTaskAndReplyWithResult(decoder_thread_.message_loop_proxy(), - FROM_HERE, - BindInitDecode(&codec_, 1), - BindExpectNotEquals(WEBRTC_VIDEO_CODEC_OK)); - decoder_thread_event_.Wait(); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodeReturnsErrorBeforeInitDecode) { - CreateDecoderAndAcquireDemuxer(); - PostDecodeAndWait( - WEBRTC_VIDEO_CODEC_UNINITIALIZED, input_image_, false, NULL, NULL, 0); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodeReturnsErrorOnDamagedBitstream) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - input_image_._completeFrame = false; - PostDecodeAndWait( - WEBRTC_VIDEO_CODEC_ERROR, input_image_, false, NULL, NULL, 0); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodeReturnsErrorOnMissingFrames) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - PostDecodeAndWait( - WEBRTC_VIDEO_CODEC_ERROR, input_image_, true, NULL, NULL, 0); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, GetNonVideoStreamFails) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - EXPECT_FALSE(factory_->GetStream(media::DemuxerStream::AUDIO)); - EXPECT_FALSE(factory_->GetStream(media::DemuxerStream::UNKNOWN)); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, GetVideoStreamSucceeds) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - GetVideoStream(); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodeReturnsErrorOnNonKeyFrameAtFirst) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - GetVideoStream(); - input_image_._frameType = webrtc::kDeltaFrame; - PostDecodeAndWait( - WEBRTC_VIDEO_CODEC_ERROR, input_image_, false, NULL, NULL, 0); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodeUpdatesVideoSizeOnKeyFrame) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - GetVideoStream(); - gfx::Size new_size(320, 240); - input_image_._encodedWidth = new_size.width(); - input_image_._encodedHeight = new_size.height(); - PostDecodeAndWait(WEBRTC_VIDEO_CODEC_OK, input_image_, false, NULL, NULL, 0); - EXPECT_EQ(new_size, video_stream_->video_decoder_config().coded_size()); - EXPECT_EQ(gfx::Rect(new_size), - video_stream_->video_decoder_config().visible_rect()); - EXPECT_EQ(new_size, video_stream_->video_decoder_config().natural_size()); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodeAdjustsTimestampFromZero) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - GetVideoStream(); - PostDecodeAndWait( - WEBRTC_VIDEO_CODEC_OK, input_image_, false, NULL, NULL, 10000); - video_stream_->Read(base::Bind(&RTCVideoDecoderFactoryTvTest::ReadCallback, - base::Unretained(this))); - read_event_.Wait(); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), - last_decoder_buffer_->GetTimestamp()); - PostDecodeAndWait( - WEBRTC_VIDEO_CODEC_OK, input_image_, false, NULL, NULL, 10033); - video_stream_->Read(base::Bind(&RTCVideoDecoderFactoryTvTest::ReadCallback, - base::Unretained(this))); - read_event_.Wait(); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(33), - last_decoder_buffer_->GetTimestamp()); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, DecodePassesDataCorrectly) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - GetVideoStream(); - video_stream_->Read(base::Bind(&RTCVideoDecoderFactoryTvTest::ReadCallback, - base::Unretained(this))); - PostDecodeAndWait(WEBRTC_VIDEO_CODEC_OK, input_image_, false, NULL, NULL, 0); - read_event_.Wait(); - EXPECT_EQ(static_cast<int>(sizeof(data_)), - last_decoder_buffer_->GetDataSize()); - EXPECT_EQ(data_, last_decoder_buffer_->GetData()[0]); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, NextReadTriggersDecodeCompleteCallback) { - EXPECT_CALL(decode_complete_callback_, Decoded(_)) - .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK)); - - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - GetVideoStream(); - video_stream_->Read(base::Bind(&RTCVideoDecoderFactoryTvTest::ReadCallback, - base::Unretained(this))); - PostDecodeAndWait(WEBRTC_VIDEO_CODEC_OK, input_image_, false, NULL, NULL, 0); - read_event_.Wait(); - video_stream_->Read(base::Bind(&RTCVideoDecoderFactoryTvTest::ReadCallback, - base::Unretained(this))); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, ResetReturnsOk) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Reset()); -} - -TEST_F(RTCVideoDecoderFactoryTvTest, ReleaseReturnsOk) { - CreateDecoderAndAcquireDemuxer(); - InitDecode(); - EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Release()); -} - -} // content diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 5485e88..bfc7e99a 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -223,11 +223,6 @@ #include "third_party/WebKit/public/web/WebHitTestResult.h" #include "ui/gfx/rect_f.h" -#if defined(GOOGLE_TV) -#include "content/renderer/media/rtc_video_decoder_bridge_tv.h" -#include "content/renderer/media/rtc_video_decoder_factory_tv.h" -#endif - #elif defined(OS_WIN) // TODO(port): these files are currently Windows only because they concern: // * theming @@ -5889,7 +5884,6 @@ WebMediaPlayer* RenderViewImpl::CreateWebMediaPlayerForMediaStream( LOG(ERROR) << "Failed to initialize MediaStreamClient"; return NULL; } -#if !defined(GOOGLE_TV) if (media_stream_client_->IsMediaStream(url)) { #if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) bool found_neon = @@ -5899,7 +5893,6 @@ WebMediaPlayer* RenderViewImpl::CreateWebMediaPlayerForMediaStream( return new WebMediaPlayerMS(frame, client, AsWeakPtr(), media_stream_client_, new RenderMediaLog()); } -#endif // !defined(GOOGLE_TV) #endif // defined(ENABLE_WEBRTC) return NULL; } @@ -5997,33 +5990,14 @@ WebMediaPlayer* RenderViewImpl::CreateAndroidWebMediaPlayer( context_provider, gpu_channel_host, routing_id_)); } - scoped_ptr<WebMediaPlayerAndroid> web_media_player_android( - new WebMediaPlayerAndroid( + return new WebMediaPlayerAndroid( frame, client, AsWeakPtr(), media_player_manager_, stream_texture_factory.release(), RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), - new RenderMediaLog())); -#if defined(ENABLE_WEBRTC) && defined(GOOGLE_TV) - if (media_stream_client_ && media_stream_client_->IsMediaStream(url)) { - RTCVideoDecoderFactoryTv* factory = RenderThreadImpl::current() - ->GetMediaStreamDependencyFactory()->decoder_factory_tv(); - // |media_stream_client| and |factory| outlives |web_media_player_android|. - if (!factory->AcquireDemuxer() || - !web_media_player_android->InjectMediaStream( - media_stream_client_, - factory, - base::Bind( - base::IgnoreResult(&RTCVideoDecoderFactoryTv::ReleaseDemuxer), - base::Unretained(factory)))) { - LOG(ERROR) << "Failed to inject media stream."; - return NULL; - } - } -#endif // defined(ENABLE_WEBRTC) && defined(GOOGLE_TV) - return web_media_player_android.release(); + new RenderMediaLog()); } #endif // defined(OS_ANDROID) |