1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/video/h264_level_limits.h"
6
7 #include "base/logging.h"
8 #include "base/stl_util.h"
9 #include "media/video/h264_parser.h"
10
11 namespace media {
12 namespace {
13 struct LevelLimits {
14 // All names and abbreviations are as in table A-1 in spec.
15 // MaxMBPS, Max. macroblock processing rate (MB/s)
16 uint32_t max_mbps;
17 // MaxFS, Max. frame size (MBs)
18 uint32_t max_fs;
19 // MaxDpbMbs, Max. decoded picture buffer size (MBs)
20 uint32_t max_dpb_mbs;
21 // MaxBR, Max. video bitrate for Baseline and Main Profiles (kbit/s)
22 uint32_t max_main_br;
23 };
24
LevelToLevelLimits(uint8_t level)25 LevelLimits LevelToLevelLimits(uint8_t level) {
26 // See table A-1 in spec
27 // { MaxMBPS, MaxFS, MaxDpbMbs, MaxBR}
28 switch (level) {
29 case H264SPS::kLevelIDC1p0:
30 return {1485, 99, 396, 64}; // Level 1.0
31 case H264SPS::kLevelIDC1B:
32 return {1485, 99, 396, 128}; // Level 1b
33 case H264SPS::kLevelIDC1p1:
34 return {3000, 396, 900, 192}; // Level 1.1
35 case H264SPS::kLevelIDC1p2:
36 return {6000, 396, 2376, 384}; // Level 1.2
37 case H264SPS::kLevelIDC1p3:
38 return {11800, 396, 2376, 768}; // Level 1.3
39 case H264SPS::kLevelIDC2p0:
40 return {11880, 396, 2376, 2000}; // Level 2.0
41 case H264SPS::kLevelIDC2p1:
42 return {19800, 792, 4752, 4000}; // Level 2.1
43 case H264SPS::kLevelIDC2p2:
44 return {20250, 1620, 8100, 4000}; // Level 2.2
45 case H264SPS::kLevelIDC3p0:
46 return {40500, 1620, 8100, 10000}; // Level 3.0
47 case H264SPS::kLevelIDC3p1:
48 return {108000, 3600, 18000, 14000}; // Level 3.1
49 case H264SPS::kLevelIDC3p2:
50 return {216000, 5120, 20480, 20000}; // Level 3.2
51 case H264SPS::kLevelIDC4p0:
52 return {245760, 8192, 32768, 20000}; // Level 4.0
53 case H264SPS::kLevelIDC4p1:
54 return {245760, 8192, 32768, 50000}; // Level 4.1
55 case H264SPS::kLevelIDC4p2:
56 return {522240, 8704, 34816, 50000}; // Level 4.2
57 case H264SPS::kLevelIDC5p0:
58 return {589824, 22080, 110400, 135000}; // Level 5.0
59 case H264SPS::kLevelIDC5p1:
60 return {983040, 36864, 184320, 240000}; // Level 5.1
61 case H264SPS::kLevelIDC5p2:
62 return {2073600, 36864, 184320, 240000}; // Level 5.2
63 case H264SPS::kLevelIDC6p0:
64 return {4177920, 139264, 696320, 240000}; // Level 6.0
65 case H264SPS::kLevelIDC6p1:
66 return {8355840, 139264, 696320, 480000}; // Level 6.1
67 case H264SPS::kLevelIDC6p2:
68 return {16711680, 139264, 696320, 800000}; // Level 6.2
69 default:
70 DVLOG(1) << "Invalid codec level (" << static_cast<int>(level) << ")";
71 return {0, 0, 0, 0};
72 }
73 }
74 } // namespace
75
H264LevelToMaxMBPS(uint8_t level)76 uint32_t H264LevelToMaxMBPS(uint8_t level) {
77 return LevelToLevelLimits(level).max_mbps;
78 }
79
H264LevelToMaxFS(uint8_t level)80 uint32_t H264LevelToMaxFS(uint8_t level) {
81 return LevelToLevelLimits(level).max_fs;
82 }
83
H264LevelToMaxDpbMbs(uint8_t level)84 uint32_t H264LevelToMaxDpbMbs(uint8_t level) {
85 return LevelToLevelLimits(level).max_dpb_mbs;
86 }
87
H264ProfileLevelToMaxBR(VideoCodecProfile profile,uint8_t level)88 uint32_t H264ProfileLevelToMaxBR(VideoCodecProfile profile, uint8_t level) {
89 uint32_t max_main_br = LevelToLevelLimits(level).max_main_br;
90
91 // See table A-2 in spec
92 // The maximum bit rate for High Profile is 1.25 times that of the
93 // Base/Extended/Main Profiles, 3 times for Hi10P, and 4 times for
94 // Hi422P/Hi444PP.
95 switch (profile) {
96 case H264PROFILE_BASELINE:
97 case H264PROFILE_MAIN:
98 case H264PROFILE_EXTENDED:
99 return max_main_br;
100 case H264PROFILE_HIGH:
101 return max_main_br * 5 / 4;
102 case H264PROFILE_HIGH10PROFILE:
103 return max_main_br * 3;
104 case H264PROFILE_HIGH422PROFILE:
105 case H264PROFILE_HIGH444PREDICTIVEPROFILE:
106 return max_main_br * 4;
107 default:
108 DVLOG(1) << "Failed to query MaxBR for profile: "
109 << GetProfileName(profile);
110 return 0;
111 }
112 }
113
CheckH264LevelLimits(VideoCodecProfile profile,uint8_t level,uint32_t bitrate,uint32_t framerate,uint32_t framesize_in_mbs)114 bool CheckH264LevelLimits(VideoCodecProfile profile,
115 uint8_t level,
116 uint32_t bitrate,
117 uint32_t framerate,
118 uint32_t framesize_in_mbs) {
119 uint32_t max_bitrate_kbs = H264ProfileLevelToMaxBR(profile, level);
120 DCHECK(base::IsValueInRangeForNumericType<uint32_t>(max_bitrate_kbs * 1000));
121
122 uint32_t max_bitrate = max_bitrate_kbs * 1000;
123 if (bitrate > max_bitrate) {
124 DVLOG(1) << "Target bitrate: " << bitrate << " exceeds Max: " << max_bitrate
125 << " bit/s";
126 return false;
127 }
128
129 if (framesize_in_mbs > H264LevelToMaxFS(level)) {
130 DVLOG(1) << "Target frame size: " << framesize_in_mbs
131 << " exceeds Max: " << H264LevelToMaxFS(level) << " Macroblocks";
132 return false;
133 }
134
135 uint32_t mbps = framesize_in_mbs * framerate;
136 if (mbps > H264LevelToMaxMBPS(level)) {
137 DVLOG(1) << "Target macroblock processing rate: " << mbps
138 << " exceeds Max: " << H264LevelToMaxMBPS(level) << "Macroblock/s";
139 return false;
140 }
141
142 return true;
143 }
144
FindValidH264Level(VideoCodecProfile profile,uint32_t bitrate,uint32_t framerate,uint32_t framesize_in_mbs)145 base::Optional<uint8_t> FindValidH264Level(VideoCodecProfile profile,
146 uint32_t bitrate,
147 uint32_t framerate,
148 uint32_t framesize_in_mbs) {
149 constexpr uint8_t kH264Levels[] = {
150 H264SPS::kLevelIDC1p0, H264SPS::kLevelIDC1B, H264SPS::kLevelIDC1p1,
151 H264SPS::kLevelIDC1p2, H264SPS::kLevelIDC1p3, H264SPS::kLevelIDC2p0,
152 H264SPS::kLevelIDC2p1, H264SPS::kLevelIDC2p2, H264SPS::kLevelIDC3p0,
153 H264SPS::kLevelIDC3p1, H264SPS::kLevelIDC3p2, H264SPS::kLevelIDC4p0,
154 H264SPS::kLevelIDC4p1, H264SPS::kLevelIDC4p2, H264SPS::kLevelIDC5p0,
155 H264SPS::kLevelIDC5p1, H264SPS::kLevelIDC5p2, H264SPS::kLevelIDC6p0,
156 H264SPS::kLevelIDC6p1, H264SPS::kLevelIDC6p2,
157 };
158
159 for (const uint8_t level : kH264Levels) {
160 if (CheckH264LevelLimits(profile, level, bitrate, framerate,
161 framesize_in_mbs)) {
162 return level;
163 }
164 }
165 return base::nullopt;
166 }
167
168 } // namespace media
169