diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2014-05-05 00:05:06 +0200 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2014-06-16 11:53:35 +0800 |
commit | dcd97d032e4a236954f142d2adeed2f57ac65079 (patch) | |
tree | 81f35bde8db21ad4b3cb5cf4a034d5aa7723ee83 /src | |
parent | d2e843eed7fa31d86e196fb0e07b9cd3c377c969 (diff) | |
download | libva-intel-driver-dcd97d032e4a236954f142d2adeed2f57ac65079.tar.gz libva-intel-driver-dcd97d032e4a236954f142d2adeed2f57ac65079.tar.bz2 libva-intel-driver-dcd97d032e4a236954f142d2adeed2f57ac65079.zip |
decoder: h264: fix submission of AVC_REF_IDX_STATE command.
If the RefPicListX[] entry has no valid picture_id associated to it,
then set the resulting state to 0xff. If that entry has no surface
buffer storage either, then compose a valid state that maps to the
first item in the reference frames list, as mandated by the PRM.
v2: dropped the superfluous "found" variable [Yakui]
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
(cherry picked from commit 151b8851c3a9309e87712651a3697e20a7bdb6c9)
Diffstat (limited to 'src')
-rw-r--r-- | src/i965_decoder_utils.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c index c779152..ae17bd5 100644 --- a/src/i965_decoder_utils.c +++ b/src/i965_decoder_utils.c @@ -336,34 +336,35 @@ gen5_fill_avc_ref_idx_state( const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES] ) { - unsigned int i, n, frame_idx; - int found; + int i, j; - for (i = 0, n = 0; i < ref_list_count; i++) { + for (i = 0; i < ref_list_count; i++) { const VAPictureH264 * const va_pic = &ref_list[i]; - if (va_pic->flags & VA_PICTURE_H264_INVALID) + if ((va_pic->flags & VA_PICTURE_H264_INVALID) || + va_pic->picture_id == VA_INVALID_ID) { + state[i] = 0xff; continue; + } - found = 0; - for (frame_idx = 0; frame_idx < MAX_GEN_REFERENCE_FRAMES; frame_idx++) { - const GenFrameStore * const fs = &frame_store[frame_idx]; - if (fs->surface_id != VA_INVALID_ID && - fs->surface_id == va_pic->picture_id) { - found = 1; + for (j = 0; j < MAX_GEN_REFERENCE_FRAMES; j++) { + if (frame_store[j].surface_id == va_pic->picture_id) break; - } } - if (found) { - state[n++] = get_ref_idx_state_1(va_pic, frame_idx); - } else { - WARN_ONCE("Invalid Slice reference frame list !!!. It is not included in DPB \n"); + if (j != MAX_GEN_REFERENCE_FRAMES) { // Found picture in the Frame Store + const GenFrameStore * const fs = &frame_store[j]; + assert(fs->frame_store_id == j); // Current architecture/assumption + state[i] = get_ref_idx_state_1(va_pic, fs->frame_store_id); + } + else { + WARN_ONCE("Invalid RefPicListX[] entry!!! It is not included in DPB\n"); + state[i] = get_ref_idx_state_1(va_pic, 0) | 0x80; } } - for (; n < 32; n++) - state[n] = 0xff; + for (; i < 32; i++) + state[i] = 0xff; } /* Emit Reference List Entries (Gen6+: SNB, IVB) */ |