Fail playback when VideoDecoderConfig has invalid extra data.
Invalid extra data occurs when:
(extra_data_ptr == NULL) != (extra_data_size == 0)
We were previously crashing (CHECK) on this condition.
{Audio|Video}DecoderConfig now use a vector and pointer/size issues
are detected/handled in the path of creating the FFmpegDemuxerStream.
Skipping presubmit due to formatting issues. I'd like to have some hope of merging this back to dev.
NOPRESUBMIT=true
BUG=517163
TEST=New unit test. Manually verified graceful failure for MSE & SRC=
R=bbudge@chromium.org, gunsch@chromium.org, sandersd@chromium.org, xhwang@chromium.org
Review URL: https://codereview.chromium.org/1396583002
Cr-Commit-Position: refs/heads/master@{#354952}
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index d6ef2b9..4f749cea 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -12,6 +12,7 @@
#include "media/base/decoder_buffer.h"
#include "media/base/decrypt_config.h"
#include "media/base/gmock_callback_support.h"
+#include "media/base/media_util.h"
#include "media/base/mock_filters.h"
#include "media/base/test_helpers.h"
#include "media/base/timestamp_constants.h"
@@ -118,8 +119,8 @@
.WillOnce(SaveArg<1>(&key_added_cb_));
config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32,
- CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, true,
- base::TimeDelta(), 0);
+ CHANNEL_LAYOUT_STEREO, kSampleRate, EmptyExtraData(),
+ true, base::TimeDelta(), 0);
InitializeAndExpectResult(config_, true);
}
@@ -287,7 +288,8 @@
// Ensure that DecryptingAudioDecoder only accepts encrypted audio.
TEST_F(DecryptingAudioDecoderTest, Initialize_UnencryptedAudioConfig) {
AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
- CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, false);
+ CHANNEL_LAYOUT_STEREO, kSampleRate,
+ EmptyExtraData(), false);
InitializeAndExpectResult(config, false);
}
@@ -295,7 +297,7 @@
// Ensure decoder handles invalid audio configs without crashing.
TEST_F(DecryptingAudioDecoderTest, Initialize_InvalidAudioConfig) {
AudioDecoderConfig config(kUnknownAudioCodec, kUnknownSampleFormat,
- CHANNEL_LAYOUT_STEREO, 0, NULL, 0, true);
+ CHANNEL_LAYOUT_STEREO, 0, EmptyExtraData(), true);
InitializeAndExpectResult(config, false);
}
@@ -307,14 +309,16 @@
ExpectDecryptorNotification(decryptor_.get(), true);
AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
- CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, true);
+ CHANNEL_LAYOUT_STEREO, kSampleRate,
+ EmptyExtraData(), true);
InitializeAndExpectResult(config, false);
}
TEST_F(DecryptingAudioDecoderTest, Initialize_NullDecryptor) {
ExpectDecryptorNotification(NULL, false);
AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
- CHANNEL_LAYOUT_STEREO, kSampleRate, NULL, 0, true);
+ CHANNEL_LAYOUT_STEREO, kSampleRate,
+ EmptyExtraData(), true);
InitializeAndExpectResult(config, false);
}
@@ -382,7 +386,8 @@
// The new config is different from the initial config in bits-per-channel,
// channel layout and samples_per_second.
AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16,
- CHANNEL_LAYOUT_5_1, 88200, NULL, 0, true);
+ CHANNEL_LAYOUT_5_1, 88200, EmptyExtraData(),
+ true);
EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel());
EXPECT_NE(new_config.channel_layout(), config_.channel_layout());
EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second());