diff options
-rw-r--r-- | media/base/video_decoder_config.cc | 19 | ||||
-rw-r--r-- | media/base/video_decoder_config.h | 13 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_common.cc | 4 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.cc | 3 | ||||
-rw-r--r-- | media/filters/chunk_demuxer_unittest.cc | 13 | ||||
-rw-r--r-- | media/filters/ffmpeg_video_decoder_unittest.cc | 64 | ||||
-rw-r--r-- | media/filters/gpu_video_decoder.cc | 5 | ||||
-rw-r--r-- | media/filters/gpu_video_decoder.h | 2 | ||||
-rw-r--r-- | media/filters/source_buffer_stream.cc | 5 | ||||
-rw-r--r-- | media/filters/source_buffer_stream_unittest.cc | 8 | ||||
-rw-r--r-- | media/mp4/mp4_stream_parser.cc | 3 | ||||
-rw-r--r-- | media/mp4/mp4_stream_parser_unittest.cc | 3 | ||||
-rw-r--r-- | media/webm/webm_stream_parser.cc | 35 |
13 files changed, 114 insertions, 63 deletions
diff --git a/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc index 1cbf5f8..2a694bc 100644 --- a/media/base/video_decoder_config.cc +++ b/media/base/video_decoder_config.cc @@ -23,9 +23,10 @@ VideoDecoderConfig::VideoDecoderConfig(VideoCodec codec, const gfx::Rect& visible_rect, const gfx::Size& natural_size, const uint8* extra_data, - size_t extra_data_size) { + size_t extra_data_size, + bool is_encrypted) { Initialize(codec, profile, format, coded_size, visible_rect, natural_size, - extra_data, extra_data_size, true); + extra_data, extra_data_size, is_encrypted, true); } VideoDecoderConfig::~VideoDecoderConfig() {} @@ -60,6 +61,7 @@ void VideoDecoderConfig::Initialize(VideoCodec codec, const gfx::Size& natural_size, const uint8* extra_data, size_t extra_data_size, + bool is_encrypted, bool record_stats) { CHECK((extra_data_size != 0) == (extra_data != NULL)); @@ -90,6 +92,8 @@ void VideoDecoderConfig::Initialize(VideoCodec codec, } else { extra_data_.reset(); } + + is_encrypted_ = is_encrypted; } void VideoDecoderConfig::CopyFrom(const VideoDecoderConfig& video_config) { @@ -101,6 +105,7 @@ void VideoDecoderConfig::CopyFrom(const VideoDecoderConfig& video_config) { video_config.natural_size(), video_config.extra_data(), video_config.extra_data_size(), + video_config.is_encrypted(), false); } @@ -120,7 +125,8 @@ bool VideoDecoderConfig::Matches(const VideoDecoderConfig& config) const { (natural_size() == config.natural_size()) && (extra_data_size() == config.extra_data_size()) && (!extra_data() || !memcmp(extra_data(), config.extra_data(), - extra_data_size()))); + extra_data_size())) && + (is_encrypted() == config.is_encrypted())); } std::string VideoDecoderConfig::AsHumanReadableString() const { @@ -134,7 +140,8 @@ std::string VideoDecoderConfig::AsHumanReadableString() const { << "," << visible_rect().width() << "," << visible_rect().height() << "]" << " natural size: [" << natural_size().width() - << "," << natural_size().height() << "]"; + << "," << natural_size().height() << "]" + << " encryption: [" << (is_encrypted() ? "true" : "false") << "]"; return s.str(); } @@ -170,4 +177,8 @@ size_t VideoDecoderConfig::extra_data_size() const { return extra_data_size_; } +bool VideoDecoderConfig::is_encrypted() const { + return is_encrypted_; +} + } // namespace media diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h index 93b1257..b5ac792 100644 --- a/media/base/video_decoder_config.h +++ b/media/base/video_decoder_config.h @@ -5,6 +5,8 @@ #ifndef MEDIA_BASE_VIDEO_DECODER_CONFIG_H_ #define MEDIA_BASE_VIDEO_DECODER_CONFIG_H_ +#include <string> + #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "media/base/media_export.h" @@ -73,7 +75,8 @@ class MEDIA_EXPORT VideoDecoderConfig { const gfx::Size& coded_size, const gfx::Rect& visible_rect, const gfx::Size& natural_size, - const uint8* extra_data, size_t extra_data_size); + const uint8* extra_data, size_t extra_data_size, + bool is_encrypted); ~VideoDecoderConfig(); @@ -85,6 +88,7 @@ class MEDIA_EXPORT VideoDecoderConfig { const gfx::Rect& visible_rect, const gfx::Size& natural_size, const uint8* extra_data, size_t extra_data_size, + bool is_encrypted, bool record_stats); // Deep copies |video_config|. @@ -124,6 +128,11 @@ class MEDIA_EXPORT VideoDecoderConfig { uint8* extra_data() const; size_t extra_data_size() const; + // Whether the video stream is potentially encrypted. + // Note that in a potentially encrypted video stream, individual buffers + // can be encrypted or not encrypted. + bool is_encrypted() const; + private: VideoCodec codec_; VideoCodecProfile profile_; @@ -137,6 +146,8 @@ class MEDIA_EXPORT VideoDecoderConfig { scoped_array<uint8> extra_data_; size_t extra_data_size_; + bool is_encrypted_; + DISALLOW_COPY_AND_ASSIGN(VideoDecoderConfig); }; diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 1d64f1c..b6690cb 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc @@ -269,8 +269,8 @@ void AVStreamToVideoDecoderConfig( profile, PixelFormatToVideoFormat(stream->codec->pix_fmt), coded_size, visible_rect, natural_size, - stream->codec->extradata, - stream->codec->extradata_size, + stream->codec->extradata, stream->codec->extradata_size, + false, true); } diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index 40172fe..03b18e7 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -226,7 +226,7 @@ class ChunkDemuxerStream : public DemuxerStream { void DeferRead_Locked(const ReadCB& read_cb); // Creates closures that bind ReadCBs in |read_cbs_| to data in - // |buffers_| and pops the callbacks & buffers from the respecive queues. + // |buffers_| and pops the callbacks & buffers from the respective queues. void CreateReadDoneClosures_Locked(ClosureQueue* closures); // Gets the value to pass to the next Read() callback. Returns true if @@ -1016,7 +1016,6 @@ void ChunkDemuxer::OnStreamParserInitDone(bool success, TimeDelta duration) { // The demuxer is now initialized after the |start_timestamp_| was set. ChangeState_Locked(INITIALIZED); base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); - } bool ChunkDemuxer::OnNewConfigs(bool has_audio, bool has_video, diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index 598a4ca..c0346ca 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc @@ -683,21 +683,21 @@ class ChunkDemuxerTest : public testing::Test { TEST_F(ChunkDemuxerTest, TestInit) { // Test no streams, audio-only, video-only, and audio & video scenarios, - // with video content encoded or not. + // with video encrypted or not. for (int i = 0; i < 8; i++) { bool has_audio = (i & 0x1) != 0; bool has_video = (i & 0x2) != 0; - bool video_content_encoded = (i & 0x4) != 0; + bool is_video_encrypted = (i & 0x4) != 0; // No test on invalid combination. - if (!has_video && video_content_encoded) + if (!has_video && is_video_encrypted) continue; CreateNewDemuxer(); - if (has_video && video_content_encoded) + if (has_video && is_video_encrypted) EXPECT_CALL(*this, NeedKeyMock(NotNull(), 16)); - ASSERT_TRUE(InitDemuxer(has_audio, has_video, video_content_encoded)); + ASSERT_TRUE(InitDemuxer(has_audio, has_video, is_video_encrypted)); scoped_refptr<DemuxerStream> audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); @@ -719,6 +719,8 @@ TEST_F(ChunkDemuxerTest, TestInit) { demuxer_->GetStream(DemuxerStream::VIDEO); if (has_video) { EXPECT_TRUE(video_stream); + EXPECT_EQ(is_video_encrypted, + video_stream->video_decoder_config().is_encrypted()); } else { EXPECT_FALSE(video_stream); } @@ -1160,7 +1162,6 @@ TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { // Make sure AppendData() will accept elements that span multiple calls. TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { - EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc index 57714c7..35c7bcb 100644 --- a/media/filters/ffmpeg_video_decoder_unittest.cc +++ b/media/filters/ffmpeg_video_decoder_unittest.cc @@ -85,15 +85,21 @@ class FFmpegVideoDecoderTest : public testing::Test { i_frame_buffer_ = ReadTestDataFile("vp8-I-frame-320x240"); corrupt_i_frame_buffer_ = ReadTestDataFile("vp8-corrupt-I-frame"); encrypted_i_frame_buffer_ = CreateFakeEncryptedBuffer(); - - config_.Initialize(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, - kVideoFormat, kCodedSize, kVisibleRect, kNaturalSize, - NULL, 0, true); } virtual ~FFmpegVideoDecoderTest() {} void Initialize() { + config_.Initialize(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, kVideoFormat, + kCodedSize, kVisibleRect, kNaturalSize, + NULL, 0, false, true); + InitializeWithConfig(config_); + } + + void InitializeWithEncryptedConfig() { + config_.Initialize(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, kVideoFormat, + kCodedSize, kVisibleRect, kNaturalSize, + NULL, 0, true, true); InitializeWithConfig(config_); } @@ -130,7 +136,7 @@ class FFmpegVideoDecoderTest : public testing::Test { scoped_refptr<VideoFrame> video_frame; DecodeSingleFrame(i_frame_buffer_, &status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status); ASSERT_TRUE(video_frame); EXPECT_FALSE(video_frame->IsEndOfStream()); } @@ -141,7 +147,7 @@ class FFmpegVideoDecoderTest : public testing::Test { scoped_refptr<VideoFrame> video_frame; VideoDecoder::Status status; Read(&status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status); ASSERT_TRUE(video_frame); EXPECT_TRUE(video_frame->IsEndOfStream()); } @@ -189,8 +195,8 @@ class FFmpegVideoDecoderTest : public testing::Test { Read(&status_b, &video_frame_b); gfx::Size original_size = kVisibleRect.size(); - EXPECT_EQ(status_a, VideoDecoder::kOk); - EXPECT_EQ(status_b, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status_a); + EXPECT_EQ(VideoDecoder::kOk, status_b); ASSERT_TRUE(video_frame_a); ASSERT_TRUE(video_frame_b); EXPECT_EQ(original_size.width(), video_frame_a->data_size().width()); @@ -244,7 +250,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_UnsupportedDecoder) { VideoDecoderConfig config(kUnknownVideoCodec, VIDEO_CODEC_PROFILE_UNKNOWN, kVideoFormat, kCodedSize, kVisibleRect, kNaturalSize, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -253,7 +259,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_UnsupportedPixelFormat) { VideoDecoderConfig config(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoFrame::INVALID, kCodedSize, kVisibleRect, kNaturalSize, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -262,7 +268,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_OpenDecoderFails) { VideoDecoderConfig config(kCodecTheora, VIDEO_CODEC_PROFILE_UNKNOWN, kVideoFormat, kCodedSize, kVisibleRect, kNaturalSize, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -271,7 +277,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_AspectRatioNumeratorZero) { VideoDecoderConfig config(kCodecVP8, VP8PROFILE_MAIN, kVideoFormat, kCodedSize, kVisibleRect, natural_size, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -280,7 +286,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_AspectRatioDenominatorZero) { VideoDecoderConfig config(kCodecVP8, VP8PROFILE_MAIN, kVideoFormat, kCodedSize, kVisibleRect, natural_size, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -289,7 +295,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_AspectRatioNumeratorNegative) { VideoDecoderConfig config(kCodecVP8, VP8PROFILE_MAIN, kVideoFormat, kCodedSize, kVisibleRect, natural_size, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -298,7 +304,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_AspectRatioDenominatorNegative) { VideoDecoderConfig config(kCodecVP8, VP8PROFILE_MAIN, kVideoFormat, kCodedSize, kVisibleRect, natural_size, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -309,7 +315,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_AspectRatioNumeratorTooLarge) { VideoDecoderConfig config(kCodecVP8, VP8PROFILE_MAIN, kVideoFormat, kCodedSize, kVisibleRect, natural_size, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -319,7 +325,7 @@ TEST_F(FFmpegVideoDecoderTest, Initialize_AspectRatioDenominatorTooLarge) { VideoDecoderConfig config(kCodecVP8, VP8PROFILE_MAIN, kVideoFormat, kCodedSize, kVisibleRect, natural_size, - NULL, 0); + NULL, 0, false); InitializeWithConfigAndStatus(config, PIPELINE_ERROR_DECODE); } @@ -331,7 +337,7 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_Normal) { scoped_refptr<VideoFrame> video_frame; DecodeSingleFrame(i_frame_buffer_, &status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status); ASSERT_TRUE(video_frame); EXPECT_FALSE(video_frame->IsEndOfStream()); } @@ -363,9 +369,9 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_0ByteFrame) { Read(&status_b, &video_frame_b); Read(&status_c, &video_frame_c); - EXPECT_EQ(status_a, VideoDecoder::kOk); - EXPECT_EQ(status_b, VideoDecoder::kOk); - EXPECT_EQ(status_c, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status_a); + EXPECT_EQ(VideoDecoder::kOk, status_b); + EXPECT_EQ(VideoDecoder::kOk, status_c); ASSERT_TRUE(video_frame_a); ASSERT_TRUE(video_frame_b); @@ -393,7 +399,7 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_DecodeError) { VideoDecoder::Status status; scoped_refptr<VideoFrame> video_frame; Read(&status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kDecodeError); + EXPECT_EQ(VideoDecoder::kDecodeError, status); EXPECT_FALSE(video_frame); message_loop_.RunAllPending(); @@ -411,7 +417,7 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_DecodeErrorAtEndOfStream) { scoped_refptr<VideoFrame> video_frame; DecodeSingleFrame(corrupt_i_frame_buffer_, &status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status); ASSERT_TRUE(video_frame); EXPECT_TRUE(video_frame->IsEndOfStream()); } @@ -441,7 +447,7 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_SmallerHeight) { } TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_Normal) { - Initialize(); + InitializeWithEncryptedConfig(); // Simulate decoding a single encrypted frame. EXPECT_CALL(*decryptor_, Decrypt(encrypted_i_frame_buffer_, _)) @@ -451,14 +457,14 @@ TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_Normal) { scoped_refptr<VideoFrame> video_frame; DecodeSingleFrame(encrypted_i_frame_buffer_, &status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status); ASSERT_TRUE(video_frame); EXPECT_FALSE(video_frame->IsEndOfStream()); } // Test the case that the decryptor fails to decrypt the encrypted buffer. TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_DecryptError) { - Initialize(); + InitializeWithEncryptedConfig(); // Simulate decoding a single encrypted frame. EXPECT_CALL(*demuxer_, Read(_)) @@ -480,7 +486,7 @@ TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_DecryptError) { // Test the case that the decryptor has no key to decrypt the encrypted buffer. TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_NoDecryptionKey) { - Initialize(); + InitializeWithEncryptedConfig(); // Simulate decoding a single encrypted frame. EXPECT_CALL(*demuxer_, Read(_)) @@ -503,7 +509,7 @@ TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_NoDecryptionKey) { // Test the case that the decryptor fails to decrypt the encrypted buffer but // cannot detect the decryption error and returns a corrupted buffer. TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_CorruptedBufferReturned) { - Initialize(); + InitializeWithEncryptedConfig(); // Simulate decoding a single encrypted frame. EXPECT_CALL(*demuxer_, Read(_)) @@ -625,7 +631,7 @@ TEST_F(FFmpegVideoDecoderTest, AbortPendingRead) { Read(&status, &video_frame); - EXPECT_EQ(status, VideoDecoder::kOk); + EXPECT_EQ(VideoDecoder::kOk, status); EXPECT_FALSE(video_frame); } diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index 5ab5de5..e0d3191 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc @@ -133,8 +133,9 @@ void GpuVideoDecoder::Initialize(const scoped_refptr<DemuxerStream>& stream, // TODO(scherkus): this check should go in Pipeline prior to creating // decoder objects. const VideoDecoderConfig& config = stream->video_decoder_config(); - if (!config.IsValidConfig()) { - DLOG(ERROR) << "Invalid video stream - " << config.AsHumanReadableString(); + if (!config.IsValidConfig() || config.is_encrypted()) { + DLOG(ERROR) << "Unsupported video stream - " + << config.AsHumanReadableString(); status_cb.Run(PIPELINE_ERROR_DECODE); return; } diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h index 67dcfd7..ce86ffc 100644 --- a/media/filters/gpu_video_decoder.h +++ b/media/filters/gpu_video_decoder.h @@ -5,10 +5,10 @@ #ifndef MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ #define MEDIA_FILTERS_GPU_VIDEO_DECODER_H_ -#include <deque> #include <list> #include <map> #include <utility> +#include <vector> #include "media/base/pipeline_status.h" #include "media/base/demuxer_stream.h" diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc index 478b7d5..de1a9c9 100644 --- a/media/filters/source_buffer_stream.cc +++ b/media/filters/source_buffer_stream.cc @@ -940,6 +940,11 @@ bool SourceBufferStream::UpdateVideoConfig(const VideoDecoderConfig& config) { DCHECK(!video_configs_.empty()); DCHECK(audio_configs_.empty()); + if (video_configs_[0]->is_encrypted() != config.is_encrypted()) { + DVLOG(1) << "UpdateVideoConfig() : Encryption changes not allowed."; + return false; + } + if (video_configs_[0]->codec() != config.codec()) { DVLOG(1) << "UpdateVideoConfig() : Codec changes not allowed."; return false; diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc index 10084cc..96b1826 100644 --- a/media/filters/source_buffer_stream_unittest.cc +++ b/media/filters/source_buffer_stream_unittest.cc @@ -4,6 +4,8 @@ #include "media/filters/source_buffer_stream.h" +#include <string> + #include "base/logging.h" #include "media/base/data_buffer.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,7 +24,7 @@ class SourceBufferStreamTest : public testing::Test { SourceBufferStreamTest() { config_.Initialize(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoFrame::YV12, kCodedSize, gfx::Rect(kCodedSize), - kCodedSize, NULL, 0, false); + kCodedSize, NULL, 0, false, false); stream_.reset(new SourceBufferStream(config_)); SetStreamInfo(kDefaultFramesPerSecond, kDefaultKeyframesPerSecond); } @@ -1837,7 +1839,7 @@ TEST_F(SourceBufferStreamTest, ConfigChange_Basic) { gfx::Size kNewCodedSize(kCodedSize.width() * 2, kCodedSize.height() * 2); VideoDecoderConfig new_config( kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoFrame::YV12, kNewCodedSize, - gfx::Rect(kNewCodedSize), kNewCodedSize, NULL, 0); + gfx::Rect(kNewCodedSize), kNewCodedSize, NULL, 0, false); ASSERT_FALSE(new_config.Matches(config_)); Seek(0); @@ -1884,7 +1886,7 @@ TEST_F(SourceBufferStreamTest, ConfigChange_Seek) { gfx::Size kNewCodedSize(kCodedSize.width() * 2, kCodedSize.height() * 2); VideoDecoderConfig new_config( kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoFrame::YV12, kNewCodedSize, - gfx::Rect(kNewCodedSize), kNewCodedSize, NULL, 0); + gfx::Rect(kNewCodedSize), kNewCodedSize, NULL, 0, false); Seek(0); NewSegmentAppend(0, 5, &kDataA); diff --git a/media/mp4/mp4_stream_parser.cc b/media/mp4/mp4_stream_parser.cc index 2f51321..8d9a9a5 100644 --- a/media/mp4/mp4_stream_parser.cc +++ b/media/mp4/mp4_stream_parser.cc @@ -227,11 +227,12 @@ bool MP4StreamParser::ParseMoov(BoxReader* reader) { gfx::Size natural_size = GetNaturalSize(visible_rect.size(), entry.pixel_aspect.h_spacing, entry.pixel_aspect.v_spacing); + bool is_encrypted = entry.sinf.info.track_encryption.is_encrypted; video_config.Initialize(kCodecH264, H264PROFILE_MAIN, VideoFrame::YV12, coded_size, visible_rect, natural_size, // No decoder-specific buffer needed for AVC; // SPS/PPS are embedded in the video stream - NULL, 0, true); + NULL, 0, is_encrypted, true); has_video_ = true; video_track_id_ = track->header.track_id; } diff --git a/media/mp4/mp4_stream_parser_unittest.cc b/media/mp4/mp4_stream_parser_unittest.cc index 20c32f1..6c577ad 100644 --- a/media/mp4/mp4_stream_parser_unittest.cc +++ b/media/mp4/mp4_stream_parser_unittest.cc @@ -58,8 +58,7 @@ class MP4StreamParserTest : public testing::Test { << ", dur=" << duration.InMilliseconds(); } - bool NewConfigF(const AudioDecoderConfig& ac, - const VideoDecoderConfig& vc) { + bool NewConfigF(const AudioDecoderConfig& ac, const VideoDecoderConfig& vc) { DVLOG(1) << "NewConfigF: audio=" << ac.IsValidConfig() << ", video=" << vc.IsValidConfig(); configs_received_ = true; diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc index db990cd..b0a18e3 100644 --- a/media/webm/webm_stream_parser.cc +++ b/media/webm/webm_stream_parser.cc @@ -346,27 +346,42 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { } FFmpegConfigHelper config_helper; - if (!config_helper.Parse(data, bytes_parsed)) { DVLOG(1) << "Failed to parse config data."; return -1; } - if (!config_cb_.Run(config_helper.audio_config(), - config_helper.video_config())) { - DVLOG(1) << "New config data isn't allowed."; - return -1; - } - // TODO(xhwang): Support decryption of audio (see http://crbug.com/123421). - if (!tracks_parser.video_encryption_key_id().empty()) { + bool is_video_encrypted = !tracks_parser.video_encryption_key_id().empty(); + + VideoDecoderConfig video_config; + if (is_video_encrypted) { + const VideoDecoderConfig& original_video_config = + config_helper.video_config(); + video_config.Initialize(original_video_config.codec(), + original_video_config.profile(), + original_video_config.format(), + original_video_config.coded_size(), + original_video_config.visible_rect(), + original_video_config.natural_size(), + original_video_config.extra_data(), + original_video_config.extra_data_size(), + is_video_encrypted, false); + + // Fire needkey event. std::string key_id = tracks_parser.video_encryption_key_id(); int key_id_size = key_id.size(); - CHECK_GT(key_id_size, 0); - CHECK_LT(key_id_size, 2048); + DCHECK_GT(key_id_size, 0); scoped_array<uint8> key_id_array(new uint8[key_id_size]); memcpy(key_id_array.get(), key_id.data(), key_id_size); need_key_cb_.Run(key_id_array.Pass(), key_id_size); + } else { + video_config.CopyFrom(config_helper.video_config()); + } + + if (!config_cb_.Run(config_helper.audio_config(), video_config)) { + DVLOG(1) << "New config data isn't allowed."; + return -1; } cluster_parser_.reset(new WebMClusterParser( |