[go: nahoru, domu]

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());