| Index: media/filters/h264_parser.cc
|
| diff --git a/media/filters/h264_parser.cc b/media/filters/h264_parser.cc
|
| index 0c84c47533f284e3a5f26cb975da50fc014df338..991599e2accd577a09e05c85edb52b596e599ffb 100644
|
| --- a/media/filters/h264_parser.cc
|
| +++ b/media/filters/h264_parser.cc
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| +#include "base/numerics/safe_math.h"
|
| #include "base/stl_util.h"
|
| #include "media/base/decrypt_config.h"
|
| #include "ui/gfx/geometry/rect.h"
|
| @@ -947,10 +948,10 @@ H264Parser::Result H264Parser::ParseSPS(int* sps_id) {
|
| READ_UE_OR_RETURN(&sps->pic_order_cnt_type);
|
| TRUE_OR_RETURN(sps->pic_order_cnt_type < 3);
|
|
|
| - sps->expected_delta_per_pic_order_cnt_cycle = 0;
|
| if (sps->pic_order_cnt_type == 0) {
|
| READ_UE_OR_RETURN(&sps->log2_max_pic_order_cnt_lsb_minus4);
|
| TRUE_OR_RETURN(sps->log2_max_pic_order_cnt_lsb_minus4 < 13);
|
| + sps->expected_delta_per_pic_order_cnt_cycle = 0;
|
| } else if (sps->pic_order_cnt_type == 1) {
|
| READ_BOOL_OR_RETURN(&sps->delta_pic_order_always_zero_flag);
|
| READ_SE_OR_RETURN(&sps->offset_for_non_ref_pic);
|
| @@ -958,11 +959,14 @@ H264Parser::Result H264Parser::ParseSPS(int* sps_id) {
|
| READ_UE_OR_RETURN(&sps->num_ref_frames_in_pic_order_cnt_cycle);
|
| TRUE_OR_RETURN(sps->num_ref_frames_in_pic_order_cnt_cycle < 255);
|
|
|
| + base::CheckedNumeric<int> offset_acc = 0;
|
| for (int i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) {
|
| READ_SE_OR_RETURN(&sps->offset_for_ref_frame[i]);
|
| - sps->expected_delta_per_pic_order_cnt_cycle +=
|
| - sps->offset_for_ref_frame[i];
|
| + offset_acc += sps->offset_for_ref_frame[i];
|
| }
|
| + if (!offset_acc.IsValid())
|
| + return kInvalidStream;
|
| + sps->expected_delta_per_pic_order_cnt_cycle = offset_acc.ValueOrDefault(0);
|
| }
|
|
|
| READ_UE_OR_RETURN(&sps->max_num_ref_frames);
|
|
|