summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/filters/ffmpeg_video_decoder.cc10
-rw-r--r--media/filters/ffmpeg_video_decoder.h7
-rw-r--r--media/filters/ffmpeg_video_decoder_unittest.cc7
-rw-r--r--media/filters/pipeline_integration_test.cc8
-rw-r--r--media/filters/pipeline_integration_test_base.cc18
-rw-r--r--media/filters/pipeline_integration_test_base.h8
-rw-r--r--media/tools/player_wtl/movie.cc3
-rw-r--r--media/tools/player_x11/player_x11.cc3
-rw-r--r--webkit/media/filter_helpers.cc27
-rw-r--r--webkit/media/filter_helpers.h6
-rw-r--r--webkit/media/webmediaplayer_impl.cc9
-rw-r--r--webkit/media/webmediaplayer_proxy.cc1
-rw-r--r--webkit/media/webmediaplayer_proxy.h6
13 files changed, 47 insertions, 66 deletions
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
index ba0fd8d..823bdd1 100644
--- a/media/filters/ffmpeg_video_decoder.cc
+++ b/media/filters/ffmpeg_video_decoder.cc
@@ -54,13 +54,14 @@ static int GetThreadCount(CodecID codec_id) {
}
FFmpegVideoDecoder::FFmpegVideoDecoder(
- const base::Callback<MessageLoop*()>& message_loop_cb)
+ const base::Callback<MessageLoop*()>& message_loop_cb,
+ Decryptor* decryptor)
: message_loop_factory_cb_(message_loop_cb),
message_loop_(NULL),
state_(kUninitialized),
codec_context_(NULL),
av_frame_(NULL),
- decryptor_(NULL) {
+ decryptor_(decryptor) {
}
int FFmpegVideoDecoder::GetVideoBuffer(AVCodecContext* codec_context,
@@ -256,11 +257,6 @@ void FFmpegVideoDecoder::DoStop() {
base::ResetAndReturn(&stop_cb_).Run();
}
-void FFmpegVideoDecoder::set_decryptor(Decryptor* decryptor) {
- DCHECK_EQ(state_, kUninitialized);
- decryptor_ = decryptor;
-}
-
FFmpegVideoDecoder::~FFmpegVideoDecoder() {
ReleaseFFmpegResources();
}
diff --git a/media/filters/ffmpeg_video_decoder.h b/media/filters/ffmpeg_video_decoder.h
index 56402d4..0eb34df 100644
--- a/media/filters/ffmpeg_video_decoder.h
+++ b/media/filters/ffmpeg_video_decoder.h
@@ -22,7 +22,8 @@ class DecoderBuffer;
class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
public:
- FFmpegVideoDecoder(const base::Callback<MessageLoop*()>& message_loop_cb);
+ FFmpegVideoDecoder(const base::Callback<MessageLoop*()>& message_loop_cb,
+ Decryptor* decryptor);
// VideoDecoder implementation.
virtual void Initialize(const scoped_refptr<DemuxerStream>& stream,
@@ -32,10 +33,6 @@ class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
virtual void Reset(const base::Closure& closure) OVERRIDE;
virtual void Stop(const base::Closure& closure) OVERRIDE;
- // Must be called prior to initialization if decrypted buffers will be
- // encountered.
- void set_decryptor(Decryptor* decryptor);
-
// Callback called from within FFmpeg to allocate a buffer based on
// the dimensions of |codec_context|. See AVCodecContext.get_buffer
// documentation inside FFmpeg.
diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc
index 56be3e5..0f2b23d 100644
--- a/media/filters/ffmpeg_video_decoder_unittest.cc
+++ b/media/filters/ffmpeg_video_decoder_unittest.cc
@@ -71,14 +71,15 @@ class FFmpegVideoDecoderTest : public testing::Test {
public:
FFmpegVideoDecoderTest()
: decryptor_(new MockDecryptor()),
- decoder_(new FFmpegVideoDecoder(base::Bind(&Identity<MessageLoop*>,
- &message_loop_))),
+ decoder_(NULL),
demuxer_(new StrictMock<MockDemuxerStream>()),
read_cb_(base::Bind(&FFmpegVideoDecoderTest::FrameReady,
base::Unretained(this))) {
CHECK(FFmpegGlue::GetInstance());
- decoder_->set_decryptor(decryptor_.get());
+ decoder_ = new FFmpegVideoDecoder(base::Bind(&Identity<MessageLoop*>,
+ &message_loop_),
+ decryptor_.get());
// Initialize various test buffers.
frame_buffer_.reset(new uint8[kCodedSize.GetArea()]);
diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc
index 81a1867..aa53b1b 100644
--- a/media/filters/pipeline_integration_test.cc
+++ b/media/filters/pipeline_integration_test.cc
@@ -185,13 +185,11 @@ class PipelineIntegrationTest
public:
void StartPipelineWithMediaSource(MockMediaSource* source) {
pipeline_->Start(
- CreateFilterCollection(source),
+ CreateFilterCollection(source, NULL),
base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)),
base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)),
QuitOnStatusCB(PIPELINE_OK));
- ASSERT_TRUE(decoder_.get());
-
message_loop_.Run();
}
@@ -199,13 +197,11 @@ class PipelineIntegrationTest
MockMediaSource* source,
FakeDecryptorClient* encrypted_media) {
pipeline_->Start(
- CreateFilterCollection(source),
+ CreateFilterCollection(source, encrypted_media->decryptor()),
base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)),
base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)),
QuitOnStatusCB(PIPELINE_OK));
- ASSERT_TRUE(decoder_.get());
- decoder_->set_decryptor(encrypted_media->decryptor());
source->set_decryptor_client(encrypted_media);
message_loop_.Run();
diff --git a/media/filters/pipeline_integration_test_base.cc b/media/filters/pipeline_integration_test_base.cc
index 823104b..c5bdc2e 100644
--- a/media/filters/pipeline_integration_test_base.cc
+++ b/media/filters/pipeline_integration_test_base.cc
@@ -171,29 +171,33 @@ scoped_ptr<FilterCollection>
PipelineIntegrationTestBase::CreateFilterCollection(const std::string& url) {
scoped_refptr<FileDataSource> data_source = new FileDataSource();
CHECK(data_source->Initialize(url));
- return CreateFilterCollection(new FFmpegDemuxer(&message_loop_, data_source));
+ return CreateFilterCollection(new FFmpegDemuxer(&message_loop_, data_source),
+ NULL);
}
scoped_ptr<FilterCollection>
PipelineIntegrationTestBase::CreateFilterCollection(
- ChunkDemuxerClient* client) {
- return CreateFilterCollection(new ChunkDemuxer(client));
+ ChunkDemuxerClient* client,
+ Decryptor* decryptor) {
+ return CreateFilterCollection(new ChunkDemuxer(client), decryptor);
}
scoped_ptr<FilterCollection>
PipelineIntegrationTestBase::CreateFilterCollection(
- const scoped_refptr<Demuxer>& demuxer) {
+ const scoped_refptr<Demuxer>& demuxer,
+ Decryptor* decryptor) {
scoped_ptr<FilterCollection> collection(new FilterCollection());
collection->SetDemuxer(demuxer);
collection->AddAudioDecoder(new FFmpegAudioDecoder(
base::Bind(&MessageLoopFactory::GetMessageLoop,
base::Unretained(message_loop_factory_.get()),
"AudioDecoderThread")));
- decoder_ = new FFmpegVideoDecoder(
+ scoped_refptr<VideoDecoder> decoder = new FFmpegVideoDecoder(
base::Bind(&MessageLoopFactory::GetMessageLoop,
base::Unretained(message_loop_factory_.get()),
- "VideoDecoderThread"));
- collection->AddVideoDecoder(decoder_);
+ "VideoDecoderThread"),
+ decryptor);
+ collection->AddVideoDecoder(decoder);
// Disable frame dropping if hashing is enabled.
renderer_ = new VideoRendererBase(
base::Bind(&PipelineIntegrationTestBase::OnVideoRendererPaint,
diff --git a/media/filters/pipeline_integration_test_base.h b/media/filters/pipeline_integration_test_base.h
index 1268b39..570a8e6 100644
--- a/media/filters/pipeline_integration_test_base.h
+++ b/media/filters/pipeline_integration_test_base.h
@@ -12,12 +12,13 @@
#include "media/base/message_loop_factory.h"
#include "media/base/pipeline.h"
#include "media/filters/chunk_demuxer.h"
-#include "media/filters/ffmpeg_video_decoder.h"
#include "media/filters/video_renderer_base.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace media {
+class Decryptor;
+
// Empty MD5 hash string. Used to verify empty audio or video tracks.
extern const char kNullHash[];
@@ -53,7 +54,7 @@ class PipelineIntegrationTestBase {
bool WaitUntilCurrentTimeIsAfter(const base::TimeDelta& wait_time);
scoped_ptr<FilterCollection> CreateFilterCollection(const std::string& url);
scoped_ptr<FilterCollection> CreateFilterCollection(
- ChunkDemuxerClient* client);
+ ChunkDemuxerClient* client, Decryptor* decryptor);
// Returns the MD5 hash of all video frames seen. Should only be called once
// after playback completes. First time hashes should be generated with
@@ -72,7 +73,6 @@ class PipelineIntegrationTestBase {
bool hashing_enabled_;
scoped_ptr<MessageLoopFactory> message_loop_factory_;
scoped_refptr<Pipeline> pipeline_;
- scoped_refptr<FFmpegVideoDecoder> decoder_;
scoped_refptr<VideoRendererBase> renderer_;
scoped_refptr<NullAudioSink> audio_sink_;
bool ended_;
@@ -86,7 +86,7 @@ class PipelineIntegrationTestBase {
void OnError(PipelineStatus status);
void QuitAfterCurrentTimeTask(const base::TimeDelta& quit_time);
scoped_ptr<FilterCollection> CreateFilterCollection(
- const scoped_refptr<Demuxer>& demuxer);
+ const scoped_refptr<Demuxer>& demuxer, Decryptor* decryptor);
void OnVideoRendererPaint();
MOCK_METHOD1(OnSetOpaque, void(bool));
diff --git a/media/tools/player_wtl/movie.cc b/media/tools/player_wtl/movie.cc
index 45bea9b..eb117ba 100644
--- a/media/tools/player_wtl/movie.cc
+++ b/media/tools/player_wtl/movie.cc
@@ -80,7 +80,8 @@ bool Movie::Open(const wchar_t* url, VideoRendererBase* video_renderer) {
collection->AddVideoDecoder(new FFmpegVideoDecoder(
base::Bind(&MessageLoopFactory::GetMessageLoop,
base::Unretained(message_loop_factory_.get()),
- "VideoDecoderThread")));
+ "VideoDecoderThread"),
+ NULL));
// TODO(vrk): Re-enabled audio. (crbug.com/112159)
collection->AddAudioRenderer(
diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc
index df05d9d..85f3fb67 100644
--- a/media/tools/player_x11/player_x11.cc
+++ b/media/tools/player_x11/player_x11.cc
@@ -122,7 +122,8 @@ bool InitPipeline(MessageLoop* message_loop,
collection->AddVideoDecoder(new media::FFmpegVideoDecoder(
base::Bind(&media::MessageLoopFactory::GetMessageLoop,
base::Unretained(message_loop_factory),
- "VideoDecoderThread")));
+ "VideoDecoderThread"),
+ NULL));
// Create our video renderer and save a reference to it for painting.
g_video_renderer = new media::VideoRendererBase(
diff --git a/webkit/media/filter_helpers.cc b/webkit/media/filter_helpers.cc
index 9eaef4b..1b26422 100644
--- a/webkit/media/filter_helpers.cc
+++ b/webkit/media/filter_helpers.cc
@@ -21,18 +21,19 @@ namespace webkit_media {
static void AddDefaultDecodersToCollection(
media::MessageLoopFactory* message_loop_factory,
media::FilterCollection* filter_collection,
- media::Decryptor* decryptor,
- scoped_refptr<media::FFmpegVideoDecoder>* ffmpeg_video_decoder) {
+ media::Decryptor* decryptor) {
filter_collection->AddAudioDecoder(new media::FFmpegAudioDecoder(
base::Bind(&media::MessageLoopFactory::GetMessageLoop,
base::Unretained(message_loop_factory),
"AudioDecoderThread")));
- *ffmpeg_video_decoder = new media::FFmpegVideoDecoder(
- base::Bind(&media::MessageLoopFactory::GetMessageLoop,
- base::Unretained(message_loop_factory),
- "VideoDecoderThread"));
- (*ffmpeg_video_decoder)->set_decryptor(decryptor);
- filter_collection->AddVideoDecoder(*ffmpeg_video_decoder);
+
+ scoped_refptr<media::FFmpegVideoDecoder> ffmpeg_video_decoder =
+ new media::FFmpegVideoDecoder(
+ base::Bind(&media::MessageLoopFactory::GetMessageLoop,
+ base::Unretained(message_loop_factory),
+ "VideoDecoderThread"),
+ decryptor);
+ filter_collection->AddVideoDecoder(ffmpeg_video_decoder);
}
bool BuildMediaStreamCollection(const WebKit::WebURL& url,
@@ -69,15 +70,14 @@ bool BuildMediaSourceCollection(
media::ChunkDemuxerClient* client,
media::MessageLoopFactory* message_loop_factory,
media::FilterCollection* filter_collection,
- media::Decryptor* decryptor,
- scoped_refptr<media::FFmpegVideoDecoder>* video_decoder) {
+ media::Decryptor* decryptor) {
if (media_source_url.isEmpty() || url != media_source_url)
return false;
filter_collection->SetDemuxer(new media::ChunkDemuxer(client));
AddDefaultDecodersToCollection(message_loop_factory, filter_collection,
- decryptor, video_decoder);
+ decryptor);
return true;
}
@@ -85,14 +85,13 @@ void BuildDefaultCollection(
const scoped_refptr<media::DataSource>& data_source,
media::MessageLoopFactory* message_loop_factory,
media::FilterCollection* filter_collection,
- media::Decryptor* decryptor,
- scoped_refptr<media::FFmpegVideoDecoder>* video_decoder) {
+ media::Decryptor* decryptor) {
filter_collection->SetDemuxer(new media::FFmpegDemuxer(
message_loop_factory->GetMessageLoop("PipelineThread"),
data_source));
AddDefaultDecodersToCollection(message_loop_factory, filter_collection,
- decryptor, video_decoder);
+ decryptor);
}
} // webkit_media
diff --git a/webkit/media/filter_helpers.h b/webkit/media/filter_helpers.h
index b28063c..b130ddf 100644
--- a/webkit/media/filter_helpers.h
+++ b/webkit/media/filter_helpers.h
@@ -44,8 +44,7 @@ bool BuildMediaSourceCollection(
media::ChunkDemuxerClient* client,
media::MessageLoopFactory* message_loop_factory,
media::FilterCollection* filter_collection,
- media::Decryptor* decryptor,
- scoped_refptr<media::FFmpegVideoDecoder>* video_decoder);
+ media::Decryptor* decryptor);
// Builds the required filters for handling regular URLs and adds them to
// |filter_collection| and fills |video_decoder| returning true if successful.
@@ -53,8 +52,7 @@ void BuildDefaultCollection(
const scoped_refptr<media::DataSource>& data_source,
media::MessageLoopFactory* message_loop_factory,
media::FilterCollection* filter_collection,
- media::Decryptor* decryptor,
- scoped_refptr<media::FFmpegVideoDecoder>* video_decoder);
+ media::Decryptor* decryptor);
} // webkit_media
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
index c5d6579..be2a913 100644
--- a/webkit/media/webmediaplayer_impl.cc
+++ b/webkit/media/webmediaplayer_impl.cc
@@ -241,13 +241,10 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) {
}
// Media source pipelines can start immediately.
- scoped_refptr<media::FFmpegVideoDecoder> video_decoder;
if (BuildMediaSourceCollection(url, GetClient()->sourceURL(), proxy_,
message_loop_factory_.get(),
filter_collection_.get(),
- &decryptor_,
- &video_decoder)) {
- proxy_->set_video_decoder(video_decoder);
+ &decryptor_)) {
StartPipeline();
return;
}
@@ -268,9 +265,7 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) {
BuildDefaultCollection(proxy_->data_source(),
message_loop_factory_.get(),
filter_collection_.get(),
- &decryptor_,
- &video_decoder);
- proxy_->set_video_decoder(video_decoder);
+ &decryptor_);
}
void WebMediaPlayerImpl::cancelLoad() {
diff --git a/webkit/media/webmediaplayer_proxy.cc b/webkit/media/webmediaplayer_proxy.cc
index 911c9bc..9fec642 100644
--- a/webkit/media/webmediaplayer_proxy.cc
+++ b/webkit/media/webmediaplayer_proxy.cc
@@ -87,7 +87,6 @@ void WebMediaPlayerProxy::Detach() {
webmediaplayer_ = NULL;
data_source_ = NULL;
frame_provider_ = NULL;
- video_decoder_ = NULL;
}
void WebMediaPlayerProxy::PipelineInitializationCallback(
diff --git a/webkit/media/webmediaplayer_proxy.h b/webkit/media/webmediaplayer_proxy.h
index 747a45c..0cc6bb7 100644
--- a/webkit/media/webmediaplayer_proxy.h
+++ b/webkit/media/webmediaplayer_proxy.h
@@ -60,11 +60,6 @@ class WebMediaPlayerProxy
frame_provider_ = frame_provider;
}
- void set_video_decoder(
- const scoped_refptr<media::FFmpegVideoDecoder>& video_decoder) {
- video_decoder_ = video_decoder;
- }
-
// Methods for Filter -> WebMediaPlayerImpl communication.
void Repaint();
void SetOpaque(bool opaque);
@@ -177,7 +172,6 @@ class WebMediaPlayerProxy
scoped_refptr<BufferedDataSource> data_source_;
scoped_refptr<media::VideoRendererBase> frame_provider_;
SkCanvasVideoRenderer video_renderer_;
- scoped_refptr<media::FFmpegVideoDecoder> video_decoder_;
base::Lock lock_;
int outstanding_repaints_;