1 /*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "media/base/sdp_video_format_utils.h"
12
13 #include <string.h>
14
15 #include <map>
16 #include <utility>
17
18 #include "rtc_base/string_to_number.h"
19 #include "test/gtest.h"
20
21 namespace webrtc {
22 namespace {
23 // Max frame rate for VP8 and VP9 video.
24 const char kVPxFmtpMaxFrameRate[] = "max-fr";
25 // Max frame size for VP8 and VP9 video.
26 const char kVPxFmtpMaxFrameSize[] = "max-fs";
27 } // namespace
28
TEST(SdpVideoFormatUtilsTest,TestH264GenerateProfileLevelIdForAnswerEmpty)29 TEST(SdpVideoFormatUtilsTest, TestH264GenerateProfileLevelIdForAnswerEmpty) {
30 SdpVideoFormat::Parameters answer_params;
31 H264GenerateProfileLevelIdForAnswer(SdpVideoFormat::Parameters(),
32 SdpVideoFormat::Parameters(),
33 &answer_params);
34 EXPECT_TRUE(answer_params.empty());
35 }
36
TEST(SdpVideoFormatUtilsTest,TestH264GenerateProfileLevelIdForAnswerLevelSymmetryCapped)37 TEST(SdpVideoFormatUtilsTest,
38 TestH264GenerateProfileLevelIdForAnswerLevelSymmetryCapped) {
39 SdpVideoFormat::Parameters low_level;
40 low_level["profile-level-id"] = "42e015";
41 SdpVideoFormat::Parameters high_level;
42 high_level["profile-level-id"] = "42e01f";
43
44 // Level asymmetry is not allowed; test that answer level is the lower of the
45 // local and remote levels.
46 SdpVideoFormat::Parameters answer_params;
47 H264GenerateProfileLevelIdForAnswer(low_level /* local_supported */,
48 high_level /* remote_offered */,
49 &answer_params);
50 EXPECT_EQ("42e015", answer_params["profile-level-id"]);
51
52 SdpVideoFormat::Parameters answer_params2;
53 H264GenerateProfileLevelIdForAnswer(high_level /* local_supported */,
54 low_level /* remote_offered */,
55 &answer_params2);
56 EXPECT_EQ("42e015", answer_params2["profile-level-id"]);
57 }
58
TEST(SdpVideoFormatUtilsTest,TestH264GenerateProfileLevelIdForAnswerConstrainedBaselineLevelAsymmetry)59 TEST(SdpVideoFormatUtilsTest,
60 TestH264GenerateProfileLevelIdForAnswerConstrainedBaselineLevelAsymmetry) {
61 SdpVideoFormat::Parameters local_params;
62 local_params["profile-level-id"] = "42e01f";
63 local_params["level-asymmetry-allowed"] = "1";
64 SdpVideoFormat::Parameters remote_params;
65 remote_params["profile-level-id"] = "42e015";
66 remote_params["level-asymmetry-allowed"] = "1";
67 SdpVideoFormat::Parameters answer_params;
68 H264GenerateProfileLevelIdForAnswer(local_params, remote_params,
69 &answer_params);
70 // When level asymmetry is allowed, we can answer a higher level than what was
71 // offered.
72 EXPECT_EQ("42e01f", answer_params["profile-level-id"]);
73 }
74
TEST(SdpVideoFormatUtilsTest,MaxFrameRateIsMissingOrInvalid)75 TEST(SdpVideoFormatUtilsTest, MaxFrameRateIsMissingOrInvalid) {
76 SdpVideoFormat::Parameters params;
77 absl::optional<int> empty = ParseSdpForVPxMaxFrameRate(params);
78 EXPECT_FALSE(empty);
79 params[kVPxFmtpMaxFrameRate] = "-1";
80 EXPECT_FALSE(ParseSdpForVPxMaxFrameRate(params));
81 params[kVPxFmtpMaxFrameRate] = "0";
82 EXPECT_FALSE(ParseSdpForVPxMaxFrameRate(params));
83 params[kVPxFmtpMaxFrameRate] = "abcde";
84 EXPECT_FALSE(ParseSdpForVPxMaxFrameRate(params));
85 }
86
TEST(SdpVideoFormatUtilsTest,MaxFrameRateIsSpecified)87 TEST(SdpVideoFormatUtilsTest, MaxFrameRateIsSpecified) {
88 SdpVideoFormat::Parameters params;
89 params[kVPxFmtpMaxFrameRate] = "30";
90 EXPECT_EQ(ParseSdpForVPxMaxFrameRate(params), 30);
91 params[kVPxFmtpMaxFrameRate] = "60";
92 EXPECT_EQ(ParseSdpForVPxMaxFrameRate(params), 60);
93 }
94
TEST(SdpVideoFormatUtilsTest,MaxFrameSizeIsMissingOrInvalid)95 TEST(SdpVideoFormatUtilsTest, MaxFrameSizeIsMissingOrInvalid) {
96 SdpVideoFormat::Parameters params;
97 absl::optional<int> empty = ParseSdpForVPxMaxFrameSize(params);
98 EXPECT_FALSE(empty);
99 params[kVPxFmtpMaxFrameSize] = "-1";
100 EXPECT_FALSE(ParseSdpForVPxMaxFrameSize(params));
101 params[kVPxFmtpMaxFrameSize] = "0";
102 EXPECT_FALSE(ParseSdpForVPxMaxFrameSize(params));
103 params[kVPxFmtpMaxFrameSize] = "abcde";
104 EXPECT_FALSE(ParseSdpForVPxMaxFrameSize(params));
105 }
106
TEST(SdpVideoFormatUtilsTest,MaxFrameSizeIsSpecified)107 TEST(SdpVideoFormatUtilsTest, MaxFrameSizeIsSpecified) {
108 SdpVideoFormat::Parameters params;
109 params[kVPxFmtpMaxFrameSize] = "8100"; // 1920 x 1080 / (16^2)
110 EXPECT_EQ(ParseSdpForVPxMaxFrameSize(params), 1920 * 1080);
111 params[kVPxFmtpMaxFrameSize] = "32400"; // 3840 x 2160 / (16^2)
112 EXPECT_EQ(ParseSdpForVPxMaxFrameSize(params), 3840 * 2160);
113 }
114
115 } // namespace webrtc
116