@@ -808,7 +808,7 @@ void ff_er_frame_start(ERContext *s)
memset(s->error_status_table, ER_MB_ERROR | VP_START | ER_MB_END,
s->mb_stride * s->mb_height * sizeof(uint8_t));
atomic_init(&s->error_count, 3 * s->mb_num);
- s->error_occurred = 0;
+ atomic_init(&s->error_occurred, 0);
}
static int er_supported(ERContext *s)
@@ -864,7 +864,7 @@ void ff_er_add_slice(ERContext *s, int startx, int starty,
}
if (status & ER_MB_ERROR) {
- s->error_occurred = 1;
+ atomic_store_explicit(&s->error_occurred, 1, memory_order_relaxed);
atomic_store(&s->error_count, INT_MAX);
}
@@ -892,7 +892,7 @@ void ff_er_add_slice(ERContext *s, int startx, int starty,
prev_status &= ~ VP_START;
if (prev_status != (ER_MV_END | ER_DC_END | ER_AC_END)) {
- s->error_occurred = 1;
+ atomic_store_explicit(&s->error_occurred, 1, memory_order_relaxed);
atomic_store(&s->error_count, INT_MAX);
}
}
@@ -62,7 +62,7 @@ typedef struct ERContext {
ptrdiff_t b8_stride;
atomic_int error_count;
- int error_occurred;
+ atomic_int error_occurred;
uint8_t *error_status_table;
uint8_t *er_temp_buffer;
int16_t *dc_val[3];
@@ -637,7 +637,7 @@ retry:
if (ff_h263_resync(s) < 0)
break;
if (prev_y * s->mb_width + prev_x < s->mb_y * s->mb_width + s->mb_x)
- s->er.error_occurred = 1;
+ atomic_store_explicit(&s->er.error_occurred, 1, memory_order_relaxed);
}
if (s->msmpeg4_version < 4 && s->h263_pred)
@@ -2480,7 +2480,7 @@ static void decode_finish_row(const H264Context *h, H264SliceContext *sl)
ff_h264_draw_horiz_band(h, sl, top, height);
- if (h->droppable || sl->h264->slice_ctx[0].er.error_occurred)
+ if (h->droppable || atomic_load_explicit(&sl->h264->slice_ctx[0].er.error_occurred, memory_order_relaxed))
return;
ff_thread_report_progress(&h->cur_pic_ptr->tf, top + height - 1,
@@ -2532,7 +2532,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
int prev_status = h->slice_ctx[0].er.error_status_table[h->slice_ctx[0].er.mb_index2xy[start_i - 1]];
prev_status &= ~ VP_START;
if (prev_status != (ER_MV_END | ER_DC_END | ER_AC_END))
- h->slice_ctx[0].er.error_occurred = 1;
+ atomic_store_explicit(&h->slice_ctx[0].er.error_occurred, 1, memory_order_relaxed);
}
}
@@ -49,6 +49,7 @@
#include "thread.h"
#include "wmv2.h"
#include <limits.h>
+#include <stdatomic.h>
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
int16_t *block, int n, int qscale)
@@ -2592,6 +2593,6 @@ void ff_set_qscale(MpegEncContext * s, int qscale)
void ff_mpv_report_decode_progress(MpegEncContext *s)
{
- if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->er.error_occurred)
+ if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !atomic_load_explicit(&s->er.error_occurred, memory_order_relaxed))
ff_thread_report_progress(&s->current_picture_ptr->tf, s->mb_y, 0);
}
@@ -1058,7 +1058,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data,
get_bits_count(&s->gb), s->gb.size_in_bits);
// if (get_bits_count(&s->gb) > buf_size * 8)
// return -1;
- if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B) {
+ if(atomic_load_explicit(&s->er.error_occurred, memory_order_relaxed) && s->pict_type == AV_PICTURE_TYPE_B) {
ret = AVERROR_INVALIDDATA;
goto err;
}
This is more correct if multiple slices are handled in parallel Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> --- libavcodec/error_resilience.c | 6 +++--- libavcodec/error_resilience.h | 2 +- libavcodec/h263dec.c | 2 +- libavcodec/h264_slice.c | 4 ++-- libavcodec/mpegvideo.c | 3 ++- libavcodec/vc1dec.c | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-)