summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/base/video_decoder_config.cc19
-rw-r--r--media/base/video_decoder_config.h13
-rw-r--r--media/ffmpeg/ffmpeg_common.cc4
-rw-r--r--media/filters/chunk_demuxer.cc3
-rw-r--r--media/filters/chunk_demuxer_unittest.cc13
-rw-r--r--media/filters/ffmpeg_video_decoder_unittest.cc64
-rw-r--r--media/filters/gpu_video_decoder.cc5
-rw-r--r--media/filters/gpu_video_decoder.h2
-rw-r--r--media/filters/source_buffer_stream.cc5
-rw-r--r--media/filters/source_buffer_stream_unittest.cc8
-rw-r--r--media/mp4/mp4_stream_parser.cc3
-rw-r--r--media/mp4/mp4_stream_parser_unittest.cc3
-rw-r--r--media/webm/webm_stream_parser.cc35
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(