diff options
author | chihchung@chromium.org <chihchung@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-07 19:52:14 +0000 |
---|---|---|
committer | chihchung@chromium.org <chihchung@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-07 19:52:14 +0000 |
commit | ad6e1a41cbba2ac96561862bc36a1e944c713d27 (patch) | |
tree | 1f52b834ec164f2dbfedce51fd15d3dc5347e747 /content/common | |
parent | 7976f92d22947f00ceb687aa6010e8c10145ac5f (diff) | |
download | chromium_src-ad6e1a41cbba2ac96561862bc36a1e944c713d27.zip chromium_src-ad6e1a41cbba2ac96561862bc36a1e944c713d27.tar.gz chromium_src-ad6e1a41cbba2ac96561862bc36a1e944c713d27.tar.bz2 |
VAAPI H.264: calculate reference picture lists for each slice.
A picture can contain slices with different types (for example, B slice
and P slice). Originally we only calculate the reference picture lists
according to the type of the first slice, now we calculate them for
each slice.
BUG=none
TEST=now the files CABAST3_Sony_E.jsv/CABASTBR3_Sony_B.jsv decode correctly.
Review URL: https://codereview.chromium.org/39173004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233662 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/common')
-rw-r--r-- | content/common/gpu/media/vaapi_h264_decoder.cc | 37 | ||||
-rw-r--r-- | content/common/gpu/media/vaapi_h264_decoder.h | 3 |
2 files changed, 25 insertions, 15 deletions
diff --git a/content/common/gpu/media/vaapi_h264_decoder.cc b/content/common/gpu/media/vaapi_h264_decoder.cc index b7974b4..402369b 100644 --- a/content/common/gpu/media/vaapi_h264_decoder.cc +++ b/content/common/gpu/media/vaapi_h264_decoder.cc @@ -440,9 +440,31 @@ bool VaapiH264Decoder::SendSliceData(const uint8* ptr, size_t size) { non_const_ptr); } +bool VaapiH264Decoder::PrepareRefPicLists(H264SliceHeader* slice_hdr) { + ref_pic_list0_.clear(); + ref_pic_list1_.clear(); + + // Fill reference picture lists for B and S/SP slices. + if (slice_hdr->IsPSlice() || slice_hdr->IsSPSlice()) { + ConstructReferencePicListsP(slice_hdr); + return ModifyReferencePicList(slice_hdr, 0); + } + + if (slice_hdr->IsBSlice()) { + ConstructReferencePicListsB(slice_hdr); + return ModifyReferencePicList(slice_hdr, 0) && + ModifyReferencePicList(slice_hdr, 1); + } + + return true; +} + bool VaapiH264Decoder::QueueSlice(H264SliceHeader* slice_hdr) { DCHECK(curr_pic_.get()); + if (!PrepareRefPicLists(slice_hdr)) + return false; + if (!SendVASliceParam(slice_hdr)) return false; @@ -1081,21 +1103,6 @@ bool VaapiH264Decoder::StartNewFrame(H264SliceHeader* slice_hdr) { UpdatePicNums(); - // Prepare reference picture lists if required (B and S/SP slices). - ref_pic_list0_.clear(); - ref_pic_list1_.clear(); - if (slice_hdr->IsPSlice() || slice_hdr->IsSPSlice()) { - ConstructReferencePicListsP(slice_hdr); - if (!ModifyReferencePicList(slice_hdr, 0)) - return false; - } else if (slice_hdr->IsBSlice()) { - ConstructReferencePicListsB(slice_hdr); - if (!ModifyReferencePicList(slice_hdr, 0)) - return false; - if (!ModifyReferencePicList(slice_hdr, 1)) - return false; - } - // Send parameter buffers before each new picture, before the first slice. if (!SendPPS()) return false; diff --git a/content/common/gpu/media/vaapi_h264_decoder.h b/content/common/gpu/media/vaapi_h264_decoder.h index debac3f..baab0d8 100644 --- a/content/common/gpu/media/vaapi_h264_decoder.h +++ b/content/common/gpu/media/vaapi_h264_decoder.h @@ -143,6 +143,9 @@ class VaapiH264Decoder { // frame (see spec). void UpdatePicNums(); + // Prepare reference picture lists (ref_pic_list[01]_). + bool PrepareRefPicLists(H264SliceHeader* slice_hdr); + // Construct initial reference picture lists for use in decoding of // P and B pictures (see 8.2.4 in spec). void ConstructReferencePicListsP(H264SliceHeader* slice_hdr); |