aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-03-30 16:04:07 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-03-30 20:28:00 +0100
commit746016598d1885afd1fee976b6d315ed7eeefa68 (patch)
tree26496786f0901220cffc0ab8bb4ef9ce239a05df /libavcodec/h264.c
parent95c7cad70cd8b4a6fe773c2bd421b1206c629e34 (diff)
downloadffmpeg-746016598d1885afd1fee976b6d315ed7eeefa68.tar.gz
h264: Move slice_table clean out of frame_start
Fixes inconsistency ultimately leading to an out of array read Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index a736070f0f..21da19fbf6 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -1864,11 +1864,6 @@ static int h264_frame_start(H264Context *h)
h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 8 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
}
- /* Some macroblocks can be accessed before they're available in case
- * of lost slices, MBAFF or threading. */
- memset(h->slice_table, -1,
- (h->mb_height * h->mb_stride - 1) * sizeof(*h->slice_table));
-
// s->decode = (h->flags & CODEC_FLAG_PSNR) || !s->encoding ||
// h->cur_pic.reference /* || h->contains_intra */ || 1;
@@ -3563,6 +3558,15 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
} else {
release_unused_pictures(h, 0);
}
+ /* Some macroblocks can be accessed before they're available in case
+ * of lost slices, MBAFF or threading. */
+ if (FIELD_PICTURE(h)) {
+ for(i = (h->picture_structure == PICT_BOTTOM_FIELD); i<h->mb_height; i++)
+ memset(h->slice_table + i*h->mb_stride, -1, (h->mb_stride - (i+1==h->mb_height)) * sizeof(*h->slice_table));
+ } else {
+ memset(h->slice_table, -1,
+ (h->mb_height * h->mb_stride - 1) * sizeof(*h->slice_table));
+ }
}
if (h != h0 && (ret = clone_slice(h, h0)) < 0)
return ret;