Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 220103002: Fix unit test failures with estimated durations and splice frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Comments. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | media/filters/pipeline_integration_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 use_legacy_frame_processor_ = GetParam(); 165 use_legacy_frame_processor_ = GetParam();
166 CreateNewDemuxer(); 166 CreateNewDemuxer();
167 } 167 }
168 168
169 void CreateNewDemuxer() { 169 void CreateNewDemuxer() {
170 base::Closure open_cb = 170 base::Closure open_cb =
171 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); 171 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this));
172 Demuxer::NeedKeyCB need_key_cb = 172 Demuxer::NeedKeyCB need_key_cb =
173 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); 173 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this));
174 demuxer_.reset( 174 demuxer_.reset(
175 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), false)); 175 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), true));
176 } 176 }
177 177
178 virtual ~ChunkDemuxerTest() { 178 virtual ~ChunkDemuxerTest() {
179 ShutdownDemuxer(); 179 ShutdownDemuxer();
180 } 180 }
181 181
182 void CreateInitSegment(int stream_flags, 182 void CreateInitSegment(int stream_flags,
183 bool is_audio_encrypted, bool is_video_encrypted, 183 bool is_audio_encrypted, bool is_video_encrypted,
184 scoped_ptr<uint8[]>* buffer, 184 scoped_ptr<uint8[]>* buffer,
185 int* size) { 185 int* size) {
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 PIPELINE_OK), true); 570 PIPELINE_OK), true);
571 571
572 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) 572 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk)
573 return false; 573 return false;
574 574
575 // Append the whole bear1 file. 575 // Append the whole bear1 file.
576 // TODO(wolenetz/acolwell): Remove this extra SetDuration expectation once 576 // TODO(wolenetz/acolwell): Remove this extra SetDuration expectation once
577 // the files are fixed to have the correct duration in their init segments, 577 // the files are fixed to have the correct duration in their init segments,
578 // and the CreateInitDoneCB() call, above, is fixed to used that duration. 578 // and the CreateInitDoneCB() call, above, is fixed to used that duration.
579 // See http://crbug.com/354284. 579 // See http://crbug.com/354284.
580 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); 580 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
581 AppendData(bear1->data(), bear1->data_size()); 581 AppendData(bear1->data(), bear1->data_size());
582 // Last audio frame has timestamp 2721 and duration 24 (estimated from max 582 // Last audio frame has timestamp 2721 and duration 24 (estimated from max
583 // seen so far for audio track). 583 // seen so far for audio track).
584 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry 584 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry
585 // DefaultDuration for video track). 585 // DefaultDuration for video track).
586 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); 586 CheckExpectedRanges(kSourceId, "{ [0,2736) }");
587 587
588 // Append initialization segment for bear2. 588 // Append initialization segment for bear2.
589 // Note: Offsets here and below are derived from 589 // Note: Offsets here and below are derived from
590 // media/test/data/bear-640x360-manifest.js and 590 // media/test/data/bear-640x360-manifest.js and
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after
1664 {33, 3}, 1664 {33, 3},
1665 {67, 6}, 1665 {67, 6},
1666 {100, 9}, 1666 {100, 9},
1667 {133, 12}, 1667 {133, 12},
1668 {kSkip, kSkip}, 1668 {kSkip, kSkip},
1669 }; 1669 };
1670 1670
1671 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the 1671 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the
1672 // ParseWebMFile() call's expected duration, below, once the file is fixed to 1672 // ParseWebMFile() call's expected duration, below, once the file is fixed to
1673 // have the correct duration in the init segment. See http://crbug.com/354284. 1673 // have the correct duration in the init segment. See http://crbug.com/354284.
1674 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); 1674 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
1675 1675
1676 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, 1676 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps,
1677 base::TimeDelta::FromMilliseconds(2744))); 1677 base::TimeDelta::FromMilliseconds(2744)));
1678 } 1678 }
1679 1679
1680 TEST_P(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { 1680 TEST_P(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) {
1681 struct BufferTimestamps buffer_timestamps[] = { 1681 struct BufferTimestamps buffer_timestamps[] = {
1682 {0, 0}, 1682 {0, 0},
1683 {33, 3}, 1683 {33, 3},
1684 {67, 6}, 1684 {67, 6},
(...skipping 12 matching lines...) Expand all
1697 {kSkip, 3}, 1697 {kSkip, 3},
1698 {kSkip, 6}, 1698 {kSkip, 6},
1699 {kSkip, 9}, 1699 {kSkip, 9},
1700 {kSkip, 12}, 1700 {kSkip, 12},
1701 {kSkip, kSkip}, 1701 {kSkip, kSkip},
1702 }; 1702 };
1703 1703
1704 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the 1704 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the
1705 // ParseWebMFile() call's expected duration, below, once the file is fixed to 1705 // ParseWebMFile() call's expected duration, below, once the file is fixed to
1706 // have the correct duration in the init segment. See http://crbug.com/354284. 1706 // have the correct duration in the init segment. See http://crbug.com/354284.
1707 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); 1707 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
1708 1708
1709 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps, 1709 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps,
1710 base::TimeDelta::FromMilliseconds(2744), 1710 base::TimeDelta::FromMilliseconds(2744),
1711 HAS_AUDIO)); 1711 HAS_AUDIO));
1712 } 1712 }
1713 1713
1714 TEST_P(ChunkDemuxerTest, WebMFile_VideoOnly) { 1714 TEST_P(ChunkDemuxerTest, WebMFile_VideoOnly) {
1715 struct BufferTimestamps buffer_timestamps[] = { 1715 struct BufferTimestamps buffer_timestamps[] = {
1716 {0, kSkip}, 1716 {0, kSkip},
1717 {33, kSkip}, 1717 {33, kSkip},
(...skipping 16 matching lines...) Expand all
1734 TEST_P(ChunkDemuxerTest, WebMFile_AltRefFrames) { 1734 TEST_P(ChunkDemuxerTest, WebMFile_AltRefFrames) {
1735 struct BufferTimestamps buffer_timestamps[] = { 1735 struct BufferTimestamps buffer_timestamps[] = {
1736 {0, 0}, 1736 {0, 0},
1737 {33, 3}, 1737 {33, 3},
1738 {33, 6}, 1738 {33, 6},
1739 {67, 9}, 1739 {67, 9},
1740 {100, 12}, 1740 {100, 12},
1741 {kSkip, kSkip}, 1741 {kSkip, kSkip},
1742 }; 1742 };
1743 1743
1744 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the
1745 // ParseWebMFile() call's expected duration, below, once the file is fixed to
1746 // have the correct duration in the init segment. See http://crbug.com/354284.
1747 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768)));
1748
1749 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, 1744 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
1750 base::TimeDelta::FromMilliseconds(2767))); 1745 base::TimeDelta::FromMilliseconds(2767)));
1751 } 1746 }
1752 1747
1753 // Verify that we output buffers before the entire cluster has been parsed. 1748 // Verify that we output buffers before the entire cluster has been parsed.
1754 TEST_P(ChunkDemuxerTest, IncrementalClusterParsing) { 1749 TEST_P(ChunkDemuxerTest, IncrementalClusterParsing) {
1755 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1750 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1756 AppendEmptyCluster(0); 1751 AppendEmptyCluster(0);
1757 1752
1758 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); 1753 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
2287 CheckExpectedRanges("{ [0,66) }"); 2282 CheckExpectedRanges("{ [0,66) }");
2288 2283
2289 // Verify that the range reverts to the intersection when end of stream 2284 // Verify that the range reverts to the intersection when end of stream
2290 // has been cancelled. 2285 // has been cancelled.
2291 demuxer_->UnmarkEndOfStream(); 2286 demuxer_->UnmarkEndOfStream();
2292 CheckExpectedRanges("{ [0,46) }"); 2287 CheckExpectedRanges("{ [0,46) }");
2293 2288
2294 // Append and remove data so that the 2 streams' end ranges do not overlap. 2289 // Append and remove data so that the 2 streams' end ranges do not overlap.
2295 2290
2296 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(246))); 2291 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(246)));
2297 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(366))); 2292 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(398)));
2298 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K"); 2293 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K");
2299 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 2294 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
2300 "200K 233 266 299 300K 333"); 2295 "200K 233 266 299 332K 365");
2301 2296
2302 // At this point, the per-stream ranges are as follows: 2297 // At this point, the per-stream ranges are as follows:
2303 // Audio: [0,46) [200,246) 2298 // Audio: [0,46) [200,246)
2304 // Video: [0,66) [200,366) 2299 // Video: [0,66) [200,398)
2305 CheckExpectedRanges("{ [0,46) [200,246) }"); 2300 CheckExpectedRanges("{ [0,46) [200,246) }");
2306 2301
2307 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(200), 2302 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(200),
2308 base::TimeDelta::FromMilliseconds(300)); 2303 base::TimeDelta::FromMilliseconds(300));
2309 2304
2310 // At this point, the per-stream ranges are as follows: 2305 // At this point, the per-stream ranges are as follows:
2311 // Audio: [0,46) 2306 // Audio: [0,46)
2312 // Video: [0,66) [300,366) 2307 // Video: [0,66) [332,398)
2313 CheckExpectedRanges("{ [0,46) }"); 2308 CheckExpectedRanges("{ [0,46) }");
2314 2309
2315 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K"); 2310 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K");
2316 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "200K 233"); 2311 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "200K 233");
2317 2312
2318 // At this point, the per-stream ranges are as follows: 2313 // At this point, the per-stream ranges are as follows:
2319 // Audio: [0,46) [200,246) 2314 // Audio: [0,46) [200,246)
2320 // Video: [0,66) [200,266) [300,366) 2315 // Video: [0,66) [200,234) [332,398)
acolwell GONE FROM CHROMIUM 2014/04/11 18:16:05 nit: s/234/266/? Otherwise I'd expect the range in
DaleCurtis 2014/04/11 20:38:11 Done.
2321 // NOTE: The last range on each stream do not overlap in time. 2316 // NOTE: The last range on each stream do not overlap in time.
2322 CheckExpectedRanges("{ [0,46) [200,246) }"); 2317 CheckExpectedRanges("{ [0,46) [200,246) }");
2323 2318
2324 MarkEndOfStream(PIPELINE_OK); 2319 MarkEndOfStream(PIPELINE_OK);
2325 2320
2326 // NOTE: The last range on each stream gets extended to the highest 2321 // NOTE: The last range on each stream gets extended to the highest
2327 // end timestamp according to the spec. The last audio range gets extended 2322 // end timestamp according to the spec. The last audio range gets extended
2328 // from [200,246) to [200,366) which is why the intersection results in the 2323 // from [200,246) to [200,266) which is why the intersection results in the
acolwell GONE FROM CHROMIUM 2014/04/11 18:16:05 nit: s/266/398/
DaleCurtis 2014/04/11 20:38:11 Done.
2329 // middle range getting larger AND the new range appearing. 2324 // middle range getting larger AND the new range appearing.
2330 CheckExpectedRanges("{ [0,46) [200,266) [300,366) }"); 2325 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }");
2331 } 2326 }
2332 2327
2333 TEST_P(ChunkDemuxerTest, DifferentStreamTimecodes) { 2328 TEST_P(ChunkDemuxerTest, DifferentStreamTimecodes) {
2334 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2329 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2335 2330
2336 // Create a cluster where the video timecode begins 25ms after the audio. 2331 // Create a cluster where the video timecode begins 25ms after the audio.
2337 AppendCluster(GenerateCluster(0, 25, 8)); 2332 AppendCluster(GenerateCluster(0, 25, 8));
2338 2333
2339 Seek(base::TimeDelta::FromSeconds(0)); 2334 Seek(base::TimeDelta::FromSeconds(0));
2340 GenerateExpectedReads(0, 25, 8); 2335 GenerateExpectedReads(0, 25, 8);
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
2576 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); 2571 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
2577 2572
2578 // Fetch initial audio config and verify it matches what we expect. 2573 // Fetch initial audio config and verify it matches what we expect.
2579 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); 2574 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config();
2580 ASSERT_TRUE(audio_config_1.IsValidConfig()); 2575 ASSERT_TRUE(audio_config_1.IsValidConfig());
2581 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); 2576 EXPECT_EQ(audio_config_1.samples_per_second(), 44100);
2582 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); 2577 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u);
2583 2578
2584 ExpectRead(DemuxerStream::AUDIO, 0); 2579 ExpectRead(DemuxerStream::AUDIO, 0);
2585 2580
2581 // The first config change seen is from a splice frame representing an overlap
2582 // of buffer from config 1 by buffers from config 2.
2586 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2583 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2587
2588 ASSERT_EQ(status, DemuxerStream::kConfigChanged); 2584 ASSERT_EQ(status, DemuxerStream::kConfigChanged);
2589 EXPECT_EQ(last_timestamp.InMilliseconds(), 524); 2585 EXPECT_EQ(last_timestamp.InMilliseconds(), 524);
2586 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config()));
2587
2588 // The next is due to a typical config difference.
2589 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2590 ASSERT_EQ(status, DemuxerStream::kConfigChanged);
2591 EXPECT_EQ(last_timestamp.InMilliseconds(), 527);
2590 2592
2591 // Fetch the new decoder config. 2593 // Fetch the new decoder config.
2592 const AudioDecoderConfig& audio_config_2 = audio->audio_decoder_config(); 2594 const AudioDecoderConfig& audio_config_2 = audio->audio_decoder_config();
2593 ASSERT_TRUE(audio_config_2.IsValidConfig()); 2595 ASSERT_TRUE(audio_config_2.IsValidConfig());
2594 EXPECT_EQ(audio_config_2.samples_per_second(), 44100); 2596 EXPECT_EQ(audio_config_2.samples_per_second(), 44100);
2595 EXPECT_EQ(audio_config_2.extra_data_size(), 3935u); 2597 EXPECT_EQ(audio_config_2.extra_data_size(), 3935u);
2596 2598
2597 ExpectRead(DemuxerStream::AUDIO, 527); 2599 // The next config change is from a splice frame representing an overlap of
2598 2600 // buffers from config 2 by buffers from config 1.
2599 // Read until the next config change.
2600 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2601 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2601 ASSERT_EQ(status, DemuxerStream::kConfigChanged); 2602 ASSERT_EQ(status, DemuxerStream::kConfigChanged);
2602 EXPECT_EQ(last_timestamp.InMilliseconds(), 759); 2603 EXPECT_EQ(last_timestamp.InMilliseconds(), 782);
2604 ASSERT_TRUE(audio_config_2.Matches(audio->audio_decoder_config()));
2605
2606 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2607
2608 ASSERT_EQ(status, DemuxerStream::kConfigChanged);
2609 EXPECT_EQ(last_timestamp.InMilliseconds(), 779);
2603 2610
2604 // Get the new config and verify that it matches the first one. 2611 // Get the new config and verify that it matches the first one.
2605 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config())); 2612 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config()));
2606 2613
2607 ExpectRead(DemuxerStream::AUDIO, 779);
2608
2609 // Read until the end of the stream just to make sure there aren't any other 2614 // Read until the end of the stream just to make sure there aren't any other
2610 // config changes. 2615 // config changes.
2611 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2616 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2612 ASSERT_EQ(status, DemuxerStream::kOk); 2617 ASSERT_EQ(status, DemuxerStream::kOk);
2618 EXPECT_EQ(last_timestamp.InMilliseconds(), 2744);
2613 } 2619 }
2614 2620
2615 TEST_P(ChunkDemuxerTest, ConfigChange_Seek) { 2621 TEST_P(ChunkDemuxerTest, ConfigChange_Seek) {
2616 InSequence s; 2622 InSequence s;
2617 2623
2618 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2624 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2619 2625
2620 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 2626 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2621 2627
2622 // Fetch initial video config and verify it matches what we expect. 2628 // Fetch initial video config and verify it matches what we expect.
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
3207 // Verify that audio & video streams continue to return expected values. 3213 // Verify that audio & video streams continue to return expected values.
3208 CheckExpectedBuffers(audio_stream, "160 180"); 3214 CheckExpectedBuffers(audio_stream, "160 180");
3209 CheckExpectedBuffers(video_stream, "180 210"); 3215 CheckExpectedBuffers(video_stream, "180 210");
3210 } 3216 }
3211 3217
3212 // TODO(wolenetz): Enable testing of new frame processor based on this flag, 3218 // TODO(wolenetz): Enable testing of new frame processor based on this flag,
3213 // once the new processor has landed. See http://crbug.com/249422. 3219 // once the new processor has landed. See http://crbug.com/249422.
3214 INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, ChunkDemuxerTest, Values(true)); 3220 INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, ChunkDemuxerTest, Values(true));
3215 3221
3216 } // namespace media 3222 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/filters/pipeline_integration_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698