diff options
-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); |