summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-02-19 20:48:02 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-03-23 21:07:57 +0100
commit644092c8e8892f4f7e44a01b83487b398cafeb5a (patch)
tree3edbd654164ce117b34ade34c2d1e795e1b63e37 /libavcodec/h264.c
parenta42d15a3a0efddf693218bc1c94f98f8c48a7469 (diff)
h264: dont report rows as finished after a missing slice
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 22ea57012b..3142ca4307 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -4226,7 +4226,7 @@ static void decode_finish_row(H264Context *h)
ff_h264_draw_horiz_band(h, top, height);
- if (h->droppable)
+ if (h->droppable || h->er.error_occurred)
return;
ff_thread_report_progress(&h->cur_pic_ptr->tf, top + height - 1,
@@ -4257,6 +4257,16 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
avctx->codec_id != AV_CODEC_ID_H264 ||
(CONFIG_GRAY && (h->flags & CODEC_FLAG_GRAY));
+ if (!(h->avctx->active_thread_type & FF_THREAD_SLICE)) {
+ const int start_i = av_clip(h->resync_mb_x + h->resync_mb_y * h->mb_width, 0, h->mb_num - 1);
+ if (start_i) {
+ int prev_status = h->er.error_status_table[h->er.mb_index2xy[start_i - 1]];
+ prev_status &= ~ VP_START;
+ if (prev_status != (ER_MV_END | ER_DC_END | ER_AC_END))
+ h->er.error_occurred = 1;
+ }
+ }
+
if (h->pps.cabac) {
/* realign */
align_get_bits(&h->gb);