summaryrefslogtreecommitdiffstats
path: root/content/common
diff options
context:
space:
mode:
authorchihchung@chromium.org <chihchung@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-07 19:52:14 +0000
committerchihchung@chromium.org <chihchung@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-07 19:52:14 +0000
commitad6e1a41cbba2ac96561862bc36a1e944c713d27 (patch)
tree1f52b834ec164f2dbfedce51fd15d3dc5347e747 /content/common
parent7976f92d22947f00ceb687aa6010e8c10145ac5f (diff)
downloadchromium_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.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);