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

Side by Side Diff: content/common/gpu/media/video_encode_accelerator_unittest.cc

Issue 760963003: Adds fake hardware video encoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
wuchengli 2014/12/09 14:29:24 The change description should have a summary follo
hellner1 2014/12/10 22:38:59 Done. I did run vea unittests. But since cast_uni
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 "base/at_exit.h" 5 #include "base/at_exit.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/files/memory_mapped_file.h" 9 #include "base/files/memory_mapped_file.h"
10 #include "base/memory/scoped_vector.h" 10 #include "base/memory/scoped_vector.h"
11 #include "base/numerics/safe_conversions.h" 11 #include "base/numerics/safe_conversions.h"
12 #include "base/process/process_handle.h" 12 #include "base/process/process_handle.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/sys_byteorder.h" 15 #include "base/sys_byteorder.h"
16 #include "base/time/time.h" 16 #include "base/time/time.h"
17 #include "content/common/gpu/media/video_accelerator_unittest_helpers.h" 17 #include "content/common/gpu/media/video_accelerator_unittest_helpers.h"
18 #include "media/base/bind_to_current_loop.h" 18 #include "media/base/bind_to_current_loop.h"
19 #include "media/base/bitstream_buffer.h" 19 #include "media/base/bitstream_buffer.h"
20 #include "media/base/test_data_util.h" 20 #include "media/base/test_data_util.h"
21 #include "media/filters/h264_parser.h" 21 #include "media/filters/h264_parser.h"
22 #include "media/video/video_encode_accelerator.h" 22 #include "media/video/video_encode_accelerator.h"
23 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
24 24
25 #if defined(USE_X11) 25 #if defined(USE_X11)
26 #include "ui/gfx/x/x11_types.h" 26 #include "ui/gfx/x/x11_types.h"
27 #endif 27 #endif
28 28
29 #include "media/video/fake_video_encode_accelerator.h"
wuchengli 2014/12/09 14:29:24 move this before #include "media/video/video_encod
hellner1 2014/12/10 22:38:59 Done.
30
29 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) 31 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL)
30 #include "content/common/gpu/media/v4l2_video_encode_accelerator.h" 32 #include "content/common/gpu/media/v4l2_video_encode_accelerator.h"
31 #elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11) 33 #elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
32 #include "content/common/gpu/media/vaapi_video_encode_accelerator.h" 34 #include "content/common/gpu/media/vaapi_video_encode_accelerator.h"
33 #else 35 #else
34 #error The VideoEncodeAcceleratorUnittest is not supported on this platform. 36 #error The VideoEncodeAcceleratorUnittest is not supported on this platform.
35 #endif 37 #endif
36 38
37 using media::VideoEncodeAccelerator; 39 using media::VideoEncodeAccelerator;
38 40
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 uint64_t timestamp; // 64-bit presentation timestamp 123 uint64_t timestamp; // 64-bit presentation timestamp
122 } __attribute__((packed)); 124 } __attribute__((packed));
123 125
124 struct TestStream { 126 struct TestStream {
125 TestStream() 127 TestStream()
126 : num_frames(0), 128 : num_frames(0),
127 aligned_buffer_size(0), 129 aligned_buffer_size(0),
128 requested_bitrate(0), 130 requested_bitrate(0),
129 requested_framerate(0), 131 requested_framerate(0),
130 requested_subsequent_bitrate(0), 132 requested_subsequent_bitrate(0),
131 requested_subsequent_framerate(0) {} 133 requested_subsequent_framerate(0),
134 fake_encoder(0) {}
wuchengli 2014/12/09 14:29:24 Do you want to use different encoders for differen
hellner1 2014/12/10 22:38:58 I made fake_encoder selection a command line argum
132 ~TestStream() {} 135 ~TestStream() {}
133 136
134 gfx::Size visible_size; 137 gfx::Size visible_size;
135 gfx::Size coded_size; 138 gfx::Size coded_size;
136 unsigned int num_frames; 139 unsigned int num_frames;
137 140
138 // Original unaligned input file name provided as an argument to the test. 141 // Original unaligned input file name provided as an argument to the test.
139 // And the file must be an I420 (YUV planar) raw stream. 142 // And the file must be an I420 (YUV planar) raw stream.
140 std::string in_filename; 143 std::string in_filename;
141 144
142 // A temporary file used to prepare aligned input buffers of |in_filename|. 145 // A temporary file used to prepare aligned input buffers of |in_filename|.
143 // The file makes sure starting address of YUV planes are 64 byte-aligned. 146 // The file makes sure starting address of YUV planes are 64 byte-aligned.
144 base::FilePath aligned_in_file; 147 base::FilePath aligned_in_file;
145 148
146 // The memory mapping of |aligned_in_file| 149 // The memory mapping of |aligned_in_file|
147 base::MemoryMappedFile mapped_aligned_in_file; 150 base::MemoryMappedFile mapped_aligned_in_file;
148 151
149 // Byte size of a frame of |aligned_in_file|. 152 // Byte size of a frame of |aligned_in_file|.
150 size_t aligned_buffer_size; 153 size_t aligned_buffer_size;
151 154
152 // Byte size for each aligned plane of a frame 155 // Byte size for each aligned plane of a frame
153 std::vector<size_t> aligned_plane_size; 156 std::vector<size_t> aligned_plane_size;
154 157
155 std::string out_filename; 158 std::string out_filename;
156 media::VideoCodecProfile requested_profile; 159 media::VideoCodecProfile requested_profile;
157 unsigned int requested_bitrate; 160 unsigned int requested_bitrate;
158 unsigned int requested_framerate; 161 unsigned int requested_framerate;
159 unsigned int requested_subsequent_bitrate; 162 unsigned int requested_subsequent_bitrate;
160 unsigned int requested_subsequent_framerate; 163 unsigned int requested_subsequent_framerate;
164 int fake_encoder;
wuchengli 2014/12/09 14:29:24 Use bool.
hellner1 2014/12/10 22:38:58 Done.
161 }; 165 };
162 166
163 inline static size_t Align64Bytes(size_t value) { 167 inline static size_t Align64Bytes(size_t value) {
164 return (value + 63) & ~63; 168 return (value + 63) & ~63;
165 } 169 }
166 170
167 // Write |data| of |size| bytes at |offset| bytes into |file|. 171 // Write |data| of |size| bytes at |offset| bytes into |file|.
168 static bool WriteFile(base::File* file, 172 static bool WriteFile(base::File* file,
169 const off_t offset, 173 const off_t offset,
170 const uint8* data, 174 const uint8* data,
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 // Split the string to individual test stream data. 301 // Split the string to individual test stream data.
298 std::vector<base::FilePath::StringType> test_streams_data; 302 std::vector<base::FilePath::StringType> test_streams_data;
299 base::SplitString(data, ';', &test_streams_data); 303 base::SplitString(data, ';', &test_streams_data);
300 CHECK_GE(test_streams_data.size(), 1U) << data; 304 CHECK_GE(test_streams_data.size(), 1U) << data;
301 305
302 // Parse each test stream data and read the input file. 306 // Parse each test stream data and read the input file.
303 for (size_t index = 0; index < test_streams_data.size(); ++index) { 307 for (size_t index = 0; index < test_streams_data.size(); ++index) {
304 std::vector<base::FilePath::StringType> fields; 308 std::vector<base::FilePath::StringType> fields;
305 base::SplitString(test_streams_data[index], ':', &fields); 309 base::SplitString(test_streams_data[index], ':', &fields);
306 CHECK_GE(fields.size(), 4U) << data; 310 CHECK_GE(fields.size(), 4U) << data;
307 CHECK_LE(fields.size(), 9U) << data; 311 CHECK_LE(fields.size(), 10U) << data;
308 TestStream* test_stream = new TestStream(); 312 TestStream* test_stream = new TestStream();
309 313
310 test_stream->in_filename = fields[0]; 314 test_stream->in_filename = fields[0];
311 int width, height; 315 int width, height;
312 CHECK(base::StringToInt(fields[1], &width)); 316 CHECK(base::StringToInt(fields[1], &width));
313 CHECK(base::StringToInt(fields[2], &height)); 317 CHECK(base::StringToInt(fields[2], &height));
314 test_stream->visible_size = gfx::Size(width, height); 318 test_stream->visible_size = gfx::Size(width, height);
315 CHECK(!test_stream->visible_size.IsEmpty()); 319 CHECK(!test_stream->visible_size.IsEmpty());
316 int profile; 320 int profile;
317 CHECK(base::StringToInt(fields[3], &profile)); 321 CHECK(base::StringToInt(fields[3], &profile));
(...skipping 13 matching lines...) Expand all
331 335
332 if (fields.size() >= 8 && !fields[7].empty()) { 336 if (fields.size() >= 8 && !fields[7].empty()) {
333 CHECK(base::StringToUint(fields[7], 337 CHECK(base::StringToUint(fields[7],
334 &test_stream->requested_subsequent_bitrate)); 338 &test_stream->requested_subsequent_bitrate));
335 } 339 }
336 340
337 if (fields.size() >= 9 && !fields[8].empty()) { 341 if (fields.size() >= 9 && !fields[8].empty()) {
338 CHECK(base::StringToUint(fields[8], 342 CHECK(base::StringToUint(fields[8],
339 &test_stream->requested_subsequent_framerate)); 343 &test_stream->requested_subsequent_framerate));
340 } 344 }
345 if (fields.size() >= 10 && !fields[9].empty()) {
346 CHECK(base::StringToInt(fields[9], &test_stream->fake_encoder));
347 }
341 test_streams->push_back(test_stream); 348 test_streams->push_back(test_stream);
342 } 349 }
343 } 350 }
344 351
345 enum ClientState { 352 enum ClientState {
346 CS_CREATED, 353 CS_CREATED,
347 CS_ENCODER_SET, 354 CS_ENCODER_SET,
348 CS_INITIALIZED, 355 CS_INITIALIZED,
349 CS_ENCODING, 356 CS_ENCODING,
350 CS_FINISHED, 357 CS_FINISHED,
351 CS_ERROR, 358 CS_ERROR,
352 }; 359 };
353 360
354 // Performs basic, codec-specific sanity checks on the stream buffers passed 361 // Performs basic, codec-specific sanity checks on the stream buffers passed
355 // to ProcessStreamBuffer(): whether we've seen keyframes before non-keyframes, 362 // to ProcessStreamBuffer(): whether we've seen keyframes before non-keyframes,
356 // correct sequences of H.264 NALUs (SPS before PPS and before slices), etc. 363 // correct sequences of H.264 NALUs (SPS before PPS and before slices), etc.
357 // Calls given FrameFoundCallback when a complete frame is found while 364 // Calls given FrameFoundCallback when a complete frame is found while
358 // processing. 365 // processing.
359 class StreamValidator { 366 class StreamValidator {
360 public: 367 public:
361 // To be called when a complete frame is found while processing a stream 368 // To be called when a complete frame is found while processing a stream
362 // buffer, passing true if the frame is a keyframe. Returns false if we 369 // buffer, passing true if the frame is a keyframe. Returns false if we
363 // are not interested in more frames and further processing should be aborted. 370 // are not interested in more frames and further processing should be aborted.
364 typedef base::Callback<bool(bool)> FrameFoundCallback; 371 typedef base::Callback<bool(bool)> FrameFoundCallback;
365 372
366 virtual ~StreamValidator() {} 373 virtual ~StreamValidator() {}
367 374
368 // Provide a StreamValidator instance for the given |profile|. 375 // Provide a StreamValidator instance for the given |profile|.
369 static scoped_ptr<StreamValidator> Create(media::VideoCodecProfile profile, 376 static scoped_ptr<StreamValidator> Create(media::VideoCodecProfile profile,
370 const FrameFoundCallback& frame_cb); 377 const FrameFoundCallback& frame_cb,
378 bool fake_stream);
371 379
372 // Process and verify contents of a bitstream buffer. 380 // Process and verify contents of a bitstream buffer.
373 virtual void ProcessStreamBuffer(const uint8* stream, size_t size) = 0; 381 virtual void ProcessStreamBuffer(const uint8* stream, size_t size) = 0;
374 382
375 protected: 383 protected:
376 explicit StreamValidator(const FrameFoundCallback& frame_cb) 384 explicit StreamValidator(const FrameFoundCallback& frame_cb)
377 : frame_cb_(frame_cb) {} 385 : frame_cb_(frame_cb) {}
378 386
379 FrameFoundCallback frame_cb_; 387 FrameFoundCallback frame_cb_;
380 }; 388 };
381 389
390 class PassThroughValidator : public StreamValidator {
391 public:
392 explicit PassThroughValidator(const FrameFoundCallback& frame_cb)
393 : StreamValidator(frame_cb) {}
394 void ProcessStreamBuffer(const uint8* stream, size_t size) override;
395 };
396
397 void PassThroughValidator::ProcessStreamBuffer(
398 const uint8* stream,
399 size_t size) {
400 const bool keyframe = !(stream[0] & 0x01);
wuchengli 2014/12/09 14:29:25 This is a hidden dependency to FakeVideoEncodeAcce
hellner1 2014/12/10 22:38:58 Removed the need for this as suggested in other co
401 frame_cb_.Run(keyframe);
402 }
403
382 class H264Validator : public StreamValidator { 404 class H264Validator : public StreamValidator {
383 public: 405 public:
384 explicit H264Validator(const FrameFoundCallback& frame_cb) 406 explicit H264Validator(const FrameFoundCallback& frame_cb)
385 : StreamValidator(frame_cb), 407 : StreamValidator(frame_cb),
386 seen_sps_(false), 408 seen_sps_(false),
387 seen_pps_(false), 409 seen_pps_(false),
388 seen_idr_(false) {} 410 seen_idr_(false) {}
389 411
390 virtual void ProcessStreamBuffer(const uint8* stream, size_t size) override; 412 virtual void ProcessStreamBuffer(const uint8* stream, size_t size) override;
391 413
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 492
471 frame_cb_.Run(keyframe); 493 frame_cb_.Run(keyframe);
472 // TODO(posciak): We could be getting more frames in the buffer, but there is 494 // TODO(posciak): We could be getting more frames in the buffer, but there is
473 // no simple way to detect this. We'd need to parse the frames and go through 495 // no simple way to detect this. We'd need to parse the frames and go through
474 // partition numbers/sizes. For now assume one frame per buffer. 496 // partition numbers/sizes. For now assume one frame per buffer.
475 } 497 }
476 498
477 // static 499 // static
478 scoped_ptr<StreamValidator> StreamValidator::Create( 500 scoped_ptr<StreamValidator> StreamValidator::Create(
479 media::VideoCodecProfile profile, 501 media::VideoCodecProfile profile,
480 const FrameFoundCallback& frame_cb) { 502 const FrameFoundCallback& frame_cb,
503 bool fake_stream) {
481 scoped_ptr<StreamValidator> validator; 504 scoped_ptr<StreamValidator> validator;
482 505
483 if (IsH264(profile)) { 506 if (fake_stream) {
507 validator.reset(new PassThroughValidator(frame_cb));
508 } else if (IsH264(profile)) {
484 validator.reset(new H264Validator(frame_cb)); 509 validator.reset(new H264Validator(frame_cb));
485 } else if (IsVP8(profile)) { 510 } else if (IsVP8(profile)) {
486 validator.reset(new VP8Validator(frame_cb)); 511 validator.reset(new VP8Validator(frame_cb));
487 } else { 512 } else {
488 LOG(FATAL) << "Unsupported profile: " << profile; 513 LOG(FATAL) << "Unsupported profile: " << profile;
489 } 514 }
490 515
491 return validator.Pass(); 516 return validator.Pass();
492 } 517 }
493 518
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 test_perf_(test_perf), 707 test_perf_(test_perf),
683 requested_bitrate_(0), 708 requested_bitrate_(0),
684 requested_framerate_(0), 709 requested_framerate_(0),
685 requested_subsequent_bitrate_(0), 710 requested_subsequent_bitrate_(0),
686 requested_subsequent_framerate_(0) { 711 requested_subsequent_framerate_(0) {
687 if (keyframe_period_) 712 if (keyframe_period_)
688 CHECK_LT(kMaxKeyframeDelay, keyframe_period_); 713 CHECK_LT(kMaxKeyframeDelay, keyframe_period_);
689 714
690 validator_ = StreamValidator::Create( 715 validator_ = StreamValidator::Create(
691 test_stream_->requested_profile, 716 test_stream_->requested_profile,
692 base::Bind(&VEAClient::HandleEncodedFrame, base::Unretained(this))); 717 base::Bind(&VEAClient::HandleEncodedFrame, base::Unretained(this)),
718 test_stream_->fake_encoder);
693 719
694 CHECK(validator_.get()); 720 CHECK(validator_.get());
695 721
696 if (save_to_file_) { 722 if (save_to_file_) {
697 CHECK(!test_stream_->out_filename.empty()); 723 CHECK(!test_stream_->out_filename.empty());
698 base::FilePath out_filename(test_stream_->out_filename); 724 base::FilePath out_filename(test_stream_->out_filename);
699 // This creates or truncates out_filename. 725 // This creates or truncates out_filename.
700 // Without it, AppendToFile() will not work. 726 // Without it, AppendToFile() will not work.
701 EXPECT_EQ(0, base::WriteFile(out_filename, NULL, 0)); 727 EXPECT_EQ(0, base::WriteFile(out_filename, NULL, 0));
702 } 728 }
703 729
704 // Initialize the parameters of the test streams. 730 // Initialize the parameters of the test streams.
705 UpdateTestStreamData(mid_stream_bitrate_switch, mid_stream_framerate_switch); 731 UpdateTestStreamData(mid_stream_bitrate_switch, mid_stream_framerate_switch);
706 732
707 thread_checker_.DetachFromThread(); 733 thread_checker_.DetachFromThread();
708 } 734 }
709 735
710 VEAClient::~VEAClient() { CHECK(!has_encoder()); } 736 VEAClient::~VEAClient() { CHECK(!has_encoder()); }
711 737
712 void VEAClient::CreateEncoder() { 738 void VEAClient::CreateEncoder() {
713 DCHECK(thread_checker_.CalledOnValidThread()); 739 DCHECK(thread_checker_.CalledOnValidThread());
714 CHECK(!has_encoder()); 740 CHECK(!has_encoder());
715 741
742
743 if (test_stream_->fake_encoder) {
744 std::vector<uint32> no_stored_bitrates;
745 encoder_.reset(
746 new media::FakeVideoEncodeAccelerator(
747 scoped_refptr<base::SingleThreadTaskRunner>(
748 base::MessageLoopProxy::current()),
749 no_stored_bitrates));
750 } else {
716 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) 751 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL)
717 scoped_ptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kEncoder); 752 scoped_ptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kEncoder);
718 encoder_.reset(new V4L2VideoEncodeAccelerator(device.Pass())); 753 encoder_.reset(new V4L2VideoEncodeAccelerator(device.Pass()));
719 #elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11) 754 #elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
720 encoder_.reset(new VaapiVideoEncodeAccelerator(gfx::GetXDisplay())); 755 encoder_.reset(new VaapiVideoEncodeAccelerator(gfx::GetXDisplay()));
721 #endif 756 #endif
757 }
722 758
723 SetState(CS_ENCODER_SET); 759 SetState(CS_ENCODER_SET);
724 760
725 DVLOG(1) << "Profile: " << test_stream_->requested_profile 761 DVLOG(1) << "Profile: " << test_stream_->requested_profile
726 << ", initial bitrate: " << requested_bitrate_; 762 << ", initial bitrate: " << requested_bitrate_;
727 if (!encoder_->Initialize(kInputFormat, 763 if (!encoder_->Initialize(kInputFormat,
728 test_stream_->visible_size, 764 test_stream_->visible_size,
729 test_stream_->requested_profile, 765 test_stream_->requested_profile,
730 requested_bitrate_, 766 requested_bitrate_,
731 this)) { 767 this)) {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 base::SharedMemory* shm = it->second; 881 base::SharedMemory* shm = it->second;
846 output_buffers_at_client_.erase(it); 882 output_buffers_at_client_.erase(it);
847 883
848 if (state_ == CS_FINISHED) 884 if (state_ == CS_FINISHED)
849 return; 885 return;
850 886
851 encoded_stream_size_since_last_check_ += payload_size; 887 encoded_stream_size_since_last_check_ += payload_size;
852 888
853 const uint8* stream_ptr = static_cast<const uint8*>(shm->memory()); 889 const uint8* stream_ptr = static_cast<const uint8*>(shm->memory());
854 if (payload_size > 0) { 890 if (payload_size > 0) {
855 validator_->ProcessStreamBuffer(stream_ptr, payload_size); 891 validator_->ProcessStreamBuffer(stream_ptr, payload_size);
wuchengli 2014/12/09 14:29:24 I think it's simpler to set |validator_| to NULL i
hellner1 2014/12/10 22:38:58 Good suggestion! Done.
856 892
857 if (save_to_file_) { 893 if (save_to_file_) {
858 if (IsVP8(test_stream_->requested_profile)) 894 if (IsVP8(test_stream_->requested_profile))
859 WriteIvfFrameHeader(num_encoded_frames_ - 1, payload_size); 895 WriteIvfFrameHeader(num_encoded_frames_ - 1, payload_size);
860 896
861 EXPECT_TRUE(base::AppendToFile( 897 EXPECT_TRUE(base::AppendToFile(
862 base::FilePath::FromUTF8Unsafe(test_stream_->out_filename), 898 base::FilePath::FromUTF8Unsafe(test_stream_->out_filename),
863 static_cast<char*>(shm->memory()), 899 static_cast<char*>(shm->memory()),
864 base::checked_cast<int>(payload_size))); 900 base::checked_cast<int>(payload_size)));
865 } 901 }
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 } 1311 }
1276 1312
1277 content::g_env = 1313 content::g_env =
1278 reinterpret_cast<content::VideoEncodeAcceleratorTestEnvironment*>( 1314 reinterpret_cast<content::VideoEncodeAcceleratorTestEnvironment*>(
1279 testing::AddGlobalTestEnvironment( 1315 testing::AddGlobalTestEnvironment(
1280 new content::VideoEncodeAcceleratorTestEnvironment( 1316 new content::VideoEncodeAcceleratorTestEnvironment(
1281 test_stream_data.Pass()))); 1317 test_stream_data.Pass())));
1282 1318
1283 return RUN_ALL_TESTS(); 1319 return RUN_ALL_TESTS();
1284 } 1320 }
OLDNEW
« no previous file with comments | « no previous file | media/cast/cast_testing.gypi » ('j') | media/cast/sender/external_video_encoder_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698