Skip to content
This repository has been archived by the owner on Apr 3, 2020. It is now read-only.

Commit

Permalink
H264 Decoder: move cut off logic from Construct to ModifyRefPicList().
Browse files Browse the repository at this point in the history
The ConstructRefPicListsP/B() functions are supposed to be slice agnostic.

The cut off logic is based on per-slice num_ref_idx_lX_active_minus1 values
in the slice header, and therefore it should belong to the ModifyRefPicList()
function.

BUG=479953
TEST=verify no corruption on xfnity, trybot, vda unit test

Review URL: https://codereview.chromium.org/1318283007

Cr-Commit-Position: refs/heads/master@{#346947}
(cherry picked from commit 5e19b06)

[email protected]
NOTRY=true
NOPRESUBMIT=true

Review URL: https://codereview.chromium.org/1323143006

Cr-Commit-Position: refs/branch-heads/2490@{#140}
Cr-Branched-From: 7790a35-refs/heads/master@{#344925}
  • Loading branch information
hshi-chromium authored and Commit bot committed Sep 2, 2015
1 parent 541c802 commit f7db687
Showing 1 changed file with 18 additions and 16 deletions.
34 changes: 18 additions & 16 deletions content/common/gpu/media/h264_decoder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit f7db687

Please sign in to comment.