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