1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5// Regression tests for FFmpeg.  Security test files can be found in the
6// internal media test data directory:
7//
8//    svn://svn.chromium.org/chrome-internal/trunk/data/media/security/
9//
10// Simply add the custom_dep below to your gclient and sync:
11//
12//    "src/media/test/data/security":
13//        "svn://chrome-svn/chrome-internal/trunk/data/media/security"
14//
15// Many of the files here do not cause issues outside of tooling, so you'll need
16// to run this test under ASAN, TSAN, and Valgrind to ensure that all issues are
17// caught.
18//
19// Test cases labeled FLAKY may not always pass, but they should never crash or
20// cause any kind of warnings or errors under tooling.
21//
22// Frame hashes must be generated with --video-threads=1 for correctness.
23//
24// Known issues:
25//    Cr47325 will generate an UninitValue error under Valgrind inside of the
26//    MD5 hashing code.  The error occurs due to some problematic error
27//    resilence code for H264 inside of FFmpeg.  See http://crbug.com/119020
28//
29//    Some OGG files leak ~30 bytes of memory, upstream tracking bug:
30//    https://ffmpeg.org/trac/ffmpeg/ticket/1244
31//
32//    Some OGG files leak hundreds of kilobytes of memory, upstream bug:
33//    https://ffmpeg.org/trac/ffmpeg/ticket/1931
34
35#include "media/filters/pipeline_integration_test_base.h"
36
37#include "base/bind.h"
38#include "media/base/test_data_util.h"
39
40namespace media {
41
42struct RegressionTestData {
43  RegressionTestData(const char* filename, PipelineStatus init_status,
44                     PipelineStatus end_status, const char* video_md5,
45                     const char* audio_md5)
46      : video_md5(video_md5),
47        audio_md5(audio_md5),
48        filename(filename),
49        init_status(init_status),
50        end_status(end_status) {
51  }
52
53  const char* video_md5;
54  const char* audio_md5;
55  const char* filename;
56  PipelineStatus init_status;
57  PipelineStatus end_status;
58};
59
60// Used for tests which just need to run without crashing or tooling errors, but
61// which may have undefined behavior for hashing, etc.
62struct FlakyRegressionTestData {
63  FlakyRegressionTestData(const char* filename)
64      : filename(filename) {
65  }
66
67  const char* filename;
68};
69
70class FFmpegRegressionTest
71    : public testing::TestWithParam<RegressionTestData>,
72      public PipelineIntegrationTestBase {
73};
74
75class FlakyFFmpegRegressionTest
76    : public testing::TestWithParam<FlakyRegressionTestData>,
77      public PipelineIntegrationTestBase {
78};
79
80#define FFMPEG_TEST_CASE(name, fn, init_status, end_status, video_md5, \
81                         audio_md5) \
82    INSTANTIATE_TEST_CASE_P(name, FFmpegRegressionTest, \
83                            testing::Values(RegressionTestData(fn, \
84                                                               init_status, \
85                                                               end_status, \
86                                                               video_md5, \
87                                                               audio_md5)));
88
89#define FLAKY_FFMPEG_TEST_CASE(name, fn) \
90    INSTANTIATE_TEST_CASE_P(FLAKY_##name, FlakyFFmpegRegressionTest, \
91                            testing::Values(FlakyRegressionTestData(fn)));
92
93// Test cases from issues.
94FFMPEG_TEST_CASE(Cr47325, "security/47325.mp4", PIPELINE_OK, PIPELINE_OK,
95                 "2a7a938c6b5979621cec998f02d9bbb6",
96                 "3.61,1.64,-3.24,0.12,1.50,-0.86,");
97FFMPEG_TEST_CASE(Cr47761, "content/crbug47761.ogg", PIPELINE_OK, PIPELINE_OK,
98                 kNullVideoHash,
99                 "8.89,8.55,8.88,8.01,8.23,7.69,");
100FFMPEG_TEST_CASE(Cr50045, "content/crbug50045.mp4", PIPELINE_OK, PIPELINE_OK,
101                 "c345e9ef9ebfc6bfbcbe3f0ddc3125ba",
102                 "2.72,-6.27,-6.11,-3.17,-5.58,1.26,");
103FFMPEG_TEST_CASE(Cr62127, "content/crbug62127.webm", PIPELINE_OK,
104                 PIPELINE_OK, "a064b2776fc5aef3e9cba47967a75db9",
105                 kNullAudioHash);
106FFMPEG_TEST_CASE(Cr93620, "security/93620.ogg", PIPELINE_OK, PIPELINE_OK,
107                 kNullVideoHash,
108                 "-10.55,-10.10,-10.42,-10.35,-10.29,-10.72,");
109FFMPEG_TEST_CASE(Cr100492, "security/100492.webm", DECODER_ERROR_NOT_SUPPORTED,
110                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
111FFMPEG_TEST_CASE(Cr100543, "security/100543.webm", PIPELINE_OK, PIPELINE_OK,
112                 "c16691cc9178db3adbf7e562cadcd6e6",
113                 "1211.73,304.89,1311.54,371.34,1283.06,299.63,");
114FFMPEG_TEST_CASE(Cr101458, "security/101458.webm", DECODER_ERROR_NOT_SUPPORTED,
115                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
116FFMPEG_TEST_CASE(Cr108416, "security/108416.webm", PIPELINE_OK, PIPELINE_OK,
117                 "5cb3a934795cd552753dec7687928291",
118                 "-17.87,-37.20,-23.33,45.57,8.13,-9.92,");
119FFMPEG_TEST_CASE(Cr110849, "security/110849.mkv",
120                 DEMUXER_ERROR_COULD_NOT_OPEN,
121                 DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
122                 kNullVideoHash, kNullAudioHash);
123FFMPEG_TEST_CASE(Cr112384, "security/112384.webm",
124                 DEMUXER_ERROR_COULD_NOT_PARSE, DEMUXER_ERROR_COULD_NOT_PARSE,
125                 kNullVideoHash, kNullAudioHash);
126FFMPEG_TEST_CASE(Cr117912, "security/117912.webm", DEMUXER_ERROR_COULD_NOT_OPEN,
127                 DEMUXER_ERROR_COULD_NOT_OPEN, kNullVideoHash, kNullAudioHash);
128FFMPEG_TEST_CASE(Cr123481, "security/123481.ogv", PIPELINE_OK,
129                 PIPELINE_OK, "e6dd853fcbd746c8bb2ab2b8fc376fc7",
130                 "1.28,-0.32,-0.81,0.08,1.66,0.89,");
131FFMPEG_TEST_CASE(Cr132779, "security/132779.webm",
132                 DEMUXER_ERROR_COULD_NOT_PARSE, DEMUXER_ERROR_COULD_NOT_PARSE,
133                 kNullVideoHash, kNullAudioHash);
134FFMPEG_TEST_CASE(Cr140165, "security/140165.ogg", PIPELINE_ERROR_DECODE,
135                 PIPELINE_ERROR_DECODE, kNullVideoHash, kNullAudioHash);
136FFMPEG_TEST_CASE(Cr140647, "security/140647.ogv", DEMUXER_ERROR_COULD_NOT_OPEN,
137                 DEMUXER_ERROR_COULD_NOT_OPEN, kNullVideoHash, kNullAudioHash);
138FFMPEG_TEST_CASE(Cr142738, "content/crbug142738.ogg", PIPELINE_OK, PIPELINE_OK,
139                 kNullVideoHash,
140                 "-1.22,0.45,1.79,1.80,-0.30,-1.21,");
141FFMPEG_TEST_CASE(Cr152691, "security/152691.mp3", PIPELINE_ERROR_DECODE,
142                 PIPELINE_ERROR_DECODE, kNullVideoHash, kNullAudioHash);
143FFMPEG_TEST_CASE(Cr161639, "security/161639.m4a", PIPELINE_ERROR_DECODE,
144                 PIPELINE_ERROR_DECODE, kNullVideoHash, kNullAudioHash);
145FFMPEG_TEST_CASE(Cr222754, "security/222754.mp4", PIPELINE_ERROR_DECODE,
146                 PIPELINE_ERROR_DECODE, kNullVideoHash, kNullAudioHash);
147FFMPEG_TEST_CASE(Cr234630a, "security/234630a.mov", PIPELINE_OK,
148                 PIPELINE_OK, kNullVideoHash,
149                 "-15.52,-18.90,-15.33,-16.68,-14.41,-15.89,");
150FFMPEG_TEST_CASE(Cr234630b, "security/234630b.mov", PIPELINE_ERROR_DECODE,
151                 PIPELINE_ERROR_DECODE, kNullVideoHash, kNullAudioHash);
152FFMPEG_TEST_CASE(Cr242786, "security/242786.webm", PIPELINE_OK,
153                 PIPELINE_OK, kNullVideoHash,
154                 "-1.72,-0.83,0.84,1.70,1.23,-0.53,");
155
156// General MP4 test cases.
157FFMPEG_TEST_CASE(MP4_0, "security/aac.10419.mp4", DEMUXER_ERROR_COULD_NOT_OPEN,
158                 DEMUXER_ERROR_COULD_NOT_OPEN, kNullVideoHash, kNullAudioHash);
159FFMPEG_TEST_CASE(MP4_1, "security/clockh264aac_200021889.mp4",
160                 DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN,
161                 kNullVideoHash, kNullAudioHash);
162FFMPEG_TEST_CASE(MP4_2, "security/clockh264aac_200701257.mp4", PIPELINE_OK,
163                 PIPELINE_OK, kNullVideoHash, kNullAudioHash);
164FFMPEG_TEST_CASE(MP4_5, "security/clockh264aac_3022500.mp4",
165                 DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
166                 DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
167                 kNullVideoHash, kNullAudioHash);
168FFMPEG_TEST_CASE(MP4_6, "security/clockh264aac_344289.mp4", PIPELINE_OK,
169                 PIPELINE_OK, kNullVideoHash, kNullAudioHash);
170FFMPEG_TEST_CASE(MP4_7, "security/clockh264mp3_187697.mp4",
171                 DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
172                 DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
173                 kNullVideoHash, kNullAudioHash);
174FFMPEG_TEST_CASE(MP4_8, "security/h264.705767.mp4",
175                 DEMUXER_ERROR_COULD_NOT_PARSE, DEMUXER_ERROR_COULD_NOT_PARSE,
176                 kNullVideoHash, kNullAudioHash);
177FFMPEG_TEST_CASE(MP4_9, "security/smclockmp4aac_1_0.mp4",
178                 DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN,
179                 kNullVideoHash, kNullAudioHash);
180FFMPEG_TEST_CASE(MP4_16, "security/looping2.mov",
181                 DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN,
182                 kNullVideoHash, kNullAudioHash);
183
184// General OGV test cases.
185FFMPEG_TEST_CASE(OGV_1, "security/out.163.ogv", DECODER_ERROR_NOT_SUPPORTED,
186                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
187FFMPEG_TEST_CASE(OGV_2, "security/out.391.ogv", DECODER_ERROR_NOT_SUPPORTED,
188                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
189FFMPEG_TEST_CASE(OGV_5, "security/smclocktheora_1_0.ogv",
190                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
191                 kNullVideoHash, kNullAudioHash);
192FFMPEG_TEST_CASE(OGV_7, "security/smclocktheora_1_102.ogv",
193                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
194                 kNullVideoHash, kNullAudioHash);
195FFMPEG_TEST_CASE(OGV_8, "security/smclocktheora_1_104.ogv",
196                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
197                 kNullVideoHash, kNullAudioHash);
198FFMPEG_TEST_CASE(OGV_9, "security/smclocktheora_1_110.ogv",
199                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
200                 kNullVideoHash, kNullAudioHash);
201FFMPEG_TEST_CASE(OGV_10, "security/smclocktheora_1_179.ogv",
202                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
203                 kNullVideoHash, kNullAudioHash);
204FFMPEG_TEST_CASE(OGV_11, "security/smclocktheora_1_20.ogv",
205                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
206                 kNullVideoHash, kNullAudioHash);
207FFMPEG_TEST_CASE(OGV_12, "security/smclocktheora_1_723.ogv",
208                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
209                 kNullVideoHash, kNullAudioHash);
210FFMPEG_TEST_CASE(OGV_14, "security/smclocktheora_2_10405.ogv",
211                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
212                 kNullVideoHash, kNullAudioHash);
213FFMPEG_TEST_CASE(OGV_15, "security/smclocktheora_2_10619.ogv",
214                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
215                 kNullVideoHash, kNullAudioHash);
216FFMPEG_TEST_CASE(OGV_16, "security/smclocktheora_2_1075.ogv",
217                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
218                 kNullVideoHash, kNullAudioHash);
219FFMPEG_TEST_CASE(OGV_18, "security/wav.711.ogv", DECODER_ERROR_NOT_SUPPORTED,
220                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
221FFMPEG_TEST_CASE(OGV_19, "security/null1.ogv", DECODER_ERROR_NOT_SUPPORTED,
222                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
223FFMPEG_TEST_CASE(OGV_20, "security/null2.ogv", DECODER_ERROR_NOT_SUPPORTED,
224                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
225FFMPEG_TEST_CASE(OGV_21, "security/assert1.ogv", DECODER_ERROR_NOT_SUPPORTED,
226                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
227FFMPEG_TEST_CASE(OGV_22, "security/assert2.ogv", DECODER_ERROR_NOT_SUPPORTED,
228                 DECODER_ERROR_NOT_SUPPORTED, kNullVideoHash, kNullAudioHash);
229
230// General WebM test cases.
231FFMPEG_TEST_CASE(WEBM_1, "security/no-bug.webm", PIPELINE_OK, PIPELINE_OK,
232                 "39e92700cbb77478fd63f49db855e7e5", kNullAudioHash);
233FFMPEG_TEST_CASE(WEBM_3, "security/out.webm.139771.2965",
234                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
235                 kNullVideoHash, kNullAudioHash);
236FFMPEG_TEST_CASE(WEBM_4, "security/out.webm.68798.1929",
237                 DECODER_ERROR_NOT_SUPPORTED, DECODER_ERROR_NOT_SUPPORTED,
238                 kNullVideoHash, kNullAudioHash);
239FFMPEG_TEST_CASE(WEBM_5, "content/frame_size_change.webm", PIPELINE_OK,
240                 PIPELINE_OK, "d8fcf2896b7400a2261bac9e9ea930f8",
241                 kNullAudioHash);
242
243// Audio Functional Tests
244FFMPEG_TEST_CASE(AUDIO_GAMING_0, "content/gaming/a_220_00.mp3", PIPELINE_OK,
245                 PIPELINE_OK, kNullVideoHash,
246                 "0.36,1.25,2.98,4.29,4.19,2.76,");
247FFMPEG_TEST_CASE(AUDIO_GAMING_1, "content/gaming/a_220_00_v2.ogg", PIPELINE_OK,
248                 PIPELINE_OK, kNullVideoHash,
249                 "2.17,3.31,5.15,6.33,5.97,4.35,");
250FFMPEG_TEST_CASE(AUDIO_GAMING_2, "content/gaming/ai_laser1.ogg", PIPELINE_OK,
251                 PIPELINE_OK, kNullVideoHash,
252                 "7.70,10.81,13.19,10.07,7.39,7.56,");
253FFMPEG_TEST_CASE(AUDIO_GAMING_3, "content/gaming/ai_laser2.ogg", PIPELINE_OK,
254                 PIPELINE_OK, kNullVideoHash,
255                 "5.99,8.04,9.71,8.69,7.81,7.52,");
256FFMPEG_TEST_CASE(AUDIO_GAMING_4, "content/gaming/ai_laser3.ogg", PIPELINE_OK,
257                 PIPELINE_OK, kNullVideoHash,
258                 "-0.32,1.44,3.75,5.88,6.32,3.22,");
259FFMPEG_TEST_CASE(AUDIO_GAMING_5, "content/gaming/ai_laser4.ogg", PIPELINE_OK,
260                 PIPELINE_OK, kNullVideoHash,
261                 "4.75,4.16,2.21,3.01,5.51,6.11,");
262FFMPEG_TEST_CASE(AUDIO_GAMING_6, "content/gaming/ai_laser5.ogg", PIPELINE_OK,
263                 PIPELINE_OK, kNullVideoHash,
264                 "6.04,7.46,8.78,7.32,4.16,3.97,");
265FFMPEG_TEST_CASE(AUDIO_GAMING_7, "content/gaming/footstep1.ogg", PIPELINE_OK,
266                 PIPELINE_OK, kNullVideoHash,
267                 "-0.50,0.29,2.35,4.79,5.14,2.24,");
268FFMPEG_TEST_CASE(AUDIO_GAMING_8, "content/gaming/footstep3.ogg", PIPELINE_OK,
269                 PIPELINE_OK, kNullVideoHash,
270                 "-2.87,-3.05,-4.10,-3.20,-2.20,-2.20,");
271FFMPEG_TEST_CASE(AUDIO_GAMING_9, "content/gaming/footstep4.ogg", PIPELINE_OK,
272                 PIPELINE_OK, kNullVideoHash,
273                 "10.35,10.74,11.60,12.83,12.69,10.67,");
274FFMPEG_TEST_CASE(AUDIO_GAMING_10, "content/gaming/laser1.ogg", PIPELINE_OK,
275                 PIPELINE_OK, kNullVideoHash,
276                 "-9.48,-12.94,-1.75,7.66,5.61,-0.58,");
277FFMPEG_TEST_CASE(AUDIO_GAMING_11, "content/gaming/laser2.ogg", PIPELINE_OK,
278                 PIPELINE_OK, kNullVideoHash,
279                 "-7.53,-6.28,3.37,0.73,-5.83,-4.70,");
280FFMPEG_TEST_CASE(AUDIO_GAMING_12, "content/gaming/laser3.ogg", PIPELINE_OK,
281                 PIPELINE_OK, kNullVideoHash,
282                 "-13.62,-6.55,2.52,-10.10,-10.68,-5.43,");
283FFMPEG_TEST_CASE(AUDIO_GAMING_13, "content/gaming/leg1.ogg", PIPELINE_OK,
284                 PIPELINE_OK, kNullVideoHash,
285                 "5.62,5.79,5.81,5.60,6.18,6.15,");
286FFMPEG_TEST_CASE(AUDIO_GAMING_14, "content/gaming/leg2.ogg", PIPELINE_OK,
287                 PIPELINE_OK, kNullVideoHash,
288                 "-0.88,1.32,2.74,3.07,0.88,-0.03,");
289FFMPEG_TEST_CASE(AUDIO_GAMING_15, "content/gaming/leg3.ogg", PIPELINE_OK,
290                 PIPELINE_OK, kNullVideoHash,
291                 "17.77,18.59,19.57,18.84,17.62,17.22,");
292FFMPEG_TEST_CASE(AUDIO_GAMING_16, "content/gaming/lock_on.ogg", PIPELINE_OK,
293                 PIPELINE_OK, kNullVideoHash,
294                 "3.08,-4.33,-5.04,-0.24,1.83,5.16,");
295FFMPEG_TEST_CASE(AUDIO_GAMING_17, "content/gaming/enemy_lock_on.ogg",
296                 PIPELINE_OK, PIPELINE_OK, kNullVideoHash,
297                 "-2.24,-1.00,-2.75,-0.87,1.11,-0.58,");
298FFMPEG_TEST_CASE(AUDIO_GAMING_18, "content/gaming/rocket_launcher.mp3",
299                 PIPELINE_OK, PIPELINE_OK, kNullVideoHash,
300                 "-3.08,0.18,2.49,1.98,-2.20,-4.74,");
301
302// Allocate gigabytes of memory, likely can't be run on 32bit machines.
303FFMPEG_TEST_CASE(BIG_MEM_1, "security/bigmem1.mov",
304                 DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN,
305                 kNullVideoHash, kNullAudioHash);
306FFMPEG_TEST_CASE(BIG_MEM_2, "security/looping1.mov",
307                 DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN,
308                 kNullVideoHash, kNullAudioHash);
309FFMPEG_TEST_CASE(BIG_MEM_5, "security/looping5.mov",
310                 DEMUXER_ERROR_COULD_NOT_OPEN, DEMUXER_ERROR_COULD_NOT_OPEN,
311                 kNullVideoHash, kNullAudioHash);
312FLAKY_FFMPEG_TEST_CASE(BIG_MEM_3, "security/looping3.mov");
313FLAKY_FFMPEG_TEST_CASE(BIG_MEM_4, "security/looping4.mov");
314
315// Flaky under threading or for other reasons.  Per rbultje, most of these will
316// never be reliable since FFmpeg does not guarantee consistency in error cases.
317// We only really care that these don't cause crashes or errors under tooling.
318FLAKY_FFMPEG_TEST_CASE(Cr99652, "security/99652.webm");
319FLAKY_FFMPEG_TEST_CASE(Cr100464, "security/100464.webm");
320FLAKY_FFMPEG_TEST_CASE(Cr111342, "security/111342.ogm");
321FLAKY_FFMPEG_TEST_CASE(OGV_0, "security/big_dims.ogv");
322FLAKY_FFMPEG_TEST_CASE(OGV_3, "security/smclock_1_0.ogv");
323FLAKY_FFMPEG_TEST_CASE(OGV_4, "security/smclock.ogv.1.0.ogv");
324FLAKY_FFMPEG_TEST_CASE(OGV_6, "security/smclocktheora_1_10000.ogv");
325FLAKY_FFMPEG_TEST_CASE(OGV_13, "security/smclocktheora_1_790.ogv");
326FLAKY_FFMPEG_TEST_CASE(MP4_3, "security/clockh264aac_300413969.mp4");
327FLAKY_FFMPEG_TEST_CASE(MP4_4, "security/clockh264aac_301350139.mp4");
328FLAKY_FFMPEG_TEST_CASE(MP4_12, "security/assert1.mov");
329// Not really flaky, but can't pass the seek test.
330FLAKY_FFMPEG_TEST_CASE(MP4_10, "security/null1.m4a");
331
332// TODO(wolenetz/dalecurtis): The following have flaky audio hash result.
333// See http://crbug.com/237371
334FLAKY_FFMPEG_TEST_CASE(Cr112976, "security/112976.ogg");
335FLAKY_FFMPEG_TEST_CASE(MKV_0, "security/nested_tags_lang.mka.627.628");
336FLAKY_FFMPEG_TEST_CASE(MKV_1, "security/nested_tags_lang.mka.667.628");
337FLAKY_FFMPEG_TEST_CASE(MP4_11, "security/null1.mp4");
338
339// TODO(wolenetz/dalecurtis): The following have flaky init status: on mac
340// ia32 Chrome, observed PIPELINE_OK instead of DECODER_ERROR_NOT_SUPPORTED.
341FLAKY_FFMPEG_TEST_CASE(Cr112670, "security/112670.mp4");
342FLAKY_FFMPEG_TEST_CASE(OGV_17, "security/vorbis.482086.ogv");
343
344// TODO(wolenetz/dalecurtis): The following have flaky init status: on mac
345// ia32 Chrome, observed DUMUXER_ERROR_NO_SUPPORTED_STREAMS instead of
346// DECODER_ERROR_NOT_SUPPORTED.
347FLAKY_FFMPEG_TEST_CASE(Cr116927, "security/116927.ogv");
348FLAKY_FFMPEG_TEST_CASE(WEBM_2, "security/uninitialize.webm");
349
350// Videos with massive gaps between frame timestamps that result in long hangs
351// with our pipeline.  Should be uncommented when we support clockless playback.
352// FFMPEG_TEST_CASE(WEBM_0, "security/memcpy.webm", PIPELINE_OK, PIPELINE_OK,
353//                  kNullVideoHash, kNullAudioHash);
354// FFMPEG_TEST_CASE(MP4_17, "security/assert2.mov", PIPELINE_OK, PIPELINE_OK,
355//                  kNullVideoHash, kNullAudioHash);
356// FFMPEG_TEST_CASE(OGV_23, "security/assert2.ogv", PIPELINE_OK, PIPELINE_OK,
357//                  kNullVideoHash, kNullAudioHash);
358
359TEST_P(FFmpegRegressionTest, BasicPlayback) {
360  if (GetParam().init_status == PIPELINE_OK) {
361    ASSERT_TRUE(Start(GetTestDataFilePath(GetParam().filename),
362                      GetParam().init_status, true));
363    Play();
364    ASSERT_EQ(WaitUntilEndedOrError(), GetParam().end_status);
365    EXPECT_EQ(GetParam().video_md5, GetVideoHash());
366    EXPECT_EQ(GetParam().audio_md5, GetAudioHash());
367
368    // Check for ended if the pipeline is expected to finish okay.
369    if (GetParam().end_status == PIPELINE_OK) {
370      ASSERT_TRUE(ended_);
371
372      // Tack a seek on the end to catch any seeking issues.
373      Seek(base::TimeDelta::FromMilliseconds(0));
374    }
375  } else {
376    ASSERT_FALSE(Start(GetTestDataFilePath(GetParam().filename),
377                       GetParam().init_status, true));
378    EXPECT_EQ(GetParam().video_md5, GetVideoHash());
379    EXPECT_EQ(GetParam().audio_md5, GetAudioHash());
380  }
381}
382
383TEST_P(FlakyFFmpegRegressionTest, BasicPlayback) {
384  if (Start(GetTestDataFilePath(GetParam().filename))) {
385    Play();
386    WaitUntilEndedOrError();
387  }
388}
389
390}  // namespace media
391