summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authordalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 01:42:04 +0000
committerdalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 01:42:04 +0000
commit2e2cc0706aa970eef530c92a87472595b584db67 (patch)
tree0845130609d8c724114f93016ddf57425fb15b7a /media
parentd6d64b5548e61c42ac2f281f6d45eeff09b72ab4 (diff)
downloadchromium_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.cc150
-rw-r--r--media/filters/pipeline_integration_test.cc4
-rw-r--r--media/filters/pipeline_integration_test_base.cc6
-rw-r--r--media/filters/pipeline_integration_test_base.h5
-rw-r--r--media/media.gyp29
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': [