diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-09-10 02:21:22 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-09-10 03:20:29 +0200 |
commit | 78a041a9dbcdc71ae6f3b611742db6f21b56acf0 (patch) | |
tree | a8ca24554dcfb1c087e7a2b1e3083a88368af557 | |
parent | e5e0580b93a5bda34f62a5df50c1b15e610d4ad1 (diff) | |
download | ffmpeg-78a041a9dbcdc71ae6f3b611742db6f21b56acf0.tar.gz |
mpeg4videodec: rewrite the slice end detection of non partitioned packets.
This no longer needs thread syncronization thus speeding frame multithreading up.
Fixes Ticket28
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/mpeg4videodec.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index cb5231a4dd..759109fed2 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -130,10 +130,11 @@ static inline int mpeg4_is_resync(MpegEncContext *s){ v|= 0x7F >> (7-(bits_count&7)); if(v==0x7F) - return 1; + return s->mb_num; }else{ if(v == ff_mpeg4_resync_prefix[bits_count&7]){ - int len; + int len, mb_num; + int mb_num_bits= av_log2(s->mb_num - 1) + 1; GetBitContext gb= s->gb; skip_bits(&s->gb, 1); @@ -143,10 +144,14 @@ static inline int mpeg4_is_resync(MpegEncContext *s){ if(get_bits1(&s->gb)) break; } + mb_num= get_bits(&s->gb, mb_num_bits); + if(!mb_num || mb_num > s->mb_num || get_bits_count(&s->gb)+6 > s->gb.size_in_bits) + mb_num= -1; + s->gb= gb; if(len>=ff_mpeg4_get_video_packet_prefix_length(s)) - return 1; + return mb_num; } } return 0; @@ -373,16 +378,6 @@ int mpeg4_decode_video_packet_header(MpegEncContext *s) av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num); return -1; } - if(s->pict_type == AV_PICTURE_TYPE_B){ - int mb_x = 0, mb_y = 0; - - while (s->next_picture.f.mbskip_table[s->mb_index2xy[mb_num]]) { - if (!mb_x) ff_thread_await_progress((AVFrame*)s->next_picture_ptr, mb_y++, 0); - mb_num++; - if (++mb_x == s->mb_width) mb_x = 0; - } - if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded - } s->mb_x= mb_num % s->mb_width; s->mb_y= mb_num / s->mb_width; @@ -1488,17 +1483,12 @@ end: /* per-MB end of slice check */ if(s->codec_id==CODEC_ID_MPEG4){ - if(mpeg4_is_resync(s)){ - const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; - - if(s->pict_type==AV_PICTURE_TYPE_B){ - ff_thread_await_progress((AVFrame*)s->next_picture_ptr, - (s->mb_x + delta >= s->mb_width) ? FFMIN(s->mb_y+1, s->mb_height-1) : s->mb_y, 0); - } - - if (s->pict_type == AV_PICTURE_TYPE_B && s->next_picture.f.mbskip_table[xy + delta]) - return SLICE_OK; - return SLICE_END; + int next= mpeg4_is_resync(s); + if(next) { + if (s->mb_x + s->mb_y*s->mb_width + 1 > next && s->avctx->error_recognition >= FF_ER_AGGRESSIVE) { + return -1; + } else if (s->mb_x + s->mb_y*s->mb_width + 1 >= next) + return SLICE_END; } } |