Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-09-12 08:06:43 +0400
committerMichael Niedermayer <michaelni@gmx.at>2011-09-12 08:07:58 +0400
commit716c1f7b2ad02a906ad1e47182492554b668f3dc (patch)
treebbe18faea975b5edcf3d6cbd97bf1bc58817129c
parentad2fba8619223fc9ba9a482666115da87ee14fb8 (diff)
h264: improve MAX_SLICES too small check so it gives less false positives.
Fixes Ticket273 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/h264.c8
-rw-r--r--libavcodec/h264.h2
2 files changed, 9 insertions, 1 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 0703c6bff9..c656189b3d 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -3016,7 +3016,13 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
h0->last_slice_type = slice_type;
h->slice_num = ++h0->current_slice;
- if(h->slice_num >= MAX_SLICES){
+
+ if(h->slice_num)
+ h0->slice_row[(h->slice_num-1)&(MAX_SLICES-1)]= s->resync_mb_y;
+ if ( h0->slice_row[h->slice_num&(MAX_SLICES-1)] + 3 >= s->resync_mb_y
+ && h0->slice_row[h->slice_num&(MAX_SLICES-1)] <= s->resync_mb_y
+ && h->slice_num >= MAX_SLICES) {
+ //in case of ASO this check needs to be updated depending on how we decide to assign slice numbers in this case
av_log(s->avctx, AV_LOG_WARNING, "Possibly too many slices (%d >= %d), increase MAX_SLICES and recompile if there are artifacts\n", h->slice_num, MAX_SLICES);
}
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index e956d3a339..374cd163ec 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -580,6 +580,8 @@ typedef struct H264Context{
int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs
int cur_chroma_format_idc;
+
+ int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low
}H264Context;