summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 20:52:24 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 20:52:24 +0000
commitf9ac67759c31da2ed8e1d8e2e2295908451a63c5 (patch)
tree9dca6a587d45283c2776dc2827fa967fe535518c
parent39407f7216e7a09375776be3e074549094a8adf2 (diff)
downloadchromium_src-f9ac67759c31da2ed8e1d8e2e2295908451a63c5.zip
chromium_src-f9ac67759c31da2ed8e1d8e2e2295908451a63c5.tar.gz
chromium_src-f9ac67759c31da2ed8e1d8e2e2295908451a63c5.tar.bz2
Revert 203429 "Reland: Use a shared thread for media operations."
> Reland: Use a shared thread for media operations. > > This reduces the number of threads created per media element by one. > > BUG=61293 > TBR=acolwell, jamesr, jochen > > Review URL: https://codereview.chromium.org/15649017 It's still causing some memory corruption. TBR=scherkus@chromium.org Review URL: https://codereview.chromium.org/16266006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203470 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/public/test/layouttest_support.h11
-rw-r--r--content/renderer/render_thread_impl.cc10
-rw-r--r--content/renderer/render_thread_impl.h8
-rw-r--r--content/renderer/render_view_impl.cc1
-rw-r--r--content/shell/renderer/DEPS3
-rw-r--r--content/shell/renderer/webkit_test_runner.cc29
-rw-r--r--content/test/layouttest_support.cc4
-rw-r--r--webkit/mocks/test_media_stream_client.cc30
-rw-r--r--webkit/mocks/test_media_stream_client.h14
-rw-r--r--webkit/renderer/media/webmediaplayer_impl.cc30
-rw-r--r--webkit/renderer/media/webmediaplayer_impl.h2
-rw-r--r--webkit/renderer/media/webmediaplayer_params.cc6
-rw-r--r--webkit/renderer/media/webmediaplayer_params.h13
-rw-r--r--webkit/support/webkit_support.cc11
14 files changed, 68 insertions, 104 deletions
diff --git a/content/public/test/layouttest_support.h b/content/public/test/layouttest_support.h
index 21a34503..ed490ec 100644
--- a/content/public/test/layouttest_support.h
+++ b/content/public/test/layouttest_support.h
@@ -6,7 +6,6 @@
#define CONTENT_PUBLIC_TEST_LAYOUTTEST_SUPPORT_H_
#include "base/callback_forward.h"
-#include "base/memory/ref_counted.h"
namespace WebKit {
class WebGamepads;
@@ -17,10 +16,6 @@ namespace WebTestRunner {
class WebTestProxyBase;
}
-namespace base {
-class MessageLoopProxy;
-}
-
namespace content {
class RenderView;
@@ -69,12 +64,6 @@ void EnableAutoResizeMode(RenderView* render_view,
void DisableAutoResizeMode(RenderView* render_view,
const WebKit::WebSize& new_size);
-// Return the thread on which media operations should run.
-//
-// TODO(scherkus): We should be using RenderViewImpl::createMediaPlayer(), see
-// http://crbug.com/239826
-scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy();
-
} // namespace content
#endif // CONTENT_PUBLIC_TEST_LAYOUTTEST_SUPPORT_H_
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index b83ec91..386e442 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -1329,16 +1329,6 @@ RenderThreadImpl::GetFileThreadMessageLoopProxy() {
return file_thread_->message_loop_proxy();
}
-scoped_refptr<base::MessageLoopProxy>
-RenderThreadImpl::GetMediaThreadMessageLoopProxy() {
- DCHECK(message_loop() == MessageLoop::current());
- if (!media_thread_) {
- media_thread_.reset(new base::Thread("Media"));
- media_thread_->Start();
- }
- return media_thread_->message_loop_proxy();
-}
-
void RenderThreadImpl::SetFlingCurveParameters(
const std::vector<float>& new_touchpad,
const std::vector<float>& new_touchscreen) {
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index abdc4d6..a7d615b 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -263,11 +263,6 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread,
// on the renderer's main thread.
scoped_refptr<base::MessageLoopProxy> GetFileThreadMessageLoopProxy();
- // Returns a MessageLoopProxy instance corresponding to the message loop
- // of the thread on which media operations should be run. Must be called
- // on the renderer's main thread.
- scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy();
-
// Causes the idle handler to skip sending idle notifications
// on the two next scheduled calls, so idle notifications are
// not sent for at least one notification delay.
@@ -438,9 +433,6 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread,
// May be null if overridden by ContentRendererClient.
scoped_ptr<base::Thread> compositor_thread_;
- // Thread for running multimedia operations (e.g., video decoding).
- scoped_ptr<base::Thread> media_thread_;
-
// Will point to appropriate MessageLoopProxy after initialization,
// regardless of whether |compositor_thread_| is overriden.
scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy_;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index a51c5a2..2a8fc58 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -2837,7 +2837,6 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer(
}
webkit_media::WebMediaPlayerParams params(
- RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(),
sink, gpu_factories, new RenderMediaLog());
WebMediaPlayer* media_player =
GetContentClient()->renderer()->OverrideCreateWebMediaPlayer(
diff --git a/content/shell/renderer/DEPS b/content/shell/renderer/DEPS
deleted file mode 100644
index 47de12f..0000000
--- a/content/shell/renderer/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
- "+media/base", # For media::MediaLog.
-]
diff --git a/content/shell/renderer/webkit_test_runner.cc b/content/shell/renderer/webkit_test_runner.cc
index 707440d..aa98a2d 100644
--- a/content/shell/renderer/webkit_test_runner.cc
+++ b/content/shell/renderer/webkit_test_runner.cc
@@ -25,7 +25,6 @@
#include "content/shell/common/shell_messages.h"
#include "content/shell/common/webkit_test_helpers.h"
#include "content/shell/renderer/shell_render_process_observer.h"
-#include "media/base/media_log.h"
#include "net/base/net_errors.h"
#include "net/base/net_util.h"
#include "skia/ext/platform_canvas.h"
@@ -61,9 +60,6 @@
#include "webkit/common/webpreferences.h"
#include "webkit/glue/webkit_glue.h"
#include "webkit/mocks/test_media_stream_client.h"
-#include "webkit/renderer/media/webmediaplayer_impl.h"
-#include "webkit/renderer/media/webmediaplayer_ms.h"
-#include "webkit/renderer/media/webmediaplayer_params.h"
using WebKit::Platform;
using WebKit::WebArrayBufferView;
@@ -539,29 +535,8 @@ WebMediaPlayer* WebKitTestRunner::createWebMediaPlayer(
test_media_stream_client_.reset(
new webkit_glue::TestMediaStreamClient());
}
-
- if (test_media_stream_client_->IsMediaStream(url)) {
- return new webkit_media::WebMediaPlayerMS(
- frame,
- client,
- base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(),
- test_media_stream_client_.get(),
- new media::MediaLog());
- }
-
-#if defined(OS_ANDROID)
- return NULL;
-#else
- // TODO(scherkus): Use RenderViewImpl::createMediaPlayer() instead of
- // duplicating code here, see http://crbug.com/239826
- webkit_media::WebMediaPlayerParams params(
- GetMediaThreadMessageLoopProxy(), NULL, NULL, new media::MediaLog());
- return new webkit_media::WebMediaPlayerImpl(
- frame,
- client,
- base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(),
- params);
-#endif
+ return webkit_glue::CreateMediaPlayer(
+ frame, url, client, test_media_stream_client_.get());
}
// RenderViewObserver --------------------------------------------------------
diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc
index 15251ed..100ce3d 100644
--- a/content/test/layouttest_support.cc
+++ b/content/test/layouttest_support.cc
@@ -111,8 +111,4 @@ void DisableAutoResizeMode(RenderView* render_view, const WebSize& new_size) {
->DisableAutoResizeForTesting(new_size);
}
-scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy() {
- return RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy();
-}
-
} // namespace content
diff --git a/webkit/mocks/test_media_stream_client.cc b/webkit/mocks/test_media_stream_client.cc
index 3065612..632f6b39 100644
--- a/webkit/mocks/test_media_stream_client.cc
+++ b/webkit/mocks/test_media_stream_client.cc
@@ -13,6 +13,9 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaStreamRegistry.h"
#include "webkit/renderer/media/media_stream_audio_renderer.h"
#include "webkit/renderer/media/simple_video_frame_provider.h"
+#include "webkit/renderer/media/webmediaplayer_impl.h"
+#include "webkit/renderer/media/webmediaplayer_ms.h"
+#include "webkit/renderer/media/webmediaplayer_params.h"
using namespace WebKit;
@@ -40,6 +43,33 @@ bool IsMockMediaStreamWithVideo(const WebURL& url) {
namespace webkit_glue {
+WebKit::WebMediaPlayer* CreateMediaPlayer(
+ WebFrame* frame,
+ const WebURL& url,
+ WebMediaPlayerClient* client,
+ webkit_media::MediaStreamClient* media_stream_client) {
+ if (media_stream_client && media_stream_client->IsMediaStream(url)) {
+ return new webkit_media::WebMediaPlayerMS(
+ frame,
+ client,
+ base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(),
+ media_stream_client,
+ new media::MediaLog());
+ }
+
+#if defined(OS_ANDROID)
+ return NULL;
+#else
+ webkit_media::WebMediaPlayerParams params(
+ NULL, NULL, new media::MediaLog());
+ return new webkit_media::WebMediaPlayerImpl(
+ frame,
+ client,
+ base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(),
+ params);
+#endif
+}
+
TestMediaStreamClient::TestMediaStreamClient() {}
TestMediaStreamClient::~TestMediaStreamClient() {}
diff --git a/webkit/mocks/test_media_stream_client.h b/webkit/mocks/test_media_stream_client.h
index 60fa4aa..b759f49 100644
--- a/webkit/mocks/test_media_stream_client.h
+++ b/webkit/mocks/test_media_stream_client.h
@@ -13,12 +13,26 @@
#include "third_party/WebKit/public/platform/WebURL.h"
#include "webkit/renderer/media/media_stream_client.h"
+namespace WebKit {
+class WebFrame;
+class WebMediaPlayer;
+class WebMediaPlayerClient;
+}
+
namespace webkit_media {
class MediaStreamAudioRenderer;
+class MediaStreamClient;
}
namespace webkit_glue {
+// This is used by WebFrameClient::createMediaPlayer().
+WebKit::WebMediaPlayer* CreateMediaPlayer(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURL& url,
+ WebKit::WebMediaPlayerClient* client,
+ webkit_media::MediaStreamClient* media_stream_client);
+
class TestMediaStreamClient : public webkit_media::MediaStreamClient {
public:
TestMediaStreamClient();
diff --git a/webkit/renderer/media/webmediaplayer_impl.cc b/webkit/renderer/media/webmediaplayer_impl.cc
index 2f06d8a..d277105 100644
--- a/webkit/renderer/media/webmediaplayer_impl.cc
+++ b/webkit/renderer/media/webmediaplayer_impl.cc
@@ -130,7 +130,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
network_state_(WebMediaPlayer::NetworkStateEmpty),
ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
main_loop_(base::MessageLoopProxy::current()),
- media_loop_(params.message_loop_proxy()),
+ media_thread_("MediaPipeline"),
paused_(true),
seeking_(false),
playback_rate_(0.0f),
@@ -153,7 +153,9 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
media_log_->AddEvent(
media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
- pipeline_.reset(new media::Pipeline(media_loop_, media_log_));
+ CHECK(media_thread_.Start());
+ pipeline_.reset(new media::Pipeline(
+ media_thread_.message_loop_proxy(), media_log_));
// Let V8 know we started new thread if we did not do it yet.
// Made separate task to avoid deletion of player currently being created.
@@ -182,7 +184,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
// Use the null sink if no sink was provided.
audio_source_provider_ = new WebAudioSourceProviderImpl(
params.audio_renderer_sink() ? params.audio_renderer_sink() :
- new media::NullAudioSink(media_loop_));
+ new media::NullAudioSink(media_thread_.message_loop_proxy()));
}
WebMediaPlayerImpl::~WebMediaPlayerImpl() {
@@ -1053,7 +1055,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
DCHECK(data_source_);
demuxer_.reset(new media::FFmpegDemuxer(
- media_loop_, data_source_.get(),
+ media_thread_.message_loop_proxy(), data_source_.get(),
BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")));
} else {
DCHECK(!chunk_demuxer_);
@@ -1086,13 +1088,15 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
// Create our audio decoders and renderer.
ScopedVector<media::AudioDecoder> audio_decoders;
- audio_decoders.push_back(new media::FFmpegAudioDecoder(media_loop_));
+ audio_decoders.push_back(new media::FFmpegAudioDecoder(
+ media_thread_.message_loop_proxy()));
if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) {
- audio_decoders.push_back(new media::OpusAudioDecoder(media_loop_));
+ audio_decoders.push_back(new media::OpusAudioDecoder(
+ media_thread_.message_loop_proxy()));
}
scoped_ptr<media::AudioRenderer> audio_renderer(
- new media::AudioRendererImpl(media_loop_,
+ new media::AudioRendererImpl(media_thread_.message_loop_proxy(),
audio_source_provider_,
audio_decoders.Pass(),
set_decryptor_ready_cb));
@@ -1103,7 +1107,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
if (gpu_factories_) {
video_decoders.push_back(new media::GpuVideoDecoder(
- media_loop_, gpu_factories_));
+ media_thread_.message_loop_proxy(), gpu_factories_));
}
// TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released
@@ -1111,15 +1115,17 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
#if !defined(MEDIA_DISABLE_LIBVPX)
if (cmd_line->HasSwitch(switches::kEnableVp9Playback) ||
cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) {
- video_decoders.push_back(new media::VpxVideoDecoder(media_loop_));
+ video_decoders.push_back(new media::VpxVideoDecoder(
+ media_thread_.message_loop_proxy()));
}
#endif // !defined(MEDIA_DISABLE_LIBVPX)
- video_decoders.push_back(new media::FFmpegVideoDecoder(media_loop_));
+ video_decoders.push_back(new media::FFmpegVideoDecoder(
+ media_thread_.message_loop_proxy()));
scoped_ptr<media::VideoRenderer> video_renderer(
new media::VideoRendererBase(
- media_loop_,
+ media_thread_.message_loop_proxy(),
video_decoders.Pass(),
set_decryptor_ready_cb,
base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)),
@@ -1189,6 +1195,8 @@ void WebMediaPlayerImpl::Destroy() {
incremented_externally_allocated_memory_ = false;
}
+ media_thread_.Stop();
+
// Release any final references now that everything has stopped.
pipeline_.reset();
demuxer_.reset();
diff --git a/webkit/renderer/media/webmediaplayer_impl.h b/webkit/renderer/media/webmediaplayer_impl.h
index 0049369..04c0fb4 100644
--- a/webkit/renderer/media/webmediaplayer_impl.h
+++ b/webkit/renderer/media/webmediaplayer_impl.h
@@ -287,7 +287,7 @@ class WebMediaPlayerImpl
const scoped_refptr<base::MessageLoopProxy> main_loop_;
scoped_ptr<media::Pipeline> pipeline_;
- scoped_refptr<base::MessageLoopProxy> media_loop_;
+ base::Thread media_thread_;
// The currently selected key system. Empty string means that no key system
// has been selected.
diff --git a/webkit/renderer/media/webmediaplayer_params.cc b/webkit/renderer/media/webmediaplayer_params.cc
index 3592494..d33c12b 100644
--- a/webkit/renderer/media/webmediaplayer_params.cc
+++ b/webkit/renderer/media/webmediaplayer_params.cc
@@ -4,22 +4,18 @@
#include "webkit/renderer/media/webmediaplayer_params.h"
-#include "base/message_loop_proxy.h"
#include "media/base/audio_renderer_sink.h"
#include "media/base/media_log.h"
namespace webkit_media {
WebMediaPlayerParams::WebMediaPlayerParams(
- const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink,
const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories,
const scoped_refptr<media::MediaLog>& media_log)
- : message_loop_proxy_(message_loop_proxy),
- audio_renderer_sink_(audio_renderer_sink),
+ : audio_renderer_sink_(audio_renderer_sink),
gpu_factories_(gpu_factories),
media_log_(media_log) {
- DCHECK(message_loop_proxy);
DCHECK(media_log_);
}
diff --git a/webkit/renderer/media/webmediaplayer_params.h b/webkit/renderer/media/webmediaplayer_params.h
index 62a5ce1..893cae7 100644
--- a/webkit/renderer/media/webmediaplayer_params.h
+++ b/webkit/renderer/media/webmediaplayer_params.h
@@ -8,10 +8,6 @@
#include "base/memory/ref_counted.h"
#include "media/filters/gpu_video_decoder.h"
-namespace base {
-class MessageLoopProxy;
-}
-
namespace media {
class AudioRendererSink;
class MediaLog;
@@ -23,19 +19,13 @@ namespace webkit_media {
// to plumb arguments through various abstraction layers.
class WebMediaPlayerParams {
public:
- // |message_loop_proxy| and |media_log| are the only required parameters;
- // all others may be null.
+ // |media_log| is the only required parameter; all others may be null.
WebMediaPlayerParams(
- const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink,
const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories,
const scoped_refptr<media::MediaLog>& media_log);
~WebMediaPlayerParams();
- const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy() const {
- return message_loop_proxy_;
- }
-
const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink() const {
return audio_renderer_sink_;
}
@@ -50,7 +40,6 @@ class WebMediaPlayerParams {
}
private:
- scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
scoped_refptr<media::AudioRendererSink> audio_renderer_sink_;
scoped_refptr<media::GpuVideoDecoder::Factories> gpu_factories_;
scoped_refptr<media::MediaLog> media_log_;
diff --git a/webkit/support/webkit_support.cc b/webkit/support/webkit_support.cc
index 7be38f7..059586c 100644
--- a/webkit/support/webkit_support.cc
+++ b/webkit/support/webkit_support.cc
@@ -210,14 +210,6 @@ class TestEnvironment {
}
#endif
- scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy() {
- if (!media_thread_) {
- media_thread_.reset(new base::Thread("Media"));
- CHECK(media_thread_->Start());
- }
- return media_thread_->message_loop_proxy();
- }
-
private:
// Data member at_exit_manager_ will take the ownership of the input
// AtExitManager and manage its lifecycle.
@@ -226,8 +218,6 @@ class TestEnvironment {
scoped_ptr<TestWebKitPlatformSupport> webkit_platform_support_;
scoped_ptr<TestWebIDBFactory> idb_factory_;
- scoped_ptr<base::Thread> media_thread_;
-
#if defined(OS_ANDROID)
base::FilePath mock_current_directory_;
#endif
@@ -419,7 +409,6 @@ WebKit::WebMediaPlayer* CreateMediaPlayer(
return NULL;
#else
webkit_media::WebMediaPlayerParams params(
- test_environment->GetMediaThreadMessageLoopProxy(),
NULL, NULL, new media::MediaLog());
return new webkit_media::WebMediaPlayerImpl(
frame,