| Index: webrtc/media/base/videobroadcaster_unittest.cc
|
| diff --git a/webrtc/media/base/videobroadcaster_unittest.cc b/webrtc/media/base/videobroadcaster_unittest.cc
|
| index 5274868204589856369a9a1a46a9b41c68c37b7c..467d8868e33fd79777264a7703f6fdee7b544206 100644
|
| --- a/webrtc/media/base/videobroadcaster_unittest.cc
|
| +++ b/webrtc/media/base/videobroadcaster_unittest.cc
|
| @@ -10,14 +10,44 @@
|
|
|
| #include "webrtc/api/video/i420_buffer.h"
|
| #include "webrtc/api/video/video_frame.h"
|
| -#include "webrtc/base/gunit.h"
|
| #include "webrtc/media/base/fakevideorenderer.h"
|
| #include "webrtc/media/base/videobroadcaster.h"
|
| +#include "webrtc/test/gtest.h"
|
|
|
| using rtc::VideoBroadcaster;
|
| using rtc::VideoSinkWants;
|
| using cricket::FakeVideoRenderer;
|
|
|
| +namespace test {
|
| +namespace {
|
| +void ExpectEqualSinkWantsValueRange(const VideoSinkWants::Range range1,
|
| + const VideoSinkWants::Range range2) {
|
| + EXPECT_EQ(range1.min, range2.min);
|
| + EXPECT_EQ(range1.target, range2.target);
|
| + EXPECT_EQ(range1.max, range2.max);
|
| +}
|
| +
|
| +void ExpectEqualSinkWants(const VideoSinkWants& wants1,
|
| + const VideoSinkWants& wants2) {
|
| + EXPECT_EQ(wants1.rotation_applied, wants2.rotation_applied);
|
| + EXPECT_EQ(wants1.black_frames, wants2.black_frames);
|
| +
|
| + if (wants1.pixel_count && wants2.pixel_count) {
|
| + ExpectEqualSinkWantsValueRange(*wants1.pixel_count, *wants2.pixel_count);
|
| + } else {
|
| + EXPECT_EQ(static_cast<bool>(wants1.pixel_count),
|
| + static_cast<bool>(wants2.pixel_count));
|
| + }
|
| +
|
| + if (wants1.framerate_fps_ && wants2.framerate_fps_) {
|
| + ExpectEqualSinkWantsValueRange(*wants1.framerate_fps_,
|
| + *wants2.framerate_fps_);
|
| + } else {
|
| + EXPECT_EQ(static_cast<bool>(wants1.framerate_fps_),
|
| + static_cast<bool>(wants2.framerate_fps_));
|
| + }
|
| +}
|
| +}
|
|
|
| TEST(VideoBroadcasterTest, frame_wanted) {
|
| VideoBroadcaster broadcaster;
|
| @@ -85,46 +115,111 @@ TEST(VideoBroadcasterTest, AppliesRotationIfAnySinkWantsRotationApplied) {
|
| EXPECT_FALSE(broadcaster.wants().rotation_applied);
|
| }
|
|
|
| -TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCount) {
|
| +TEST(VideoBroadcasterTest, MergedSinkWantsRespectsBounds) {
|
| VideoBroadcaster broadcaster;
|
| - EXPECT_TRUE(!broadcaster.wants().max_pixel_count);
|
| + EXPECT_FALSE(static_cast<bool>(broadcaster.wants().pixel_count));
|
|
|
| FakeVideoRenderer sink1;
|
| VideoSinkWants wants1;
|
| - wants1.max_pixel_count = rtc::Optional<int>(1280 * 720);
|
| -
|
| + wants1.pixel_count.emplace(VideoSinkWants::Range(100, 200, 300));
|
| broadcaster.AddOrUpdateSink(&sink1, wants1);
|
| - EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count);
|
| + ExpectEqualSinkWants(wants1, broadcaster.wants());
|
|
|
| FakeVideoRenderer sink2;
|
| VideoSinkWants wants2;
|
| - wants2.max_pixel_count = rtc::Optional<int>(640 * 360);
|
| + // Min above sink1, target below, max below. New range overrides all values.
|
| + wants2.pixel_count.emplace(VideoSinkWants::Range(110, 190, 290));
|
| broadcaster.AddOrUpdateSink(&sink2, wants2);
|
| - EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count);
|
| + ExpectEqualSinkWants(wants2, broadcaster.wants());
|
| +
|
| + FakeVideoRenderer sink3;
|
| + VideoSinkWants wants3;
|
| + // Min below sink1, target above, max above. New values at bottom of pile.
|
| + wants3.pixel_count.emplace(VideoSinkWants::Range(90, 210, 310));
|
| + broadcaster.AddOrUpdateSink(&sink3, wants3);
|
| + ExpectEqualSinkWants(wants2, broadcaster.wants());
|
|
|
| + // Removes sink2, sink1 should rule again.
|
| broadcaster.RemoveSink(&sink2);
|
| - EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count);
|
| + ExpectEqualSinkWants(wants1, broadcaster.wants());
|
| +
|
| + // Removes sink1, sink3 is only one left.
|
| + broadcaster.RemoveSink(&sink1);
|
| + ExpectEqualSinkWants(wants3, broadcaster.wants());
|
| +
|
| + // None left alive.
|
| + broadcaster.RemoveSink(&sink3);
|
| + EXPECT_FALSE(static_cast<bool>(broadcaster.wants().pixel_count));
|
| }
|
|
|
| -TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxAndTargetPixelCount) {
|
| +TEST(VideoBroadcasterTest, MergedSinkWantsRespectsHighMin) {
|
| VideoBroadcaster broadcaster;
|
| - EXPECT_TRUE(!broadcaster.wants().target_pixel_count);
|
| + EXPECT_FALSE(static_cast<bool>(broadcaster.wants().pixel_count));
|
|
|
| FakeVideoRenderer sink1;
|
| VideoSinkWants wants1;
|
| - wants1.target_pixel_count = rtc::Optional<int>(1280 * 720);
|
| + wants1.pixel_count.emplace(VideoSinkWants::Range(100, 200, 300));
|
| + broadcaster.AddOrUpdateSink(&sink1, wants1);
|
| + ExpectEqualSinkWants(wants1, broadcaster.wants());
|
| +
|
| + FakeVideoRenderer sink2;
|
| + VideoSinkWants wants2;
|
| + // Min above wants1, so overrides. Goes above max of sink 1, so will be capped
|
| + // at sink1.max.
|
| + wants2.pixel_count.emplace(VideoSinkWants::Range(310, 400, 500));
|
| + broadcaster.AddOrUpdateSink(&sink2, wants2);
|
| + VideoSinkWants expected_merged_wants;
|
| + expected_merged_wants.pixel_count.emplace(
|
| + VideoSinkWants::Range(300, 300, 300));
|
| + ExpectEqualSinkWants(expected_merged_wants, broadcaster.wants());
|
| +
|
| + // Removes sink2, sink1 should rule again.
|
| + broadcaster.RemoveSink(&sink2);
|
| + ExpectEqualSinkWants(wants1, broadcaster.wants());
|
| +
|
| + FakeVideoRenderer sink3;
|
| + VideoSinkWants wants3;
|
| + // Max above wants1, so overrides. Goes below target of sink 1, overriding
|
| + // that, but keeps min.
|
| + wants3.pixel_count.emplace(VideoSinkWants::Range(210, 300, 400));
|
| + broadcaster.AddOrUpdateSink(&sink3, wants3);
|
| + expected_merged_wants.pixel_count.emplace(
|
| + VideoSinkWants::Range(210, 210, 300));
|
| + ExpectEqualSinkWants(expected_merged_wants, broadcaster.wants());
|
| +}
|
|
|
| +TEST(VideoBroadcasterTest, MergedSinkWantsRespectsLowMax) {
|
| + VideoBroadcaster broadcaster;
|
| + EXPECT_FALSE(static_cast<bool>(broadcaster.wants().pixel_count));
|
| +
|
| + FakeVideoRenderer sink1;
|
| + VideoSinkWants wants1;
|
| + wants1.pixel_count.emplace(VideoSinkWants::Range(100, 200, 300));
|
| broadcaster.AddOrUpdateSink(&sink1, wants1);
|
| - EXPECT_EQ(1280 * 720, *broadcaster.wants().target_pixel_count);
|
| + ExpectEqualSinkWants(wants1, broadcaster.wants());
|
|
|
| FakeVideoRenderer sink2;
|
| VideoSinkWants wants2;
|
| - wants2.target_pixel_count = rtc::Optional<int>(640 * 360);
|
| + // Max below wants1, so overrides. Goes below min of sink 1, so will be capped
|
| + // at sink2.max. Target then has to follow min.
|
| + wants2.pixel_count.emplace(VideoSinkWants::Range(40, 50, 90));
|
| broadcaster.AddOrUpdateSink(&sink2, wants2);
|
| - EXPECT_EQ(640 * 360, *broadcaster.wants().target_pixel_count);
|
| + VideoSinkWants expected_wants;
|
| + expected_wants.pixel_count.emplace(VideoSinkWants::Range(90, 90, 90));
|
| + ExpectEqualSinkWants(expected_wants, broadcaster.wants());
|
|
|
| + // Removes sink2, sink1 should rule again.
|
| broadcaster.RemoveSink(&sink2);
|
| - EXPECT_EQ(1280 * 720, *broadcaster.wants().target_pixel_count);
|
| + ExpectEqualSinkWants(wants1, broadcaster.wants());
|
| +
|
| + FakeVideoRenderer sink3;
|
| + VideoSinkWants wants3;
|
| + // Max below wants1, so overrides. Goes below target of sink 1, so will cap
|
| + // the target but not affect the min.
|
| + wants3.pixel_count.emplace(VideoSinkWants::Range(90, 150, 150));
|
| + broadcaster.AddOrUpdateSink(&sink3, wants3);
|
| + expected_wants.pixel_count.emplace(VideoSinkWants::Range(100, 150, 150));
|
| + ExpectEqualSinkWants(expected_wants, broadcaster.wants());
|
| }
|
|
|
| TEST(VideoBroadcasterTest, SinkWantsBlackFrames) {
|
| @@ -168,3 +263,5 @@ TEST(VideoBroadcasterTest, SinkWantsBlackFrames) {
|
| EXPECT_TRUE(sink2.black_frame());
|
| EXPECT_EQ(30, sink2.timestamp_us());
|
| }
|
| +
|
| +} // namespace test
|
|
|