summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxhwang <xhwang@chromium.org>2015-11-14 18:42:02 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-15 02:43:31 +0000
commit680a312fa2dfe2fccce0ecc1d00193fa6d4be29b (patch)
tree0bb9066289a4bee0866a2b137d535e2b3fddbee9
parent5bbe62bfa0f3c57871f5a1c1cabface9ff19a768 (diff)
downloadchromium_src-680a312fa2dfe2fccce0ecc1d00193fa6d4be29b.zip
chromium_src-680a312fa2dfe2fccce0ecc1d00193fa6d4be29b.tar.gz
chromium_src-680a312fa2dfe2fccce0ecc1d00193fa6d4be29b.tar.bz2
media: Pass SetCdmReadyCB in {Audio|Video}Decoder::Initialize().
(This reverts commit 0c1df0a37a815953d1af3d4eaf145af969210d5d with fix.) This enables all audio/video decoders the ability to get access to the CDM associated with the media element. This is useful for certain decoders to handle encrypted streams. For Decrypting{Audio|Video}Decoder and DecryptingDemuxerStream, the SetCdmReadyCB is simply moved from constructor to Initialize() call. In the future this could also help move Decrypting{Audio|Video}Decoder creation out of DecoderSelector so that it is treated the same as all other decoders. TBR=bbudge@chromium.org,jrummell@chromium.org,dalecurtis@chromium.org BUG=545099 Review URL: https://codereview.chromium.org/1447533006 Cr-Commit-Position: refs/heads/master@{#359754}
-rw-r--r--content/common/gpu/media/video_encode_accelerator_unittest.cc6
-rw-r--r--content/renderer/media/android/media_source_delegate.cc10
-rw-r--r--content/renderer/pepper/video_decoder_shim.cc3
-rw-r--r--media/base/audio_decoder.h7
-rw-r--r--media/base/mock_filters.h6
-rw-r--r--media/base/video_decoder.h6
-rw-r--r--media/cast/sender/h264_vt_encoder_unittest.cc4
-rw-r--r--media/filters/audio_decoder_selector_unittest.cc70
-rw-r--r--media/filters/audio_decoder_unittest.cc2
-rw-r--r--media/filters/decoder_selector.cc14
-rw-r--r--media/filters/decoder_stream.cc7
-rw-r--r--media/filters/decoder_stream_traits.cc7
-rw-r--r--media/filters/decoder_stream_traits.h3
-rw-r--r--media/filters/decrypting_audio_decoder.cc5
-rw-r--r--media/filters/decrypting_audio_decoder.h2
-rw-r--r--media/filters/decrypting_audio_decoder_unittest.cc13
-rw-r--r--media/filters/decrypting_demuxer_stream.cc4
-rw-r--r--media/filters/decrypting_demuxer_stream.h5
-rw-r--r--media/filters/decrypting_demuxer_stream_unittest.cc16
-rw-r--r--media/filters/decrypting_video_decoder.cc5
-rw-r--r--media/filters/decrypting_video_decoder.h2
-rw-r--r--media/filters/decrypting_video_decoder_unittest.cc23
-rw-r--r--media/filters/fake_video_decoder.cc1
-rw-r--r--media/filters/fake_video_decoder.h1
-rw-r--r--media/filters/fake_video_decoder_unittest.cc2
-rw-r--r--media/filters/ffmpeg_audio_decoder.cc1
-rw-r--r--media/filters/ffmpeg_audio_decoder.h1
-rw-r--r--media/filters/ffmpeg_video_decoder.cc1
-rw-r--r--media/filters/ffmpeg_video_decoder.h1
-rw-r--r--media/filters/ffmpeg_video_decoder_unittest.cc3
-rw-r--r--media/filters/gpu_video_decoder.cc2
-rw-r--r--media/filters/gpu_video_decoder.h1
-rw-r--r--media/filters/opus_audio_decoder.cc1
-rw-r--r--media/filters/opus_audio_decoder.h1
-rw-r--r--media/filters/video_decoder_selector_unittest.cc70
-rw-r--r--media/filters/vpx_video_decoder.cc1
-rw-r--r--media/filters/vpx_video_decoder.h1
-rw-r--r--media/renderers/audio_renderer_impl_unittest.cc15
-rw-r--r--media/renderers/video_renderer_impl_unittest.cc4
39 files changed, 189 insertions, 138 deletions
diff --git a/content/common/gpu/media/video_encode_accelerator_unittest.cc b/content/common/gpu/media/video_encode_accelerator_unittest.cc
index 1775614..0f80d07 100644
--- a/content/common/gpu/media/video_encode_accelerator_unittest.cc
+++ b/content/common/gpu/media/video_encode_accelerator_unittest.cc
@@ -27,6 +27,7 @@
#include "content/common/gpu/media/video_accelerator_unittest_helpers.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/bitstream_buffer.h"
+#include "media/base/cdm_context.h"
#include "media/base/decoder_buffer.h"
#include "media/base/media_util.h"
#include "media/base/test_data_util.h"
@@ -670,8 +671,9 @@ void VideoFrameQualityValidator::Initialize(const gfx::Size& coded_size,
LOG_ASSERT(0) << "Invalid profile " << profile_;
decoder_->Initialize(
- config, false, base::Bind(&VideoFrameQualityValidator::InitializeCB,
- base::Unretained(this)),
+ config, false, media::SetCdmReadyCB(),
+ base::Bind(&VideoFrameQualityValidator::InitializeCB,
+ base::Unretained(this)),
base::Bind(&VideoFrameQualityValidator::VerifyOutputFrame,
base::Unretained(this)));
}
diff --git a/content/renderer/media/android/media_source_delegate.cc b/content/renderer/media/android/media_source_delegate.cc
index 9b4d312..1f45238 100644
--- a/content/renderer/media/android/media_source_delegate.cc
+++ b/content/renderer/media/android/media_source_delegate.cc
@@ -520,10 +520,9 @@ void MediaSourceDelegate::InitAudioDecryptingDemuxerStream() {
DCHECK(!set_cdm_ready_cb_.is_null());
audio_decrypting_demuxer_stream_.reset(new media::DecryptingDemuxerStream(
- media_task_runner_, media_log_, set_cdm_ready_cb_,
- waiting_for_decryption_key_cb_));
+ media_task_runner_, media_log_, waiting_for_decryption_key_cb_));
audio_decrypting_demuxer_stream_->Initialize(
- audio_stream_,
+ audio_stream_, set_cdm_ready_cb_,
base::Bind(&MediaSourceDelegate::OnAudioDecryptingDemuxerStreamInitDone,
media_weak_factory_.GetWeakPtr()));
}
@@ -534,10 +533,9 @@ void MediaSourceDelegate::InitVideoDecryptingDemuxerStream() {
DCHECK(!set_cdm_ready_cb_.is_null());
video_decrypting_demuxer_stream_.reset(new media::DecryptingDemuxerStream(
- media_task_runner_, media_log_, set_cdm_ready_cb_,
- waiting_for_decryption_key_cb_));
+ media_task_runner_, media_log_, waiting_for_decryption_key_cb_));
video_decrypting_demuxer_stream_->Initialize(
- video_stream_,
+ video_stream_, set_cdm_ready_cb_,
base::Bind(&MediaSourceDelegate::OnVideoDecryptingDemuxerStreamInitDone,
media_weak_factory_.GetWeakPtr()));
}
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
index 3f2c5e8..ae19127 100644
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -21,6 +21,7 @@
#include "content/renderer/pepper/pepper_video_decoder_host.h"
#include "content/renderer/render_thread_impl.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
+#include "media/base/cdm_context.h"
#include "media/base/decoder_buffer.h"
#include "media/base/limits.h"
#include "media/base/media_util.h"
@@ -700,7 +701,7 @@ void VideoDecoderShim::DecoderImpl::Initialize(
DCHECK_EQ(decoder_->GetMaxDecodeRequests(), 1);
decoder_->Initialize(
- config, true /* low_delay */,
+ config, true /* low_delay */, media::SetCdmReadyCB(),
base::Bind(&VideoDecoderShim::DecoderImpl::OnInitDone,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&VideoDecoderShim::DecoderImpl::OnOutputComplete,
diff --git a/media/base/audio_decoder.h b/media/base/audio_decoder.h
index 3da8547..337d2a7 100644
--- a/media/base/audio_decoder.h
+++ b/media/base/audio_decoder.h
@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "media/base/audio_decoder_config.h"
+#include "media/base/cdm_context.h"
#include "media/base/channel_layout.h"
#include "media/base/decoder_buffer.h"
#include "media/base/media_export.h"
@@ -56,9 +57,15 @@ class MEDIA_EXPORT AudioDecoder {
// Initializes an AudioDecoder with the given DemuxerStream, executing the
// callback upon completion.
+ //
+ // |set_cdm_ready_cb| can be used to set/cancel a CdmReadyCB with which the
+ // decoder can be notified when a CDM is ready. The decoder can use the CDM to
+ // handle encrypted video stream.
+ //
// |init_cb| is used to return initialization status.
// |output_cb| is called for decoded audio buffers (see Decode()).
virtual void Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) = 0;
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 5fb2a3e..c558430 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -86,9 +86,10 @@ class MockVideoDecoder : public VideoDecoder {
// VideoDecoder implementation.
virtual std::string GetDisplayName() const;
- MOCK_METHOD4(Initialize,
+ MOCK_METHOD5(Initialize,
void(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb));
MOCK_METHOD2(Decode, void(const scoped_refptr<DecoderBuffer>& buffer,
@@ -107,8 +108,9 @@ class MockAudioDecoder : public AudioDecoder {
// AudioDecoder implementation.
virtual std::string GetDisplayName() const;
- MOCK_METHOD3(Initialize,
+ MOCK_METHOD4(Initialize,
void(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb));
MOCK_METHOD2(Decode,
diff --git a/media/base/video_decoder.h b/media/base/video_decoder.h
index f7bae3c..074718b 100644
--- a/media/base/video_decoder.h
+++ b/media/base/video_decoder.h
@@ -9,6 +9,7 @@
#include "base/callback.h"
#include "base/memory/ref_counted.h"
+#include "media/base/cdm_context.h"
#include "media/base/media_export.h"
#include "media/base/pipeline_status.h"
#include "ui/gfx/geometry/size.h"
@@ -63,6 +64,10 @@ class MEDIA_EXPORT VideoDecoder {
// Initialization should fail if |low_delay| is true and the decoder cannot
// satisfy the requirements above.
//
+ // |set_cdm_ready_cb| can be used to set/cancel a CdmReadyCB with which the
+ // decoder can be notified when a CDM is ready. The decoder can use the CDM to
+ // handle encrypted video stream.
+ //
// Note:
// 1) The VideoDecoder will be reinitialized if it was initialized before.
// Upon reinitialization, all internal buffered frames will be dropped.
@@ -70,6 +75,7 @@ class MEDIA_EXPORT VideoDecoder {
// 3) No VideoDecoder calls should be made before |init_cb| is executed.
virtual void Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) = 0;
diff --git a/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc
index e44d9f8..419cbb87 100644
--- a/media/cast/sender/h264_vt_encoder_unittest.cc
+++ b/media/cast/sender/h264_vt_encoder_unittest.cc
@@ -12,6 +12,7 @@
#include "base/test/power_monitor_test_base.h"
#include "base/test/simple_test_tick_clock.h"
#include "base/test/test_suite.h"
+#include "media/base/cdm_context.h"
#include "media/base/decoder_buffer.h"
#include "media/base/media.h"
#include "media/base/media_switches.h"
@@ -135,7 +136,8 @@ class EndToEndFrameChecker
count_frames_checked_(0) {
bool decoder_init_result;
decoder_.Initialize(
- config, false, base::Bind(&SaveDecoderInitResult, &decoder_init_result),
+ config, false, media::SetCdmReadyCB(),
+ base::Bind(&SaveDecoderInitResult, &decoder_init_result),
base::Bind(&EndToEndFrameChecker::CompareFrameWithExpected,
base::Unretained(this)));
base::MessageLoop::current()->RunUntilIdle();
diff --git a/media/filters/audio_decoder_selector_unittest.cc b/media/filters/audio_decoder_selector_unittest.cc
index b2b8a8a..2f5adaa 100644
--- a/media/filters/audio_decoder_selector_unittest.cc
+++ b/media/filters/audio_decoder_selector_unittest.cc
@@ -208,8 +208,8 @@ TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
SelectDecoder();
@@ -220,7 +220,7 @@ TEST_F(AudioDecoderSelectorTest,
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -231,10 +231,10 @@ TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) {
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
SelectDecoder();
@@ -245,9 +245,9 @@ TEST_F(AudioDecoderSelectorTest,
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -258,8 +258,8 @@ TEST_F(AudioDecoderSelectorTest, ClearStream_HasDecryptor) {
UseClearStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
SelectDecoder();
@@ -269,7 +269,7 @@ TEST_F(AudioDecoderSelectorTest, Destroy_ClearStream_HasDecryptor) {
UseClearStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -280,8 +280,8 @@ TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_OneClearDecoder) {
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
SelectDecoder();
@@ -292,7 +292,7 @@ TEST_F(AudioDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -303,10 +303,10 @@ TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_MultipleDecoders) {
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
SelectDecoder();
@@ -317,9 +317,9 @@ TEST_F(AudioDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -349,8 +349,8 @@ TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) {
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
SelectDecoder();
@@ -361,7 +361,7 @@ TEST_F(AudioDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -374,10 +374,10 @@ TEST_F(AudioDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull()));
SelectDecoder();
@@ -388,9 +388,9 @@ TEST_F(AudioDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
SelectDecoderAndDestroy();
}
@@ -408,8 +408,8 @@ TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptAndDecode) {
#else
// A DecryptingDemuxerStream will be created. The clear decoder will be
// initialized and returned.
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _))
- .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
+ .WillOnce(RunCallback<2>(true));
EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull()));
#endif
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc
index ae9f17a..0f07b4a 100644
--- a/media/filters/audio_decoder_unittest.cc
+++ b/media/filters/audio_decoder_unittest.cc
@@ -170,7 +170,7 @@ class AudioDecoderTest : public testing::TestWithParam<DecoderTestData> {
void InitializeDecoderWithResult(const AudioDecoderConfig& config,
bool success) {
decoder_->Initialize(
- config, NewExpectedBoolCB(success),
+ config, SetCdmReadyCB(), NewExpectedBoolCB(success),
base::Bind(&AudioDecoderTest::OnDecoderOutput, base::Unretained(this)));
base::RunLoop().RunUntilIdle();
}
diff --git a/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc
index 0f99e79..4d06d9c 100644
--- a/media/filters/decoder_selector.cc
+++ b/media/filters/decoder_selector.cc
@@ -125,11 +125,10 @@ void DecoderSelector<StreamType>::SelectDecoder(
template <DemuxerStream::Type StreamType>
void DecoderSelector<StreamType>::InitializeDecryptingDecoder() {
decoder_.reset(new typename StreamTraits::DecryptingDecoderType(
- task_runner_, media_log_, set_cdm_ready_cb_,
- waiting_for_decryption_key_cb_));
+ task_runner_, media_log_, waiting_for_decryption_key_cb_));
DecoderStreamTraits<StreamType>::InitializeDecoder(
- decoder_.get(), input_stream_,
+ decoder_.get(), input_stream_, set_cdm_ready_cb_,
base::Bind(&DecoderSelector<StreamType>::DecryptingDecoderInitDone,
weak_ptr_factory_.GetWeakPtr()),
output_cb_);
@@ -156,12 +155,11 @@ void DecoderSelector<StreamType>::DecryptingDecoderInitDone(bool success) {
template <DemuxerStream::Type StreamType>
void DecoderSelector<StreamType>::InitializeDecryptingDemuxerStream() {
- decrypted_stream_.reset(
- new DecryptingDemuxerStream(task_runner_, media_log_, set_cdm_ready_cb_,
- waiting_for_decryption_key_cb_));
+ decrypted_stream_.reset(new DecryptingDemuxerStream(
+ task_runner_, media_log_, waiting_for_decryption_key_cb_));
decrypted_stream_->Initialize(
- input_stream_,
+ input_stream_, set_cdm_ready_cb_,
base::Bind(&DecoderSelector<StreamType>::DecryptingDemuxerStreamInitDone,
weak_ptr_factory_.GetWeakPtr()));
}
@@ -203,7 +201,7 @@ void DecoderSelector<StreamType>::InitializeDecoder() {
decoders_.weak_erase(decoders_.begin());
DecoderStreamTraits<StreamType>::InitializeDecoder(
- decoder_.get(), input_stream_,
+ decoder_.get(), input_stream_, set_cdm_ready_cb_,
base::Bind(&DecoderSelector<StreamType>::DecoderInitDone,
weak_ptr_factory_.GetWeakPtr()),
output_cb_);
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc
index 91a5b1e..772f126 100644
--- a/media/filters/decoder_stream.cc
+++ b/media/filters/decoder_stream.cc
@@ -516,8 +516,9 @@ void DecoderStream<StreamType>::ReinitializeDecoder() {
DCHECK_EQ(pending_decode_requests_, 0);
state_ = STATE_REINITIALIZING_DECODER;
+ // Decoders should not need CDMs during reinitialization.
DecoderStreamTraits<StreamType>::InitializeDecoder(
- decoder_.get(), stream_,
+ decoder_.get(), stream_, SetCdmReadyCB(),
base::Bind(&DecoderStream<StreamType>::OnDecoderReinitialized,
weak_factory_.GetWeakPtr()),
base::Bind(&DecoderStream<StreamType>::OnDecodeOutputReady,
@@ -540,8 +541,8 @@ void DecoderStream<StreamType>::OnDecoderReinitialized(bool success) {
// Reinitialization failed. Try to fall back to one of the remaining
// decoders. This will consume at least one decoder so doing it more than
// once is safe.
- // For simplicity, don't attempt to fall back to a decryptor. Calling this
- // with a null callback ensures that one won't be selected.
+ // For simplicity, don't attempt to fall back to a decrypting decoder.
+ // Calling this with a null callback ensures that one won't be selected.
SelectDecoder(SetCdmReadyCB());
} else {
CompleteDecoderReinitialization(true);
diff --git a/media/filters/decoder_stream_traits.cc b/media/filters/decoder_stream_traits.cc
index 7583b17..c40d69f 100644
--- a/media/filters/decoder_stream_traits.cc
+++ b/media/filters/decoder_stream_traits.cc
@@ -21,10 +21,12 @@ std::string DecoderStreamTraits<DemuxerStream::AUDIO>::ToString() {
void DecoderStreamTraits<DemuxerStream::AUDIO>::InitializeDecoder(
DecoderType* decoder,
DemuxerStream* stream,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(stream->audio_decoder_config().IsValidConfig());
- decoder->Initialize(stream->audio_decoder_config(), init_cb, output_cb);
+ decoder->Initialize(stream->audio_decoder_config(), set_cdm_ready_cb, init_cb,
+ output_cb);
}
void DecoderStreamTraits<DemuxerStream::AUDIO>::ReportStatistics(
@@ -47,12 +49,13 @@ std::string DecoderStreamTraits<DemuxerStream::VIDEO>::ToString() {
void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder(
DecoderType* decoder,
DemuxerStream* stream,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(stream->video_decoder_config().IsValidConfig());
decoder->Initialize(stream->video_decoder_config(),
stream->liveness() == DemuxerStream::LIVENESS_LIVE,
- init_cb, output_cb);
+ set_cdm_ready_cb, init_cb, output_cb);
}
bool DecoderStreamTraits<DemuxerStream::VIDEO>::NeedsBitstreamConversion(
diff --git a/media/filters/decoder_stream_traits.h b/media/filters/decoder_stream_traits.h
index 8caf2df..920aefc 100644
--- a/media/filters/decoder_stream_traits.h
+++ b/media/filters/decoder_stream_traits.h
@@ -5,6 +5,7 @@
#ifndef MEDIA_FILTERS_DECODER_STREAM_TRAITS_H_
#define MEDIA_FILTERS_DECODER_STREAM_TRAITS_H_
+#include "media/base/cdm_context.h"
#include "media/base/demuxer_stream.h"
#include "media/base/pipeline_status.h"
@@ -32,6 +33,7 @@ struct DecoderStreamTraits<DemuxerStream::AUDIO> {
static std::string ToString();
static void InitializeDecoder(DecoderType* decoder,
DemuxerStream* stream,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb);
static bool NeedsBitstreamConversion(DecoderType* decoder) { return false; }
@@ -51,6 +53,7 @@ struct DecoderStreamTraits<DemuxerStream::VIDEO> {
static std::string ToString();
static void InitializeDecoder(DecoderType* decoder,
DemuxerStream* stream,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb);
static bool NeedsBitstreamConversion(DecoderType* decoder);
diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc
index 1c620a7..42f1939 100644
--- a/media/filters/decrypting_audio_decoder.cc
+++ b/media/filters/decrypting_audio_decoder.cc
@@ -34,13 +34,11 @@ static inline bool IsOutOfSync(const base::TimeDelta& timestamp_1,
DecryptingAudioDecoder::DecryptingAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<MediaLog>& media_log,
- const SetCdmReadyCB& set_cdm_ready_cb,
const base::Closure& waiting_for_decryption_key_cb)
: task_runner_(task_runner),
media_log_(media_log),
state_(kUninitialized),
waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb),
- set_cdm_ready_cb_(set_cdm_ready_cb),
decryptor_(NULL),
key_added_while_decode_pending_(false),
weak_factory_(this) {}
@@ -50,6 +48,7 @@ std::string DecryptingAudioDecoder::GetDisplayName() const {
}
void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) {
DVLOG(2) << "Initialize()";
@@ -76,7 +75,9 @@ void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config,
config_ = config;
if (state_ == kUninitialized) {
+ DCHECK(!set_cdm_ready_cb.is_null());
state_ = kDecryptorRequested;
+ set_cdm_ready_cb_ = set_cdm_ready_cb;
set_cdm_ready_cb_.Run(BindToCurrentLoop(
base::Bind(&DecryptingAudioDecoder::SetCdm, weak_this_)));
return;
diff --git a/media/filters/decrypting_audio_decoder.h b/media/filters/decrypting_audio_decoder.h
index b566fdd..43db799 100644
--- a/media/filters/decrypting_audio_decoder.h
+++ b/media/filters/decrypting_audio_decoder.h
@@ -35,13 +35,13 @@ class MEDIA_EXPORT DecryptingAudioDecoder : public AudioDecoder {
DecryptingAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<MediaLog>& media_log,
- const SetCdmReadyCB& set_cdm_ready_cb,
const base::Closure& waiting_for_decryption_key_cb);
~DecryptingAudioDecoder() override;
// AudioDecoder implementation.
std::string GetDisplayName() const override;
void Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index 016e09a4..733a6e6 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -64,8 +64,6 @@ class DecryptingAudioDecoderTest : public testing::Test {
: decoder_(new DecryptingAudioDecoder(
message_loop_.task_runner(),
new MediaLog(),
- base::Bind(&DecryptingAudioDecoderTest::RequestCdmNotification,
- base::Unretained(this)),
base::Bind(&DecryptingAudioDecoderTest::OnWaitingForDecryptionKey,
base::Unretained(this)))),
cdm_context_(new StrictMock<MockCdmContext>()),
@@ -96,9 +94,12 @@ class DecryptingAudioDecoderTest : public testing::Test {
kNoTimestamp());
decoded_frame_list_.push_back(decoded_frame_);
- decoder_->Initialize(config, NewExpectedBoolCB(success),
- base::Bind(&DecryptingAudioDecoderTest::FrameReady,
- base::Unretained(this)));
+ decoder_->Initialize(
+ config, base::Bind(&DecryptingAudioDecoderTest::RequestCdmNotification,
+ base::Unretained(this)),
+ NewExpectedBoolCB(success),
+ base::Bind(&DecryptingAudioDecoderTest::FrameReady,
+ base::Unretained(this)));
message_loop_.RunUntilIdle();
}
@@ -145,7 +146,7 @@ class DecryptingAudioDecoderTest : public testing::Test {
.WillOnce(RunCallback<1>(true));
EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
.WillOnce(SaveArg<1>(&key_added_cb_));
- decoder_->Initialize(new_config, NewExpectedBoolCB(true),
+ decoder_->Initialize(new_config, SetCdmReadyCB(), NewExpectedBoolCB(true),
base::Bind(&DecryptingAudioDecoderTest::FrameReady,
base::Unretained(this)));
}
diff --git a/media/filters/decrypting_demuxer_stream.cc b/media/filters/decrypting_demuxer_stream.cc
index 2189545..883d4c1 100644
--- a/media/filters/decrypting_demuxer_stream.cc
+++ b/media/filters/decrypting_demuxer_stream.cc
@@ -28,14 +28,12 @@ static bool IsStreamValidAndEncrypted(DemuxerStream* stream) {
DecryptingDemuxerStream::DecryptingDemuxerStream(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<MediaLog>& media_log,
- const SetCdmReadyCB& set_cdm_ready_cb,
const base::Closure& waiting_for_decryption_key_cb)
: task_runner_(task_runner),
media_log_(media_log),
state_(kUninitialized),
waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb),
demuxer_stream_(NULL),
- set_cdm_ready_cb_(set_cdm_ready_cb),
decryptor_(NULL),
key_added_while_decrypt_pending_(false),
weak_factory_(this) {}
@@ -45,6 +43,7 @@ std::string DecryptingDemuxerStream::GetDisplayName() const {
}
void DecryptingDemuxerStream::Initialize(DemuxerStream* stream,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const PipelineStatusCB& status_cb) {
DVLOG(2) << __FUNCTION__;
DCHECK(task_runner_->BelongsToCurrentThread());
@@ -53,6 +52,7 @@ void DecryptingDemuxerStream::Initialize(DemuxerStream* stream,
DCHECK(!demuxer_stream_);
weak_this_ = weak_factory_.GetWeakPtr();
demuxer_stream_ = stream;
+ set_cdm_ready_cb_ = set_cdm_ready_cb;
init_cb_ = BindToCurrentLoop(status_cb);
InitializeDecoderConfig();
diff --git a/media/filters/decrypting_demuxer_stream.h b/media/filters/decrypting_demuxer_stream.h
index 88f86a2..c128cf7 100644
--- a/media/filters/decrypting_demuxer_stream.h
+++ b/media/filters/decrypting_demuxer_stream.h
@@ -33,13 +33,14 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream {
DecryptingDemuxerStream(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<MediaLog>& media_log,
- const SetCdmReadyCB& set_cdm_ready_cb,
const base::Closure& waiting_for_decryption_key_cb);
// Cancels all pending operations immediately and fires all pending callbacks.
~DecryptingDemuxerStream() override;
- void Initialize(DemuxerStream* stream, const PipelineStatusCB& status_cb);
+ void Initialize(DemuxerStream* stream,
+ const SetCdmReadyCB& set_cdm_ready_cb,
+ const PipelineStatusCB& status_cb);
// Cancels all pending operations and fires all pending callbacks. If in
// kPendingDemuxerRead or kPendingDecrypt state, waits for the pending
diff --git a/media/filters/decrypting_demuxer_stream_unittest.cc b/media/filters/decrypting_demuxer_stream_unittest.cc
index 7275029..87c5d5e 100644
--- a/media/filters/decrypting_demuxer_stream_unittest.cc
+++ b/media/filters/decrypting_demuxer_stream_unittest.cc
@@ -63,8 +63,6 @@ class DecryptingDemuxerStreamTest : public testing::Test {
: demuxer_stream_(new DecryptingDemuxerStream(
message_loop_.task_runner(),
new MediaLog(),
- base::Bind(&DecryptingDemuxerStreamTest::RequestCdmNotification,
- base::Unretained(this)),
base::Bind(&DecryptingDemuxerStreamTest::OnWaitingForDecryptionKey,
base::Unretained(this)))),
cdm_context_(new StrictMock<MockCdmContext>()),
@@ -88,16 +86,22 @@ class DecryptingDemuxerStreamTest : public testing::Test {
void InitializeAudioAndExpectStatus(const AudioDecoderConfig& config,
PipelineStatus status) {
input_audio_stream_->set_audio_decoder_config(config);
- demuxer_stream_->Initialize(input_audio_stream_.get(),
- NewExpectedStatusCB(status));
+ demuxer_stream_->Initialize(
+ input_audio_stream_.get(),
+ base::Bind(&DecryptingDemuxerStreamTest::RequestCdmNotification,
+ base::Unretained(this)),
+ NewExpectedStatusCB(status));
message_loop_.RunUntilIdle();
}
void InitializeVideoAndExpectStatus(const VideoDecoderConfig& config,
PipelineStatus status) {
input_video_stream_->set_video_decoder_config(config);
- demuxer_stream_->Initialize(input_video_stream_.get(),
- NewExpectedStatusCB(status));
+ demuxer_stream_->Initialize(
+ input_video_stream_.get(),
+ base::Bind(&DecryptingDemuxerStreamTest::RequestCdmNotification,
+ base::Unretained(this)),
+ NewExpectedStatusCB(status));
message_loop_.RunUntilIdle();
}
diff --git a/media/filters/decrypting_video_decoder.cc b/media/filters/decrypting_video_decoder.cc
index ac6a244..9ec48c9 100644
--- a/media/filters/decrypting_video_decoder.cc
+++ b/media/filters/decrypting_video_decoder.cc
@@ -23,13 +23,11 @@ const char DecryptingVideoDecoder::kDecoderName[] = "DecryptingVideoDecoder";
DecryptingVideoDecoder::DecryptingVideoDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<MediaLog>& media_log,
- const SetCdmReadyCB& set_cdm_ready_cb,
const base::Closure& waiting_for_decryption_key_cb)
: task_runner_(task_runner),
media_log_(media_log),
state_(kUninitialized),
waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb),
- set_cdm_ready_cb_(set_cdm_ready_cb),
decryptor_(NULL),
key_added_while_decode_pending_(false),
trace_id_(0),
@@ -41,6 +39,7 @@ std::string DecryptingVideoDecoder::GetDisplayName() const {
void DecryptingVideoDecoder::Initialize(const VideoDecoderConfig& config,
bool /* low_delay */,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) {
DVLOG(2) << "Initialize()";
@@ -59,7 +58,9 @@ void DecryptingVideoDecoder::Initialize(const VideoDecoderConfig& config,
config_ = config;
if (state_ == kUninitialized) {
+ DCHECK(!set_cdm_ready_cb.is_null());
state_ = kDecryptorRequested;
+ set_cdm_ready_cb_ = set_cdm_ready_cb;
set_cdm_ready_cb_.Run(BindToCurrentLoop(
base::Bind(&DecryptingVideoDecoder::SetCdm, weak_this_)));
return;
diff --git a/media/filters/decrypting_video_decoder.h b/media/filters/decrypting_video_decoder.h
index 1ac97b8..0651edb 100644
--- a/media/filters/decrypting_video_decoder.h
+++ b/media/filters/decrypting_video_decoder.h
@@ -31,7 +31,6 @@ class MEDIA_EXPORT DecryptingVideoDecoder : public VideoDecoder {
DecryptingVideoDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<MediaLog>& media_log,
- const SetCdmReadyCB& set_cdm_ready_cb,
const base::Closure& waiting_for_decryption_key_cb);
~DecryptingVideoDecoder() override;
@@ -39,6 +38,7 @@ class MEDIA_EXPORT DecryptingVideoDecoder : public VideoDecoder {
std::string GetDisplayName() const override;
void Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc
index dba3e2e..5fcb74e 100644
--- a/media/filters/decrypting_video_decoder_unittest.cc
+++ b/media/filters/decrypting_video_decoder_unittest.cc
@@ -57,8 +57,6 @@ class DecryptingVideoDecoderTest : public testing::Test {
: decoder_(new DecryptingVideoDecoder(
message_loop_.task_runner(),
new MediaLog(),
- base::Bind(&DecryptingVideoDecoderTest::RequestCdmNotification,
- base::Unretained(this)),
base::Bind(&DecryptingVideoDecoderTest::OnWaitingForDecryptionKey,
base::Unretained(this)))),
cdm_context_(new StrictMock<MockCdmContext>()),
@@ -97,9 +95,13 @@ class DecryptingVideoDecoderTest : public testing::Test {
// can succeed or fail.
void InitializeAndExpectResult(const VideoDecoderConfig& config,
bool success) {
- decoder_->Initialize(config, false, NewExpectedBoolCB(success),
- base::Bind(&DecryptingVideoDecoderTest::FrameReady,
- base::Unretained(this)));
+ decoder_->Initialize(
+ config, false,
+ base::Bind(&DecryptingVideoDecoderTest::RequestCdmNotification,
+ base::Unretained(this)),
+ NewExpectedBoolCB(success),
+ base::Bind(&DecryptingVideoDecoderTest::FrameReady,
+ base::Unretained(this)));
message_loop_.RunUntilIdle();
}
@@ -428,10 +430,13 @@ TEST_F(DecryptingVideoDecoderTest, Destroy_DuringDecryptorRequested) {
CdmReadyCB cdm_ready_cb;
EXPECT_CALL(*this, RequestCdmNotification(_))
.WillOnce(SaveArg<0>(&cdm_ready_cb));
- decoder_->Initialize(TestVideoConfig::NormalEncrypted(), false,
- NewExpectedBoolCB(false),
- base::Bind(&DecryptingVideoDecoderTest::FrameReady,
- base::Unretained(this)));
+ decoder_->Initialize(
+ TestVideoConfig::NormalEncrypted(), false,
+ base::Bind(&DecryptingVideoDecoderTest::RequestCdmNotification,
+ base::Unretained(this)),
+ NewExpectedBoolCB(false),
+ base::Bind(&DecryptingVideoDecoderTest::FrameReady,
+ base::Unretained(this)));
message_loop_.RunUntilIdle();
// |cdm_ready_cb| is saved but not called here.
EXPECT_FALSE(cdm_ready_cb.is_null());
diff --git a/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc
index 00264ea..bbd68b4 100644
--- a/media/filters/fake_video_decoder.cc
+++ b/media/filters/fake_video_decoder.cc
@@ -46,6 +46,7 @@ std::string FakeVideoDecoder::GetDisplayName() const {
void FakeVideoDecoder::Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/media/filters/fake_video_decoder.h b/media/filters/fake_video_decoder.h
index e784387..14d19569 100644
--- a/media/filters/fake_video_decoder.h
+++ b/media/filters/fake_video_decoder.h
@@ -44,6 +44,7 @@ class FakeVideoDecoder : public VideoDecoder {
std::string GetDisplayName() const override;
void Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc
index 610987d..533022c 100644
--- a/media/filters/fake_video_decoder_unittest.cc
+++ b/media/filters/fake_video_decoder_unittest.cc
@@ -50,7 +50,7 @@ class FakeVideoDecoderTest
void InitializeWithConfigAndExpectResult(const VideoDecoderConfig& config,
bool success) {
decoder_->Initialize(
- config, false, NewExpectedBoolCB(success),
+ config, false, SetCdmReadyCB(), NewExpectedBoolCB(success),
base::Bind(&FakeVideoDecoderTest::FrameReady, base::Unretained(this)));
message_loop_.RunUntilIdle();
current_config_ = config;
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
index a498c17..206f971 100644
--- a/media/filters/ffmpeg_audio_decoder.cc
+++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -146,6 +146,7 @@ std::string FFmpegAudioDecoder::GetDisplayName() const {
}
void FFmpegAudioDecoder::Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& /* set_cdm_ready_cb */,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/filters/ffmpeg_audio_decoder.h b/media/filters/ffmpeg_audio_decoder.h
index a394e7d..c3bf60c 100644
--- a/media/filters/ffmpeg_audio_decoder.h
+++ b/media/filters/ffmpeg_audio_decoder.h
@@ -38,6 +38,7 @@ class MEDIA_EXPORT FFmpegAudioDecoder : public AudioDecoder {
// AudioDecoder implementation.
std::string GetDisplayName() const override;
void Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
index 93e9425..5c419f5 100644
--- a/media/filters/ffmpeg_video_decoder.cc
+++ b/media/filters/ffmpeg_video_decoder.cc
@@ -165,6 +165,7 @@ std::string FFmpegVideoDecoder::GetDisplayName() const {
void FFmpegVideoDecoder::Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& /* set_cdm_ready_cb */,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/filters/ffmpeg_video_decoder.h b/media/filters/ffmpeg_video_decoder.h
index 53999aa..8477ad5 100644
--- a/media/filters/ffmpeg_video_decoder.h
+++ b/media/filters/ffmpeg_video_decoder.h
@@ -41,6 +41,7 @@ class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
std::string GetDisplayName() const override;
void Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc
index 44f6852..307c0f6 100644
--- a/media/filters/ffmpeg_video_decoder_unittest.cc
+++ b/media/filters/ffmpeg_video_decoder_unittest.cc
@@ -71,7 +71,8 @@ class FFmpegVideoDecoderTest : public testing::Test {
void InitializeWithConfigWithResult(const VideoDecoderConfig& config,
bool success) {
- decoder_->Initialize(config, false, NewExpectedBoolCB(success),
+ decoder_->Initialize(config, false, SetCdmReadyCB(),
+ NewExpectedBoolCB(success),
base::Bind(&FFmpegVideoDecoderTest::FrameReady,
base::Unretained(this)));
message_loop_.RunUntilIdle();
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
index 90decc7..b791be7 100644
--- a/media/filters/gpu_video_decoder.cc
+++ b/media/filters/gpu_video_decoder.cc
@@ -121,8 +121,10 @@ std::string GpuVideoDecoder::GetDisplayName() const {
return kDecoderName;
}
+// TODO(xhwang): Support CDM setting using |set_cdm_ready_cb|.
void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config,
bool /* low_delay */,
+ const SetCdmReadyCB& /* set_cdm_ready_cb */,
const InitCB& init_cb,
const OutputCB& output_cb) {
DVLOG(3) << "Initialize()";
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h
index ac4d0e0..271d2fb 100644
--- a/media/filters/gpu_video_decoder.h
+++ b/media/filters/gpu_video_decoder.h
@@ -47,6 +47,7 @@ class MEDIA_EXPORT GpuVideoDecoder
std::string GetDisplayName() const override;
void Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/opus_audio_decoder.cc b/media/filters/opus_audio_decoder.cc
index 454dc29..d1e759b 100644
--- a/media/filters/opus_audio_decoder.cc
+++ b/media/filters/opus_audio_decoder.cc
@@ -132,6 +132,7 @@ std::string OpusAudioDecoder::GetDisplayName() const {
}
void OpusAudioDecoder::Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& /* set_cdm_ready_cb */,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/filters/opus_audio_decoder.h b/media/filters/opus_audio_decoder.h
index 116fcb0..4095656 100644
--- a/media/filters/opus_audio_decoder.h
+++ b/media/filters/opus_audio_decoder.h
@@ -33,6 +33,7 @@ class MEDIA_EXPORT OpusAudioDecoder : public AudioDecoder {
// AudioDecoder implementation.
std::string GetDisplayName() const override;
void Initialize(const AudioDecoderConfig& config,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/filters/video_decoder_selector_unittest.cc b/media/filters/video_decoder_selector_unittest.cc
index 087661d..2796845 100644
--- a/media/filters/video_decoder_selector_unittest.cc
+++ b/media/filters/video_decoder_selector_unittest.cc
@@ -205,8 +205,8 @@ TEST_F(VideoDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
SelectDecoder();
@@ -217,7 +217,7 @@ TEST_F(VideoDecoderSelectorTest,
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -228,10 +228,10 @@ TEST_F(VideoDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) {
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
SelectDecoder();
@@ -242,9 +242,9 @@ TEST_F(VideoDecoderSelectorTest,
UseClearStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -255,8 +255,8 @@ TEST_F(VideoDecoderSelectorTest, ClearStream_HasDecryptor) {
UseClearStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
SelectDecoder();
@@ -266,7 +266,7 @@ TEST_F(VideoDecoderSelectorTest, Destroy_ClearStream_HasDecryptor) {
UseClearStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -277,8 +277,8 @@ TEST_F(VideoDecoderSelectorTest, EncryptedStream_NoDecryptor_OneClearDecoder) {
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
SelectDecoder();
@@ -289,7 +289,7 @@ TEST_F(VideoDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 1);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -300,10 +300,10 @@ TEST_F(VideoDecoderSelectorTest, EncryptedStream_NoDecryptor_MultipleDecoders) {
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
- EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
SelectDecoder();
@@ -314,9 +314,9 @@ TEST_F(VideoDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kNoDecryptor, 2);
- EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
- EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -348,8 +348,8 @@ TEST_F(VideoDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) {
// Since we use DecryptingDemuxerStream, the decoder will be initialized with
// a clear config.
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
SelectDecoder();
@@ -360,7 +360,7 @@ TEST_F(VideoDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 1);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -373,10 +373,10 @@ TEST_F(VideoDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull()));
SelectDecoder();
@@ -387,9 +387,9 @@ TEST_F(VideoDecoderSelectorTest,
UseEncryptedStream();
InitializeDecoderSelector(kDecryptOnly, 2);
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(false));
- EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(false));
+ EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _, _));
SelectDecoderAndDestroy();
}
@@ -407,8 +407,8 @@ TEST_F(VideoDecoderSelectorTest, EncryptedStream_DecryptAndDecode) {
#else
// A DecryptingDemuxerStream will be created. The clear decoder will be
// initialized and returned.
- EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
- .WillOnce(RunCallback<2>(true));
+ EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _, _))
+ .WillOnce(RunCallback<3>(true));
EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull()));
#endif
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc
index fc83914..0a14d3e 100644
--- a/media/filters/vpx_video_decoder.cc
+++ b/media/filters/vpx_video_decoder.cc
@@ -278,6 +278,7 @@ std::string VpxVideoDecoder::GetDisplayName() const {
void VpxVideoDecoder::Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& /* set_cdm_ready_cb */,
const InitCB& init_cb,
const OutputCB& output_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/filters/vpx_video_decoder.h b/media/filters/vpx_video_decoder.h
index bbf9895..5bbc086 100644
--- a/media/filters/vpx_video_decoder.h
+++ b/media/filters/vpx_video_decoder.h
@@ -35,6 +35,7 @@ class MEDIA_EXPORT VpxVideoDecoder : public VideoDecoder {
std::string GetDisplayName() const override;
void Initialize(const VideoDecoderConfig& config,
bool low_delay,
+ const SetCdmReadyCB& set_cdm_ready_cb,
const InitCB& init_cb,
const OutputCB& output_cb) override;
void Decode(const scoped_refptr<DecoderBuffer>& buffer,
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc
index 0dd3969..d434548 100644
--- a/media/renderers/audio_renderer_impl_unittest.cc
+++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -54,7 +54,7 @@ static int kInputSamplesPerSecond = 5000;
static int kOutputSamplesPerSecond = 10000;
ACTION_P(EnterPendingDecoderInitStateAction, test) {
- test->EnterPendingDecoderInitState(arg1);
+ test->EnterPendingDecoderInitState(arg2);
}
class AudioRendererImplTest : public ::testing::Test {
@@ -109,8 +109,8 @@ class AudioRendererImplTest : public ::testing::Test {
}
void ExpectUnsupportedAudioDecoder() {
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
- .WillOnce(DoAll(SaveArg<2>(&output_cb_), RunCallback<1>(false)));
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _))
+ .WillOnce(DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(false)));
}
void OnStatistics(const PipelineStatistics& stats) {
@@ -136,8 +136,8 @@ class AudioRendererImplTest : public ::testing::Test {
}
void Initialize() {
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
- .WillOnce(DoAll(SaveArg<2>(&output_cb_), RunCallback<1>(true)));
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _))
+ .WillOnce(DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(true)));
InitializeWithStatus(PIPELINE_OK);
next_timestamp_.reset(new AudioTimestampHelper(kInputSamplesPerSecond));
@@ -155,7 +155,8 @@ class AudioRendererImplTest : public ::testing::Test {
}
void InitializeAndDestroy() {
- EXPECT_CALL(*decoder_, Initialize(_, _, _)).WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _))
+ .WillOnce(RunCallback<2>(true));
WaitableMessageLoopEvent event;
InitializeRenderer(event.GetPipelineStatusCB());
@@ -168,7 +169,7 @@ class AudioRendererImplTest : public ::testing::Test {
}
void InitializeAndDestroyDuringDecoderInit() {
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _))
.WillOnce(EnterPendingDecoderInitStateAction(this));
WaitableMessageLoopEvent event;
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc
index 74d9a1e..a40a4d7 100644
--- a/media/renderers/video_renderer_impl_unittest.cc
+++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -114,9 +114,9 @@ class VideoRendererImplTest
bool expect_to_success) {
if (low_delay)
demuxer_stream_.set_liveness(DemuxerStream::LIVENESS_LIVE);
- EXPECT_CALL(*decoder_, Initialize(_, _, _, _))
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _, _))
.WillOnce(
- DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(expect_to_success)));
+ DoAll(SaveArg<4>(&output_cb_), RunCallback<3>(expect_to_success)));
EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0);
renderer_->Initialize(
&demuxer_stream_, status_cb, SetCdmReadyCB(),