diff options
author | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-10 01:42:04 +0000 |
---|---|---|
committer | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-10 01:42:04 +0000 |
commit | 2e2cc0706aa970eef530c92a87472595b584db67 (patch) | |
tree | 0845130609d8c724114f93016ddf57425fb15b7a /media | |
parent | d6d64b5548e61c42ac2f281f6d45eeff09b72ab4 (diff) | |
download | chromium_src-2e2cc0706aa970eef530c92a87472595b584db67.zip chromium_src-2e2cc0706aa970eef530c92a87472595b584db67.tar.gz chromium_src-2e2cc0706aa970eef530c92a87472595b584db67.tar.bz2 |
Introduce new ffmpeg regression tests based on PipelineIntegrationTests.
Tests should be run under ASAN, Valgrind to ensure no issues exist.
BUG=112321
TEST=ffmpeg_regression_tests
Review URL: http://codereview.chromium.org/9363016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121368 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/ffmpeg/ffmpeg_regression_tests.cc | 150 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test.cc | 4 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test_base.cc | 6 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test_base.h | 5 | ||||
-rw-r--r-- | media/media.gyp | 29 |
5 files changed, 191 insertions, 3 deletions
diff --git a/media/ffmpeg/ffmpeg_regression_tests.cc b/media/ffmpeg/ffmpeg_regression_tests.cc new file mode 100644 index 0000000..8df6c10 --- /dev/null +++ b/media/ffmpeg/ffmpeg_regression_tests.cc @@ -0,0 +1,150 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/filters/pipeline_integration_test_base.h" + +#include "base/bind.h" +#include "media/base/test_data_util.h" +#include "media/filters/chunk_demuxer_client.h" + +namespace media { + +struct RegressionTestData { + RegressionTestData(const char* filename, PipelineStatus init_status, + PipelineStatus end_status) + : filename(filename), + init_status(init_status), + end_status(end_status) { + } + + const char* filename; + PipelineStatus init_status; + PipelineStatus end_status; +}; + +class FFmpegRegressionTest + : public testing::TestWithParam<RegressionTestData>, + public PipelineIntegrationTestBase { +}; + +#define FFMPEG_TEST_CASE(name, fn, init_status, end_status) \ + INSTANTIATE_TEST_CASE_P(name, FFmpegRegressionTest, \ + testing::Values(RegressionTestData(fn, \ + init_status, \ + end_status))); + +// Test cases from issues. +FFMPEG_TEST_CASE(Cr93620, "security/93620.ogg", PIPELINE_OK, PIPELINE_OK); +FFMPEG_TEST_CASE(Cr99652, "security/99652.webm", PIPELINE_OK, + PIPELINE_ERROR_DECODE); +FFMPEG_TEST_CASE(Cr100492, "security/100492.webm", DECODER_ERROR_NOT_SUPPORTED, + DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(Cr100543, "security/100543.webm", PIPELINE_OK, PIPELINE_OK); +FFMPEG_TEST_CASE(Cr101458, "security/101458.webm", DECODER_ERROR_NOT_SUPPORTED, + DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(Cr108416, "security/108416.webm", PIPELINE_OK, PIPELINE_OK); +FFMPEG_TEST_CASE(Cr110849, "security/110849.mkv", DEMUXER_ERROR_COULD_NOT_PARSE, + DEMUXER_ERROR_COULD_NOT_PARSE); +FFMPEG_TEST_CASE(Cr112384, "security/112384.webm", + DEMUXER_ERROR_COULD_NOT_PARSE, DEMUXER_ERROR_COULD_NOT_PARSE); +FFMPEG_TEST_CASE(Cr112670, "security/112670.mp4", PIPELINE_ERROR_DECODE, + PIPELINE_ERROR_DECODE); + +// General MP4 test cases. +FFMPEG_TEST_CASE(MP4_0, "security/aac.10419.mp4", PIPELINE_OK, PIPELINE_OK); +FFMPEG_TEST_CASE(MP4_1, "security/clockh264aac_200021889.mp4", + DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN); +FFMPEG_TEST_CASE(MP4_2, "security/clockh264aac_200701257.mp4", PIPELINE_OK, + PIPELINE_OK); +FFMPEG_TEST_CASE(MP4_4, "security/clockh264aac_301350139.mp4", PIPELINE_OK, + PIPELINE_OK); +FFMPEG_TEST_CASE(MP4_5, "security/clockh264aac_3022500.mp4", + DEMUXER_ERROR_NO_SUPPORTED_STREAMS, + DEMUXER_ERROR_NO_SUPPORTED_STREAMS); +FFMPEG_TEST_CASE(MP4_6, "security/clockh264aac_344289.mp4", PIPELINE_OK, + PIPELINE_OK); +FFMPEG_TEST_CASE(MP4_7, "security/clockh264mp3_187697.mp4", PIPELINE_OK, + PIPELINE_OK); +FFMPEG_TEST_CASE(MP4_8, "security/h264.705767.mp4", PIPELINE_ERROR_DECODE, + PIPELINE_ERROR_DECODE); +FFMPEG_TEST_CASE(MP4_9, "security/smclockmp4aac_1_0.mp4", + DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN); + +// General OGV test cases. +FFMPEG_TEST_CASE(OGV_0, "security/big_dims.ogv", PIPELINE_ERROR_DECODE, + PIPELINE_ERROR_DECODE); +FFMPEG_TEST_CASE(OGV_1, "security/out.163.ogv", DECODER_ERROR_NOT_SUPPORTED, + DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_2, "security/out.391.ogv", DECODER_ERROR_NOT_SUPPORTED, + DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_3, "security/smclock_1_0.ogv", PIPELINE_OK, PIPELINE_OK); +FFMPEG_TEST_CASE(OGV_4, "security/smclock.ogv.1.0.ogv", PIPELINE_OK, + PIPELINE_OK); +FFMPEG_TEST_CASE(OGV_5, "security/smclocktheora_1_0.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_6, "security/smclocktheora_1_10000.ogv", + PIPELINE_ERROR_DECODE, PIPELINE_ERROR_DECODE); +FFMPEG_TEST_CASE(OGV_7, "security/smclocktheora_1_102.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_8, "security/smclocktheora_1_104.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_9, "security/smclocktheora_1_110.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_10, "security/smclocktheora_1_179.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_11, "security/smclocktheora_1_20.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_12, "security/smclocktheora_1_723.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_13, "security/smclocktheora_1_790.ogv", PIPELINE_OK, + PIPELINE_OK); +FFMPEG_TEST_CASE(OGV_14, "security/smclocktheora_2_10405.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_16, "security/smclocktheora_2_1075.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(OGV_17, "security/vorbis.482086.ogv", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); + +// General WebM test cases. +FFMPEG_TEST_CASE(WEBM_1, "security/no-bug.webm", PIPELINE_OK, PIPELINE_OK); +FFMPEG_TEST_CASE(WEBM_2, "security/uninitialize.webm", PIPELINE_ERROR_DECODE, + PIPELINE_ERROR_DECODE); +FFMPEG_TEST_CASE(WEBM_3, "security/out.webm.139771.2965", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +FFMPEG_TEST_CASE(WEBM_4, "security/out.webm.68798.1929", + DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); + +// Flaky, maybe larger issues. +FFMPEG_TEST_CASE(Cr100464, "security/100464.webm", PIPELINE_OK, + PIPELINE_ERROR_DECODE); + +// Current crashers. +// FFMPEG_TEST_CASE(Cr111342, "security/111342.ogm", PIPELINE_OK, PIPELINE_OK); +// FFMPEG_TEST_CASE(OGV_15, "security/smclocktheora_2_10619.ogv", +// DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED); +// FFMPEG_TEST_CASE(OGV_18, "security/wav.711.ogv", PIPELINE_OK, PIPELINE_OK); +// FFMPEG_TEST_CASE(Cr112976, "security/112976.ogg", PIPELINE_OK, PIPELINE_OK); + +// Clock failures. http://crbug.com/113037 +// FFMPEG_TEST_CASE(MP4_3, "security/clockh264aac_300413969.mp4", PIPELINE_OK, +// PIPELINE_OK); +// FFMPEG_TEST_CASE(WEBM_0, "security/memcpy.webm", PIPELINE_OK, PIPELINE_OK); + +TEST_P(FFmpegRegressionTest, BasicPlayback) { + if (GetParam().init_status == PIPELINE_OK) { + ASSERT_TRUE(Start(GetTestDataURL(GetParam().filename), + GetParam().init_status)); + Play(); + ASSERT_EQ(WaitUntilEndedOrError(), GetParam().end_status); + + // Check for ended if the pipeline is expected to finish okay. + if (GetParam().end_status == PIPELINE_OK) + ASSERT_TRUE(ended_); + } else { + ASSERT_FALSE(Start(GetTestDataURL(GetParam().filename), + GetParam().init_status)); + } +} + +} // namespace media diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc index 079402e..bfcb4f3 100644 --- a/media/filters/pipeline_integration_test.cc +++ b/media/filters/pipeline_integration_test.cc @@ -75,7 +75,9 @@ class MockMediaSource : public ChunkDemuxerClient { scoped_refptr<ChunkDemuxer> chunk_demuxer_; }; -class PipelineIntegrationTest : public PipelineIntegrationTestBase { +class PipelineIntegrationTest + : public testing::Test, + public PipelineIntegrationTestBase { public: // Verifies that seeking works properly for ChunkDemuxer when the // seek happens while there is a pending read on the ChunkDemuxer diff --git a/media/filters/pipeline_integration_test_base.cc b/media/filters/pipeline_integration_test_base.cc index d6fb480..8a27abd 100644 --- a/media/filters/pipeline_integration_test_base.cc +++ b/media/filters/pipeline_integration_test_base.cc @@ -53,6 +53,7 @@ void PipelineIntegrationTestBase::OnEnded(PipelineStatus status) { DCHECK_EQ(status, PIPELINE_OK); DCHECK(!ended_); ended_ = true; + pipeline_status_ = status; message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure()); } @@ -64,6 +65,11 @@ bool PipelineIntegrationTestBase::WaitUntilOnEnded() { return ended_ && (pipeline_status_ == PIPELINE_OK); } +PipelineStatus PipelineIntegrationTestBase::WaitUntilEndedOrError() { + message_loop_.Run(); + return pipeline_status_; +} + void PipelineIntegrationTestBase::OnError(PipelineStatus status) { DCHECK_NE(status, PIPELINE_OK); pipeline_status_ = status; diff --git a/media/filters/pipeline_integration_test_base.h b/media/filters/pipeline_integration_test_base.h index dc34131..818ef80 100644 --- a/media/filters/pipeline_integration_test_base.h +++ b/media/filters/pipeline_integration_test_base.h @@ -23,13 +23,13 @@ namespace media { // display or audio device. Both of these devices are simulated since they have // little effect on verifying pipeline behavior and allow tests to run faster // than real-time. -class PipelineIntegrationTestBase : public testing::Test { +class PipelineIntegrationTestBase { public: PipelineIntegrationTestBase(); virtual ~PipelineIntegrationTestBase(); bool WaitUntilOnEnded(); - void OnError(PipelineStatus status); + PipelineStatus WaitUntilEndedOrError(); bool Start(const std::string& url, PipelineStatus expected_status); void Play(); void Pause(); @@ -51,6 +51,7 @@ class PipelineIntegrationTestBase : public testing::Test { PipelineStatus status); PipelineStatusCB QuitOnStatusCB(PipelineStatus expected_status); void OnEnded(PipelineStatus status); + void OnError(PipelineStatus status); void QuitAfterCurrentTimeTask(const base::TimeDelta& quit_time); scoped_ptr<FilterCollection> CreateFilterCollection( scoped_ptr<DemuxerFactory> demuxer_factory); diff --git a/media/media.gyp b/media/media.gyp index 215191b..cbbfec7 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -883,6 +883,35 @@ ], }, { + 'target_name': 'ffmpeg_regression_tests', + 'type': 'executable', + 'dependencies': [ + 'media', + 'media_test_support', + '../base/base.gyp:test_support_base', + '../testing/gmock.gyp:gmock', + '../testing/gtest.gyp:gtest', + '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + ], + 'sources': [ + 'base/test_data_util.cc', + 'base/run_all_unittests.cc', + 'ffmpeg/ffmpeg_regression_tests.cc', + 'filters/pipeline_integration_test_base.cc', + ], + 'conditions': [ + ['os_posix==1 and OS!="mac"', { + 'conditions': [ + ['linux_use_tcmalloc==1', { + 'dependencies': [ + '../base/allocator/allocator.gyp:allocator', + ], + }], + ], + }], + ], + }, + { 'target_name': 'ffmpeg_tests', 'type': 'executable', 'dependencies': [ |