summaryrefslogtreecommitdiffstats
path: root/webkit/media
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-22 04:03:38 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-22 04:03:38 +0000
commitf5443ef7d206262bdac14b1f7d26d7dc2e753f35 (patch)
tree23b8fe828dbd77859b33d2049e33125027871e4b /webkit/media
parent1f1057f9b20647adae5807c8bde06cef40cd9e42 (diff)
downloadchromium_src-f5443ef7d206262bdac14b1f7d26d7dc2e753f35.zip
chromium_src-f5443ef7d206262bdac14b1f7d26d7dc2e753f35.tar.gz
chromium_src-f5443ef7d206262bdac14b1f7d26d7dc2e753f35.tar.bz2
Remove reference counting from media::Demuxer and friends.
In addition: * Pipeline no longer owns the demuxer; clients are required to own it and keep it alive until Pipeline::Stop() completes. BUG=173313 Review URL: https://codereview.chromium.org/13813016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195437 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/media')
-rw-r--r--webkit/media/webmediaplayer_impl.cc188
-rw-r--r--webkit/media/webmediaplayer_impl.h15
-rw-r--r--webkit/media/webmediasourceclient_impl.cc3
-rw-r--r--webkit/media/webmediasourceclient_impl.h7
-rw-r--r--webkit/media/websourcebuffer_impl.cc2
-rw-r--r--webkit/media/websourcebuffer_impl.h8
6 files changed, 113 insertions, 110 deletions
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
index 20d3678..7917b66 100644
--- a/webkit/media/webmediaplayer_impl.cc
+++ b/webkit/media/webmediaplayer_impl.cc
@@ -153,6 +153,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
is_local_source_(false),
supports_save_(true),
starting_(false),
+ chunk_demuxer_(NULL),
pending_repaint_(false),
video_frame_provider_client_(NULL) {
media_log_->AddEvent(
@@ -266,18 +267,11 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) {
void WebMediaPlayerImpl::load(const WebKit::WebURL& url,
WebKit::WebMediaSource* media_source,
CORSMode cors_mode) {
- scoped_ptr<WebKit::WebMediaSource> ms(media_source);
LoadSetup(url);
// Media source pipelines can start immediately.
- chunk_demuxer_ = new media::ChunkDemuxer(
- BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened,
- base::Passed(&ms)),
- BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""),
- base::Bind(&LogMediaSourceError, media_log_));
-
supports_save_ = false;
- StartPipeline();
+ StartPipeline(media_source);
}
void WebMediaPlayerImpl::LoadSetup(const WebKit::WebURL& url) {
@@ -1122,7 +1116,7 @@ void WebMediaPlayerImpl::DataSourceInitialized(const GURL& gurl, bool success) {
return;
}
- StartPipeline();
+ StartPipeline(NULL);
}
void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) {
@@ -1136,10 +1130,97 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) {
"is_downloading_data", is_downloading));
}
-void WebMediaPlayerImpl::StartPipeline() {
+void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
+ const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
+
+
+ // Figure out which demuxer to use.
+ if (!media_source) {
+ DCHECK(!chunk_demuxer_);
+ DCHECK(data_source_);
+
+ demuxer_.reset(new media::FFmpegDemuxer(
+ media_thread_.message_loop_proxy(), data_source_,
+ BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")));
+ } else {
+ DCHECK(!chunk_demuxer_);
+ DCHECK(!data_source_);
+
+ scoped_ptr<WebKit::WebMediaSource> ms(media_source);
+ chunk_demuxer_ = new media::ChunkDemuxer(
+ BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened,
+ base::Passed(&ms)),
+ BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""),
+ base::Bind(&LogMediaSourceError, media_log_));
+ demuxer_.reset(chunk_demuxer_);
+
+ // Disable GpuVideoDecoder creation until it supports codec config changes.
+ // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed.
+ gpu_factories_ = NULL;
+ }
+
+ scoped_ptr<media::FilterCollection> filter_collection(
+ new media::FilterCollection());
+ filter_collection->SetDemuxer(demuxer_.get());
+
+ // Figure out if EME is enabled.
+ media::SetDecryptorReadyCB set_decryptor_ready_cb;
+ if (decryptor_) {
+ set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB,
+ base::Unretained(decryptor_.get()));
+ }
+
+ // Create our audio decoders and renderer.
+ ScopedVector<media::AudioDecoder> audio_decoders;
+ 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_thread_.message_loop_proxy()));
+ }
+
+ scoped_ptr<media::AudioRenderer> audio_renderer(
+ new media::AudioRendererImpl(media_thread_.message_loop_proxy(),
+ audio_source_provider_,
+ audio_decoders.Pass(),
+ set_decryptor_ready_cb));
+ filter_collection->SetAudioRenderer(audio_renderer.Pass());
+
+ // Create our video decoders and renderer.
+ ScopedVector<media::VideoDecoder> video_decoders;
+
+ if (gpu_factories_) {
+ video_decoders.push_back(new media::GpuVideoDecoder(
+ media_thread_.message_loop_proxy(), gpu_factories_));
+ }
+
+ // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released
+ // (http://crbug.com/174287) .
+#if !defined(MEDIA_DISABLE_LIBVPX)
+ if (cmd_line->HasSwitch(switches::kEnableVp9Playback) ||
+ cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) {
+ 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_thread_.message_loop_proxy()));
+
+ scoped_ptr<media::VideoRenderer> video_renderer(
+ new media::VideoRendererBase(
+ media_thread_.message_loop_proxy(),
+ video_decoders.Pass(),
+ set_decryptor_ready_cb,
+ base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)),
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque),
+ true));
+ filter_collection->SetVideoRenderer(video_renderer.Pass());
+
+ // ... and we're ready to go!
starting_ = true;
pipeline_->Start(
- BuildFilterCollection(),
+ filter_collection.Pass(),
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded),
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError),
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek),
@@ -1175,8 +1256,10 @@ void WebMediaPlayerImpl::Destroy() {
// Abort any pending IO so stopping the pipeline doesn't get blocked.
if (data_source_)
data_source_->Abort();
- if (chunk_demuxer_)
+ if (chunk_demuxer_) {
chunk_demuxer_->Shutdown();
+ chunk_demuxer_ = NULL;
+ }
if (gpu_factories_) {
gpu_factories_->Abort();
@@ -1200,7 +1283,7 @@ void WebMediaPlayerImpl::Destroy() {
// Release any final references now that everything has stopped.
data_source_ = NULL;
- chunk_demuxer_ = NULL;
+ demuxer_.reset();
}
WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
@@ -1250,83 +1333,4 @@ void WebMediaPlayerImpl::FrameReady(
&WebMediaPlayerImpl::Repaint, AsWeakPtr()));
}
-scoped_ptr<media::FilterCollection>
-WebMediaPlayerImpl::BuildFilterCollection() {
- const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
-
- scoped_ptr<media::FilterCollection> filter_collection(
- new media::FilterCollection());
-
- // Figure out which demuxer to use.
- if (data_source_) {
- DCHECK(!chunk_demuxer_);
- filter_collection->SetDemuxer(new media::FFmpegDemuxer(
- media_thread_.message_loop_proxy(), data_source_,
- BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")));
- } else {
- DCHECK(chunk_demuxer_);
- filter_collection->SetDemuxer(chunk_demuxer_);
-
- // Disable GpuVideoDecoder creation until it supports codec config changes.
- // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed.
- gpu_factories_ = NULL;
- }
-
- // Figure out if EME is enabled.
- media::SetDecryptorReadyCB set_decryptor_ready_cb;
- if (decryptor_) {
- set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB,
- base::Unretained(decryptor_.get()));
- }
-
- // Create our audio decoders and renderer.
- ScopedVector<media::AudioDecoder> audio_decoders;
- 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_thread_.message_loop_proxy()));
- }
-
- scoped_ptr<media::AudioRenderer> audio_renderer(
- new media::AudioRendererImpl(media_thread_.message_loop_proxy(),
- audio_source_provider_,
- audio_decoders.Pass(),
- set_decryptor_ready_cb));
- filter_collection->SetAudioRenderer(audio_renderer.Pass());
-
- // Create our video decoders and renderer.
- ScopedVector<media::VideoDecoder> video_decoders;
-
- if (gpu_factories_) {
- video_decoders.push_back(new media::GpuVideoDecoder(
- media_thread_.message_loop_proxy(), gpu_factories_));
- }
-
- // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released
- // (http://crbug.com/174287) .
-#if !defined(MEDIA_DISABLE_LIBVPX)
- if (cmd_line->HasSwitch(switches::kEnableVp9Playback) ||
- cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) {
- 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_thread_.message_loop_proxy()));
-
- scoped_ptr<media::VideoRenderer> video_renderer(
- new media::VideoRendererBase(
- media_thread_.message_loop_proxy(),
- video_decoders.Pass(),
- set_decryptor_ready_cb,
- base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)),
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque),
- true));
- filter_collection->SetVideoRenderer(video_renderer.Pass());
-
- return filter_collection.Pass();
-}
-
} // namespace webkit_media
diff --git a/webkit/media/webmediaplayer_impl.h b/webkit/media/webmediaplayer_impl.h
index 46f9985..6b7cd33 100644
--- a/webkit/media/webmediaplayer_impl.h
+++ b/webkit/media/webmediaplayer_impl.h
@@ -53,6 +53,7 @@ class MessageLoopProxy;
namespace media {
class ChunkDemuxer;
+class FFmpegDemuxer;
class MediaLog;
}
@@ -230,7 +231,9 @@ class WebMediaPlayerImpl
void NotifyDownloading(bool is_downloading);
// Finishes starting the pipeline due to a call to load().
- void StartPipeline();
+ //
+ // A non-null |media_source| will construct a Media Source pipeline.
+ void StartPipeline(WebKit::WebMediaSource* media_source);
// Helpers that set the network/ready state and notifies the client if
// they've changed.
@@ -272,10 +275,6 @@ class WebMediaPlayerImpl
// painted.
void FrameReady(const scoped_refptr<media::VideoFrame>& frame);
- // Builds a FilterCollection based on the current configuration of
- // WebMediaPlayerImpl.
- scoped_ptr<media::FilterCollection> BuildFilterCollection();
-
WebKit::WebFrame* frame_;
// TODO(hclam): get rid of these members and read from the pipeline directly.
@@ -349,8 +348,12 @@ class WebMediaPlayerImpl
// These two are mutually exclusive:
// |data_source_| is used for regular resource loads.
// |chunk_demuxer_| is used for Media Source resource loads.
+ //
+ // |demuxer_| will contain the appropriate demuxer based on which resource
+ // load strategy we're using.
scoped_refptr<BufferedDataSource> data_source_;
- scoped_refptr<media::ChunkDemuxer> chunk_demuxer_;
+ scoped_ptr<media::Demuxer> demuxer_;
+ media::ChunkDemuxer* chunk_demuxer_;
// Temporary for EME v0.1. In the future the init data type should be passed
// through GenerateKeyRequest() directly from WebKit.
diff --git a/webkit/media/webmediasourceclient_impl.cc b/webkit/media/webmediasourceclient_impl.cc
index 204f0d0..3eb36f4 100644
--- a/webkit/media/webmediasourceclient_impl.cc
+++ b/webkit/media/webmediasourceclient_impl.cc
@@ -25,8 +25,7 @@ COMPILE_ASSERT_MATCHING_STATUS_ENUM(AddStatusReachedIdLimit, kReachedIdLimit);
#undef COMPILE_ASSERT_MATCHING_STATUS_ENUM
WebMediaSourceClientImpl::WebMediaSourceClientImpl(
- const scoped_refptr<media::ChunkDemuxer>& demuxer,
- media::LogCB log_cb)
+ media::ChunkDemuxer* demuxer, media::LogCB log_cb)
: demuxer_(demuxer),
log_cb_(log_cb) {
DCHECK(demuxer_);
diff --git a/webkit/media/webmediasourceclient_impl.h b/webkit/media/webmediasourceclient_impl.h
index 1aa0f6e..3dad1dc 100644
--- a/webkit/media/webmediasourceclient_impl.h
+++ b/webkit/media/webmediasourceclient_impl.h
@@ -8,7 +8,6 @@
#include <string>
#include <vector>
-#include "base/memory/ref_counted.h"
#include "media/base/media_log.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaSourceClient.h"
@@ -20,9 +19,7 @@ namespace webkit_media {
class WebMediaSourceClientImpl : public WebKit::WebMediaSourceClient {
public:
- explicit WebMediaSourceClientImpl(
- const scoped_refptr<media::ChunkDemuxer>& demuxer,
- media::LogCB log_cb);
+ WebMediaSourceClientImpl(media::ChunkDemuxer* demuxer, media::LogCB log_cb);
virtual ~WebMediaSourceClientImpl();
// WebKit::WebMediaSourceClient implementation.
@@ -35,7 +32,7 @@ class WebMediaSourceClientImpl : public WebKit::WebMediaSourceClient {
virtual void endOfStream(EndOfStreamStatus status) OVERRIDE;
private:
- scoped_refptr<media::ChunkDemuxer> demuxer_;
+ media::ChunkDemuxer* demuxer_; // Owned by WebMediaPlayerImpl.
media::LogCB log_cb_;
DISALLOW_COPY_AND_ASSIGN(WebMediaSourceClientImpl);
diff --git a/webkit/media/websourcebuffer_impl.cc b/webkit/media/websourcebuffer_impl.cc
index de03e5a..5e1bf0b 100644
--- a/webkit/media/websourcebuffer_impl.cc
+++ b/webkit/media/websourcebuffer_impl.cc
@@ -9,7 +9,7 @@
namespace webkit_media {
WebSourceBufferImpl::WebSourceBufferImpl(
- const std::string& id, scoped_refptr<media::ChunkDemuxer> demuxer)
+ const std::string& id, media::ChunkDemuxer* demuxer)
: id_(id),
demuxer_(demuxer) {
DCHECK(demuxer_);
diff --git a/webkit/media/websourcebuffer_impl.h b/webkit/media/websourcebuffer_impl.h
index e4718f3..6d8bd85 100644
--- a/webkit/media/websourcebuffer_impl.h
+++ b/webkit/media/websourcebuffer_impl.h
@@ -7,7 +7,8 @@
#include <string>
-#include "base/memory/ref_counted.h"
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSourceBuffer.h"
namespace media {
@@ -18,8 +19,7 @@ namespace webkit_media {
class WebSourceBufferImpl : public WebKit::WebSourceBuffer {
public:
- WebSourceBufferImpl(const std::string& id,
- scoped_refptr<media::ChunkDemuxer> demuxer);
+ WebSourceBufferImpl(const std::string& id, media::ChunkDemuxer* demuxer);
virtual ~WebSourceBufferImpl();
// WebKit::WebSourceBuffer implementation.
@@ -31,7 +31,7 @@ class WebSourceBufferImpl : public WebKit::WebSourceBuffer {
private:
std::string id_;
- scoped_refptr<media::ChunkDemuxer> demuxer_;
+ media::ChunkDemuxer* demuxer_; // Owned by WebMediaPlayerImpl.
DISALLOW_COPY_AND_ASSIGN(WebSourceBufferImpl);
};