summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/common/gpu/media/vaapi_h264_decoder.cc37
-rw-r--r--content/common/gpu/media/vaapi_h264_decoder.h3
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);