OLD | NEW |
---|---|
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 "media/formats/mp4/box_definitions.h" | 5 #include "media/formats/mp4/box_definitions.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/numerics/safe_math.h" | |
12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
13 #include "media/base/media_switches.h" | 14 #include "media/base/media_switches.h" |
14 #include "media/base/video_types.h" | 15 #include "media/base/video_types.h" |
15 #include "media/base/video_util.h" | 16 #include "media/base/video_util.h" |
16 #include "media/filters/h264_parser.h" | 17 #include "media/filters/h264_parser.h" |
17 #include "media/formats/mp4/avc.h" | 18 #include "media/formats/mp4/avc.h" |
18 #include "media/formats/mp4/es_descriptor.h" | 19 #include "media/formats/mp4/es_descriptor.h" |
19 #include "media/formats/mp4/rcheck.h" | 20 #include "media/formats/mp4/rcheck.h" |
20 #include "media/media_features.h" | 21 #include "media/media_features.h" |
21 | 22 |
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1115 } else { | 1116 } else { |
1116 data_offset = 0; | 1117 data_offset = 0; |
1117 } | 1118 } |
1118 | 1119 |
1119 uint32_t first_sample_flags = 0; | 1120 uint32_t first_sample_flags = 0; |
1120 if (first_sample_flags_present) | 1121 if (first_sample_flags_present) |
1121 RCHECK(reader->Read4(&first_sample_flags)); | 1122 RCHECK(reader->Read4(&first_sample_flags)); |
1122 | 1123 |
1123 int fields = sample_duration_present + sample_size_present + | 1124 int fields = sample_duration_present + sample_size_present + |
1124 sample_flags_present + sample_composition_time_offsets_present; | 1125 sample_flags_present + sample_composition_time_offsets_present; |
1125 RCHECK(reader->HasBytes(fields * sample_count)); | |
1126 | 1126 |
1127 if (sample_duration_present) | 1127 // |bytes_needed| is potentially 64-bit. Cast |sample_count| from uint32_t to |
1128 // size_t to avoid multiplication overflow. | |
1129 base::CheckedNumeric<size_t> bytes_needed = | |
1130 base::CheckMul(fields, static_cast<size_t>(sample_count)); | |
1131 RCHECK_MEDIA_LOGGED(bytes_needed.IsValid(), reader->media_log(), | |
1132 "Extreme TRUN sample count exceeds system address space"); | |
1133 RCHECK(reader->HasBytes(bytes_needed.ValueOrDie())); | |
DaleCurtis
2017/01/18 21:21:32
Isn't this unreachable if IsValid() fails above?
chcunningham
2017/01/18 21:52:06
Yes.
Its only reachable when IsValid passes, in w
DaleCurtis
2017/01/18 21:53:04
Whoops, sorry I totally skipped over the function
| |
1134 | |
1135 if (sample_duration_present) { | |
1136 RCHECK(sample_count <= sample_durations.max_size()); | |
1128 sample_durations.resize(sample_count); | 1137 sample_durations.resize(sample_count); |
1129 if (sample_size_present) | 1138 } |
1139 if (sample_size_present) { | |
1140 RCHECK(sample_count <= sample_sizes.max_size()); | |
1130 sample_sizes.resize(sample_count); | 1141 sample_sizes.resize(sample_count); |
1131 if (sample_flags_present) | 1142 } |
1143 if (sample_flags_present) { | |
1144 RCHECK(sample_count <= sample_flags.max_size()); | |
1132 sample_flags.resize(sample_count); | 1145 sample_flags.resize(sample_count); |
1133 if (sample_composition_time_offsets_present) | 1146 } |
1147 if (sample_composition_time_offsets_present) { | |
1148 RCHECK(sample_count <= sample_composition_time_offsets.max_size()); | |
1134 sample_composition_time_offsets.resize(sample_count); | 1149 sample_composition_time_offsets.resize(sample_count); |
1150 } | |
1135 | 1151 |
1136 for (uint32_t i = 0; i < sample_count; ++i) { | 1152 for (uint32_t i = 0; i < sample_count; ++i) { |
1137 if (sample_duration_present) | 1153 if (sample_duration_present) |
1138 RCHECK(reader->Read4(&sample_durations[i])); | 1154 RCHECK(reader->Read4(&sample_durations[i])); |
1139 if (sample_size_present) | 1155 if (sample_size_present) |
1140 RCHECK(reader->Read4(&sample_sizes[i])); | 1156 RCHECK(reader->Read4(&sample_sizes[i])); |
1141 if (sample_flags_present) | 1157 if (sample_flags_present) |
1142 RCHECK(reader->Read4(&sample_flags[i])); | 1158 RCHECK(reader->Read4(&sample_flags[i])); |
1143 if (sample_composition_time_offsets_present) | 1159 if (sample_composition_time_offsets_present) |
1144 RCHECK(reader->Read4s(&sample_composition_time_offsets[i])); | 1160 RCHECK(reader->Read4s(&sample_composition_time_offsets[i])); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1343 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on( | 1359 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on( |
1344 size_t i) const { | 1360 size_t i) const { |
1345 if (i >= sample_depends_on_.size()) | 1361 if (i >= sample_depends_on_.size()) |
1346 return kSampleDependsOnUnknown; | 1362 return kSampleDependsOnUnknown; |
1347 | 1363 |
1348 return sample_depends_on_[i]; | 1364 return sample_depends_on_[i]; |
1349 } | 1365 } |
1350 | 1366 |
1351 } // namespace mp4 | 1367 } // namespace mp4 |
1352 } // namespace media | 1368 } // namespace media |
OLD | NEW |