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

Side by Side Diff: content/renderer/media/media_stream_video_track_unittest.cc

Issue 2964003002: Remove support for old getUserMedia video constraints algorithm. (Closed)
Patch Set: rebase and address hbos@ comments Created 3 years, 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <stdint.h> 5 #include <stdint.h>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h" 11 #include "base/run_loop.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "base/test/scoped_feature_list.h"
14 #include "base/threading/thread_checker_impl.h" 13 #include "base/threading/thread_checker_impl.h"
15 #include "content/child/child_process.h" 14 #include "content/child/child_process.h"
16 #include "content/public/common/content_features.h"
17 #include "content/renderer/media/media_stream_video_track.h" 15 #include "content/renderer/media/media_stream_video_track.h"
18 #include "content/renderer/media/mock_media_stream_video_sink.h" 16 #include "content/renderer/media/mock_media_stream_video_sink.h"
19 #include "content/renderer/media/mock_media_stream_video_source.h" 17 #include "content/renderer/media/mock_media_stream_video_source.h"
20 #include "content/renderer/media/video_track_adapter.h" 18 #include "content/renderer/media/video_track_adapter.h"
21 #include "media/base/video_frame.h" 19 #include "media/base/video_frame.h"
22 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
23 #include "third_party/WebKit/public/web/WebHeap.h" 21 #include "third_party/WebKit/public/web/WebHeap.h"
24 22
25 namespace content { 23 namespace content {
26 24
27 const uint8_t kBlackValue = 0x00; 25 const uint8_t kBlackValue = 0x00;
28 const uint8_t kColorValue = 0xAB; 26 const uint8_t kColorValue = 0xAB;
29 const int kMockSourceWidth = 640; 27 const int kMockSourceWidth = 640;
30 const int kMockSourceHeight = 480; 28 const int kMockSourceHeight = 480;
31 29
32 ACTION_P(RunClosure, closure) { 30 ACTION_P(RunClosure, closure) {
33 closure.Run(); 31 closure.Run();
34 } 32 }
35 33
36 class MediaStreamVideoTrackTest : public ::testing::Test { 34 class MediaStreamVideoTrackTest : public ::testing::Test {
37 public: 35 public:
38 MediaStreamVideoTrackTest() 36 MediaStreamVideoTrackTest()
39 : child_process_(new ChildProcess()), 37 : child_process_(new ChildProcess()),
40 mock_source_(nullptr), 38 mock_source_(nullptr),
41 source_started_(false) { 39 source_started_(false) {}
42 scoped_feature_list_.InitAndDisableFeature(
43 features::kMediaStreamOldVideoConstraints);
44 }
45 40
46 ~MediaStreamVideoTrackTest() override {} 41 ~MediaStreamVideoTrackTest() override {}
47 42
48 void TearDown() override { 43 void TearDown() override {
49 blink_source_.Reset(); 44 blink_source_.Reset();
50 blink::WebHeap::CollectAllGarbageForTesting(); 45 blink::WebHeap::CollectAllGarbageForTesting();
51 } 46 }
52 47
53 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) { 48 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) {
54 base::RunLoop run_loop; 49 base::RunLoop run_loop;
55 base::Closure quit_closure = run_loop.QuitClosure(); 50 base::Closure quit_closure = run_loop.QuitClosure();
56 EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure)); 51 EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure));
57 const scoped_refptr<media::VideoFrame> frame = 52 const scoped_refptr<media::VideoFrame> frame =
58 media::VideoFrame::CreateColorFrame( 53 media::VideoFrame::CreateColorFrame(
59 gfx::Size(MediaStreamVideoSource::kDefaultWidth, 54 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
60 MediaStreamVideoSource::kDefaultHeight), 55 MediaStreamVideoSource::kDefaultHeight),
61 kColorValue, kColorValue, kColorValue, base::TimeDelta()); 56 kColorValue, kColorValue, kColorValue, base::TimeDelta());
62 mock_source()->DeliverVideoFrame(frame); 57 mock_source()->DeliverVideoFrame(frame);
63 run_loop.Run(); 58 run_loop.Run();
64 } 59 }
65 60
66 protected: 61 protected:
67 base::MessageLoop* io_message_loop() const { 62 base::MessageLoop* io_message_loop() const {
68 return child_process_->io_message_loop(); 63 return child_process_->io_message_loop();
69 } 64 }
70 65
71 void InitializeSource() { 66 void InitializeSource() {
72 blink_source_.Reset(); 67 blink_source_.Reset();
73 mock_source_ = IsOldVideoConstraints() 68 mock_source_ = new MockMediaStreamVideoSource(
74 ? new MockMediaStreamVideoSource(false) 69 media::VideoCaptureFormat(
75 : new MockMediaStreamVideoSource( 70 gfx::Size(kMockSourceWidth, kMockSourceHeight), 30.0,
76 media::VideoCaptureFormat( 71 media::PIXEL_FORMAT_I420),
77 gfx::Size(kMockSourceWidth, kMockSourceHeight), 72 false);
78 30.0, media::PIXEL_FORMAT_I420),
79 false);
80 blink_source_.Initialize(blink::WebString::FromASCII("dummy_source_id"), 73 blink_source_.Initialize(blink::WebString::FromASCII("dummy_source_id"),
81 blink::WebMediaStreamSource::kTypeVideo, 74 blink::WebMediaStreamSource::kTypeVideo,
82 blink::WebString::FromASCII("dummy_source_name"), 75 blink::WebString::FromASCII("dummy_source_name"),
83 false /* remote */); 76 false /* remote */);
84 blink_source_.SetExtraData(mock_source_); 77 blink_source_.SetExtraData(mock_source_);
85 } 78 }
86 79
87 // Create a track that's associated with |mock_source_|. 80 // Create a track that's associated with |mock_source_|.
88 blink::WebMediaStreamTrack CreateTrack() { 81 blink::WebMediaStreamTrack CreateTrack() {
89 const bool enabled = true; 82 const bool enabled = true;
(...skipping 16 matching lines...) Expand all
106 MediaStreamSource::ConstraintsCallback(), enabled); 99 MediaStreamSource::ConstraintsCallback(), enabled);
107 if (!source_started_) { 100 if (!source_started_) {
108 mock_source_->StartMockedSource(); 101 mock_source_->StartMockedSource();
109 source_started_ = true; 102 source_started_ = true;
110 } 103 }
111 return track; 104 return track;
112 } 105 }
113 106
114 void UpdateVideoSourceToRespondToRequestRefreshFrame() { 107 void UpdateVideoSourceToRespondToRequestRefreshFrame() {
115 blink_source_.Reset(); 108 blink_source_.Reset();
116 mock_source_ = IsOldVideoConstraints() 109 mock_source_ = new MockMediaStreamVideoSource(
117 ? new MockMediaStreamVideoSource(false, true) 110 media::VideoCaptureFormat(
118 : new MockMediaStreamVideoSource( 111 gfx::Size(kMockSourceWidth, kMockSourceHeight), 30.0,
119 media::VideoCaptureFormat( 112 media::PIXEL_FORMAT_I420),
120 gfx::Size(kMockSourceWidth, kMockSourceHeight), 113 true);
121 30.0, media::PIXEL_FORMAT_I420),
122 true);
123 blink_source_.Initialize(blink::WebString::FromASCII("dummy_source_id"), 114 blink_source_.Initialize(blink::WebString::FromASCII("dummy_source_id"),
124 blink::WebMediaStreamSource::kTypeVideo, 115 blink::WebMediaStreamSource::kTypeVideo,
125 blink::WebString::FromASCII("dummy_source_name"), 116 blink::WebString::FromASCII("dummy_source_name"),
126 false /* remote */); 117 false /* remote */);
127 blink_source_.SetExtraData(mock_source_); 118 blink_source_.SetExtraData(mock_source_);
128 } 119 }
129 120
130 MockMediaStreamVideoSource* mock_source() { return mock_source_; } 121 MockMediaStreamVideoSource* mock_source() { return mock_source_; }
131 const blink::WebMediaStreamSource& blink_source() const { 122 const blink::WebMediaStreamSource& blink_source() const {
132 return blink_source_; 123 return blink_source_;
133 } 124 }
134 125
135 private: 126 private:
136 const base::MessageLoopForUI message_loop_; 127 const base::MessageLoopForUI message_loop_;
137 const std::unique_ptr<ChildProcess> child_process_; 128 const std::unique_ptr<ChildProcess> child_process_;
138 blink::WebMediaStreamSource blink_source_; 129 blink::WebMediaStreamSource blink_source_;
139 // |mock_source_| is owned by |webkit_source_|. 130 // |mock_source_| is owned by |webkit_source_|.
140 MockMediaStreamVideoSource* mock_source_; 131 MockMediaStreamVideoSource* mock_source_;
141 bool source_started_; 132 bool source_started_;
142 base::test::ScopedFeatureList scoped_feature_list_;
143 }; 133 };
144 134
145 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) { 135 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) {
146 InitializeSource(); 136 InitializeSource();
147 MockMediaStreamVideoSink sink; 137 MockMediaStreamVideoSink sink;
148 blink::WebMediaStreamTrack track = CreateTrack(); 138 blink::WebMediaStreamTrack track = CreateTrack();
149 sink.ConnectToTrack(track); 139 sink.ConnectToTrack(track);
150 140
151 DeliverVideoFrameAndWaitForRenderer(&sink); 141 DeliverVideoFrameAndWaitForRenderer(&sink);
152 EXPECT_EQ(1, sink.number_of_frames()); 142 EXPECT_EQ(1, sink.number_of_frames());
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 blink::WebMediaStreamTrack::Settings settings; 331 blink::WebMediaStreamTrack::Settings settings;
342 native_track->GetSettings(settings); 332 native_track->GetSettings(settings);
343 EXPECT_EQ(-1, settings.width); 333 EXPECT_EQ(-1, settings.width);
344 EXPECT_EQ(-1, settings.height); 334 EXPECT_EQ(-1, settings.height);
345 EXPECT_EQ(-1, settings.frame_rate); 335 EXPECT_EQ(-1, settings.frame_rate);
346 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::kNone, 336 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::kNone,
347 settings.facing_mode); 337 settings.facing_mode);
348 EXPECT_TRUE(settings.device_id.IsNull()); 338 EXPECT_TRUE(settings.device_id.IsNull());
349 } 339 }
350 340
351 // TODO(guidou): Remove this test. http://crbug.com/706408
352 class MediaStreamVideoTrackOldConstraintsTest : public ::testing::Test {
353 public:
354 MediaStreamVideoTrackOldConstraintsTest()
355 : child_process_(new ChildProcess()),
356 mock_source_(nullptr),
357 source_started_(false) {
358 scoped_feature_list_.InitAndEnableFeature(
359 features::kMediaStreamOldVideoConstraints);
360 }
361
362 ~MediaStreamVideoTrackOldConstraintsTest() override {}
363
364 void TearDown() override {
365 blink_source_.Reset();
366 blink::WebHeap::CollectAllGarbageForTesting();
367 }
368
369 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) {
370 base::RunLoop run_loop;
371 base::Closure quit_closure = run_loop.QuitClosure();
372 EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure));
373 const scoped_refptr<media::VideoFrame> frame =
374 media::VideoFrame::CreateColorFrame(
375 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
376 MediaStreamVideoSource::kDefaultHeight),
377 kColorValue, kColorValue, kColorValue, base::TimeDelta());
378 mock_source()->DeliverVideoFrame(frame);
379 run_loop.Run();
380 }
381
382 protected:
383 base::MessageLoop* io_message_loop() const {
384 return child_process_->io_message_loop();
385 }
386
387 void InitializeSource() {
388 blink_source_.Reset();
389 mock_source_ = IsOldVideoConstraints()
390 ? new MockMediaStreamVideoSource(false)
391 : new MockMediaStreamVideoSource(
392 media::VideoCaptureFormat(
393 gfx::Size(kMockSourceWidth, kMockSourceHeight),
394 30.0, media::PIXEL_FORMAT_I420),
395 false);
396 blink_source_.Initialize(blink::WebString::FromASCII("dummy_source_id"),
397 blink::WebMediaStreamSource::kTypeVideo,
398 blink::WebString::FromASCII("dummy_source_name"),
399 false /* remote */);
400 blink_source_.SetExtraData(mock_source_);
401 }
402
403 // Create a track that's associated with |mock_source_|.
404 blink::WebMediaStreamTrack CreateTrack() {
405 const bool enabled = true;
406 blink::WebMediaStreamTrack track = MediaStreamVideoTrack::CreateVideoTrack(
407 mock_source_, MediaStreamSource::ConstraintsCallback(), enabled);
408 if (!source_started_) {
409 mock_source_->StartMockedSource();
410 source_started_ = true;
411 }
412 return track;
413 }
414
415 void UpdateVideoSourceToRespondToRequestRefreshFrame() {
416 blink_source_.Reset();
417 mock_source_ = IsOldVideoConstraints()
418 ? new MockMediaStreamVideoSource(false, true)
419 : new MockMediaStreamVideoSource(
420 media::VideoCaptureFormat(
421 gfx::Size(kMockSourceWidth, kMockSourceHeight),
422 30.0, media::PIXEL_FORMAT_I420),
423 true);
424 blink_source_.Initialize(blink::WebString::FromASCII("dummy_source_id"),
425 blink::WebMediaStreamSource::kTypeVideo,
426 blink::WebString::FromASCII("dummy_source_name"),
427 false /* remote */);
428 blink_source_.SetExtraData(mock_source_);
429 }
430
431 MockMediaStreamVideoSource* mock_source() { return mock_source_; }
432 const blink::WebMediaStreamSource& blink_source() const {
433 return blink_source_;
434 }
435
436 private:
437 const base::MessageLoopForUI message_loop_;
438 const std::unique_ptr<ChildProcess> child_process_;
439 blink::WebMediaStreamSource blink_source_;
440 // |mock_source_| is owned by |webkit_source_|.
441 MockMediaStreamVideoSource* mock_source_;
442 bool source_started_;
443 base::test::ScopedFeatureList scoped_feature_list_;
444 };
445
446 TEST_F(MediaStreamVideoTrackOldConstraintsTest, AddAndRemoveSink) {
447 InitializeSource();
448 MockMediaStreamVideoSink sink;
449 blink::WebMediaStreamTrack track = CreateTrack();
450 sink.ConnectToTrack(track);
451
452 DeliverVideoFrameAndWaitForRenderer(&sink);
453 EXPECT_EQ(1, sink.number_of_frames());
454
455 DeliverVideoFrameAndWaitForRenderer(&sink);
456
457 sink.DisconnectFromTrack();
458
459 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::CreateBlackFrame(
460 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
461 MediaStreamVideoSource::kDefaultHeight));
462 mock_source()->DeliverVideoFrame(frame);
463 // Wait for the IO thread to complete delivering frames.
464 base::RunLoop().RunUntilIdle();
465 EXPECT_EQ(2, sink.number_of_frames());
466 }
467
468 // Checks that the callback given to the track is reset on the right thread.
469 TEST_F(MediaStreamVideoTrackOldConstraintsTest, ResetCallbackOnThread) {
470 InitializeSource();
471 MockMediaStreamVideoSink sink;
472 blink::WebMediaStreamTrack track = CreateTrack();
473
474 base::RunLoop run_loop;
475 bool correct = false;
476 sink.ConnectToTrackWithCallback(
477 track, base::Bind(&CheckThreadVideoFrameReceiver,
478 base::Owned(new CheckThreadHelper(
479 run_loop.QuitClosure(), &correct))));
480 sink.DisconnectFromTrack();
481 run_loop.Run();
482 EXPECT_TRUE(correct) << "Not called on correct thread.";
483 }
484
485 TEST_F(MediaStreamVideoTrackOldConstraintsTest, SetEnabled) {
486 InitializeSource();
487 MockMediaStreamVideoSink sink;
488 blink::WebMediaStreamTrack track = CreateTrack();
489 sink.ConnectToTrack(track);
490
491 MediaStreamVideoTrack* video_track =
492 MediaStreamVideoTrack::GetVideoTrack(track);
493
494 DeliverVideoFrameAndWaitForRenderer(&sink);
495 EXPECT_EQ(1, sink.number_of_frames());
496 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
497
498 video_track->SetEnabled(false);
499 EXPECT_FALSE(sink.enabled());
500
501 DeliverVideoFrameAndWaitForRenderer(&sink);
502 EXPECT_EQ(2, sink.number_of_frames());
503 EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
504
505 video_track->SetEnabled(true);
506 EXPECT_TRUE(sink.enabled());
507 DeliverVideoFrameAndWaitForRenderer(&sink);
508 EXPECT_EQ(3, sink.number_of_frames());
509 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
510 sink.DisconnectFromTrack();
511 }
512
513 TEST_F(MediaStreamVideoTrackOldConstraintsTest, SourceStopped) {
514 InitializeSource();
515 MockMediaStreamVideoSink sink;
516 blink::WebMediaStreamTrack track = CreateTrack();
517 sink.ConnectToTrack(track);
518 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateLive, sink.state());
519
520 mock_source()->StopSource();
521 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateEnded, sink.state());
522 sink.DisconnectFromTrack();
523 }
524
525 TEST_F(MediaStreamVideoTrackOldConstraintsTest, StopLastTrack) {
526 InitializeSource();
527 MockMediaStreamVideoSink sink1;
528 blink::WebMediaStreamTrack track1 = CreateTrack();
529 sink1.ConnectToTrack(track1);
530 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateLive, sink1.state());
531
532 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateLive,
533 blink_source().GetReadyState());
534
535 MockMediaStreamVideoSink sink2;
536 blink::WebMediaStreamTrack track2 = CreateTrack();
537 sink2.ConnectToTrack(track2);
538 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateLive, sink2.state());
539
540 MediaStreamVideoTrack* const native_track1 =
541 MediaStreamVideoTrack::GetVideoTrack(track1);
542 native_track1->Stop();
543 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateEnded, sink1.state());
544 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateLive,
545 blink_source().GetReadyState());
546 sink1.DisconnectFromTrack();
547
548 MediaStreamVideoTrack* const native_track2 =
549 MediaStreamVideoTrack::GetVideoTrack(track2);
550 native_track2->Stop();
551 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateEnded, sink2.state());
552 EXPECT_EQ(blink::WebMediaStreamSource::kReadyStateEnded,
553 blink_source().GetReadyState());
554 sink2.DisconnectFromTrack();
555 }
556
557 TEST_F(MediaStreamVideoTrackOldConstraintsTest,
558 CheckTrackRequestsFrameOldConstraintsOldConstraints) {
559 UpdateVideoSourceToRespondToRequestRefreshFrame();
560 blink::WebMediaStreamTrack track = CreateTrack();
561
562 // Add sink and expect to get a frame.
563 MockMediaStreamVideoSink sink;
564 base::RunLoop run_loop;
565 base::Closure quit_closure = run_loop.QuitClosure();
566 EXPECT_CALL(sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure));
567 sink.ConnectToTrack(track);
568 run_loop.Run();
569 EXPECT_EQ(1, sink.number_of_frames());
570
571 sink.DisconnectFromTrack();
572 }
573
574 TEST_F(MediaStreamVideoTrackOldConstraintsTest, GetSettingsOldConstraints) {
575 InitializeSource();
576 blink::WebMediaStreamTrack track = CreateTrack();
577 MediaStreamVideoTrack* const native_track =
578 MediaStreamVideoTrack::GetVideoTrack(track);
579 blink::WebMediaStreamTrack::Settings settings;
580 native_track->GetSettings(settings);
581 // These values come straight from the mock video track implementation.
582 EXPECT_EQ(640, settings.width);
583 EXPECT_EQ(480, settings.height);
584 EXPECT_EQ(30.0, settings.frame_rate);
585 EXPECT_EQ(blink::WebMediaStreamTrack::FacingMode::kNone,
586 settings.facing_mode);
587 }
588
589 } // namespace content 341 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_video_track.cc ('k') | content/renderer/media/mock_media_stream_registry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698