| Index: content/common/gpu/media/h264_decoder.cc
|
| diff --git a/content/common/gpu/media/h264_decoder.cc b/content/common/gpu/media/h264_decoder.cc
|
| index 9953ff21a593d28c9508f51715091f8b10f81203..6f9c91804828a7f51a99ea78f81f135c55b58df6 100644
|
| --- a/content/common/gpu/media/h264_decoder.cc
|
| +++ b/content/common/gpu/media/h264_decoder.cc
|
| @@ -362,9 +362,6 @@ void H264Decoder::ConstructReferencePicListsP(
|
| dpb_.GetLongTermRefPicsAppending(&ref_pic_list_p0_);
|
| std::sort(ref_pic_list_p0_.begin() + num_short_refs, ref_pic_list_p0_.end(),
|
| LongTermPicNumAscCompare());
|
| -
|
| - // Cut off if we have more than requested in slice header.
|
| - ref_pic_list_p0_.resize(slice_hdr->num_ref_idx_l0_active_minus1 + 1);
|
| }
|
|
|
| struct POCAscCompare {
|
| @@ -436,12 +433,6 @@ void H264Decoder::ConstructReferencePicListsB(
|
| std::equal(ref_pic_list_b0_.begin(), ref_pic_list_b0_.end(),
|
| ref_pic_list_b1_.begin()))
|
| std::swap(ref_pic_list_b1_[0], ref_pic_list_b1_[1]);
|
| -
|
| - // Per 8.2.4.2 it's possible for num_ref_idx_lX_active_minus1 to indicate
|
| - // there should be more ref pics on list than we constructed.
|
| - // Those superfluous ones should be treated as non-reference.
|
| - ref_pic_list_b0_.resize(slice_hdr->num_ref_idx_l0_active_minus1 + 1);
|
| - ref_pic_list_b1_.resize(slice_hdr->num_ref_idx_l1_active_minus1 + 1);
|
| }
|
|
|
| // See 8.2.4
|
| @@ -489,25 +480,36 @@ static void ShiftRightAndInsert(H264Picture::Vector* v,
|
| bool H264Decoder::ModifyReferencePicList(media::H264SliceHeader* slice_hdr,
|
| int list,
|
| H264Picture::Vector* ref_pic_listx) {
|
| + bool ref_pic_list_modification_flag_lX;
|
| int num_ref_idx_lX_active_minus1;
|
| media::H264ModificationOfPicNum* list_mod;
|
|
|
| // This can process either ref_pic_list0 or ref_pic_list1, depending on
|
| // the list argument. Set up pointers to proper list to be processed here.
|
| if (list == 0) {
|
| - if (!slice_hdr->ref_pic_list_modification_flag_l0)
|
| - return true;
|
| -
|
| + ref_pic_list_modification_flag_lX =
|
| + slice_hdr->ref_pic_list_modification_flag_l0;
|
| + num_ref_idx_lX_active_minus1 =
|
| + slice_hdr->num_ref_idx_l0_active_minus1;
|
| list_mod = slice_hdr->ref_list_l0_modifications;
|
| } else {
|
| - if (!slice_hdr->ref_pic_list_modification_flag_l1)
|
| - return true;
|
| -
|
| + ref_pic_list_modification_flag_lX =
|
| + slice_hdr->ref_pic_list_modification_flag_l1;
|
| + num_ref_idx_lX_active_minus1 =
|
| + slice_hdr->num_ref_idx_l1_active_minus1;
|
| list_mod = slice_hdr->ref_list_l1_modifications;
|
| }
|
|
|
| - num_ref_idx_lX_active_minus1 = ref_pic_listx->size() - 1;
|
| + // Resize the list to the size requested in the slice header.
|
| + // Note that per 8.2.4.2 it's possible for num_ref_idx_lX_active_minus1 to
|
| + // indicate there should be more ref pics on list than we constructed.
|
| + // Those superfluous ones should be treated as non-reference and will be
|
| + // initialized to nullptr, which must be handled by clients.
|
| DCHECK_GE(num_ref_idx_lX_active_minus1, 0);
|
| + ref_pic_listx->resize(num_ref_idx_lX_active_minus1 + 1);
|
| +
|
| + if (!ref_pic_list_modification_flag_lX)
|
| + return true;
|
|
|
| // Spec 8.2.4.3:
|
| // Reorder pictures on the list in a way specified in the stream.
|
|
|