| Index: media/gpu/h264_decoder.cc
|
| diff --git a/media/gpu/h264_decoder.cc b/media/gpu/h264_decoder.cc
|
| index e6192f928c9b02189f70daa4a8ecfe4323caa5d0..e81121737ac6461f46f2434713135499954c63ce 100644
|
| --- a/media/gpu/h264_decoder.cc
|
| +++ b/media/gpu/h264_decoder.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/callback_helpers.h"
|
| #include "base/macros.h"
|
| #include "base/numerics/safe_conversions.h"
|
| +#include "base/optional.h"
|
| #include "base/stl_util.h"
|
| #include "media/gpu/h264_decoder.h"
|
|
|
| @@ -1086,26 +1087,22 @@ bool H264Decoder::ProcessSPS(int sps_id, bool* need_new_buffers) {
|
| return false;
|
| }
|
|
|
| - // Calculate picture height/width in macroblocks and pixels
|
| - // (spec 7.4.2.1.1, 7.4.3).
|
| - int width_mb = sps->pic_width_in_mbs_minus1 + 1;
|
| - int height_mb = (2 - sps->frame_mbs_only_flag) *
|
| - (sps->pic_height_in_map_units_minus1 + 1);
|
| -
|
| - if (width_mb > std::numeric_limits<int>::max() / 16 ||
|
| - height_mb > std::numeric_limits<int>::max() / 16) {
|
| - DVLOG(1) << "Picture size is too big: width_mb=" << width_mb
|
| - << " height_mb=" << height_mb;
|
| + gfx::Size new_pic_size = sps->GetCodedSize().value_or(gfx::Size());
|
| + if (new_pic_size.IsEmpty()) {
|
| + DVLOG(1) << "Invalid picture size";
|
| return false;
|
| }
|
|
|
| - gfx::Size new_pic_size(16 * width_mb, 16 * height_mb);
|
| - if (new_pic_size.IsEmpty()) {
|
| - DVLOG(1) << "Invalid picture size: " << new_pic_size.ToString();
|
| + int width_mb = new_pic_size.width() / 16;
|
| + int height_mb = new_pic_size.height() / 16;
|
| +
|
| + // Verify that the values are not too large before multiplying.
|
| + if (std::numeric_limits<int>::max() / width_mb < height_mb) {
|
| + DVLOG(1) << "Picture size is too big: " << new_pic_size.ToString();
|
| return false;
|
| }
|
|
|
| - if (!pic_size_.IsEmpty() && new_pic_size == pic_size_) {
|
| + if (new_pic_size == pic_size_) {
|
| // Already have surfaces and this SPS keeps the same resolution,
|
| // no need to request a new set.
|
| return true;
|
|
|