From patchwork Sun Nov 26 22:26:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 6371 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp946456jah; Sun, 26 Nov 2017 14:27:06 -0800 (PST) X-Google-Smtp-Source: AGs4zMZZkaZmX/33QWEbSmod6zBs7oQecbQfLb5owgFOyMZxsvWzT7noV9iYl20DhfB+dbUbdsm8 X-Received: by 10.28.46.67 with SMTP id u64mr2136018wmu.64.1511735226232; Sun, 26 Nov 2017 14:27:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511735226; cv=none; d=google.com; s=arc-20160816; b=gpBY09eVM0W9ym0FNHzKqb4nQiI+kGC57vhBcXNBIfgnKucKnnzxxqHweZSn66GZH7 EI2iry8LWxIUU94Jei391EmaicWmAjoVPIZ0fnj1C9ROkDxy5tYJVOD/75rRCeQbJ5I6 jCl7+uoy+jpnPgb4DV6WtW5nzq0vcbw6XQFqwh54+NDmxVk6TNV4j5bixlrVuRkXl6OU gHBCrGx1rMmCTnXjlDgP8ECfXJCCoR7IEMZy8Mx8TL3Vd81CGCYiohNEm2qmNRiKyvgf AYp0SMi0c4OkMXqc6EAvPQW9zwthzah3W8dA7zLKUJmMGThQ+KjF82XyC8oKC3allVQr XUug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to :arc-authentication-results; bh=qiDhdFHVSrcCGUesEE7O3/BLu7Hk6ZLqWcyMDkocaHc=; b=SrI4srZATVrbbI5P3nrEDBef0+p6sXLl23VmDimjrnfuYh/q0KwqkFzIy8NUiG/cWa QuCnqwsxruFu5DkFwTxvwtVF6r2+VZBPTrQzL+5LUtNT/1MlMXEE+s1dZs6VgtzFg4Jg GSdzzaTpzrfw48LmNSvscKljXHxNXzdAc2Vpzs25KVUQ4fqR8zu4IzF6/59ApWGv+hpO tH8bpCXg9U6PAWXc10fWdhwaDBQSXya3I3Peu8jaSxcNvBGx1JoVCz1/Uwectb1FGeE9 gXE7CWR1aE85vB81PPgB6l1FQTzxSgCRYX4gCpNzBRgnmhVPI8AycmbwoT6yNkBTMPzT RE0Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g99si22493242wrd.498.2017.11.26.14.27.05; Sun, 26 Nov 2017 14:27:06 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7E57568A2BA; Mon, 27 Nov 2017 00:27:03 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vie01a-dmta-pe01-3.mx.upcmail.net (vie01a-dmta-pe01-3.mx.upcmail.net [62.179.121.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 52AA868A246 for ; Mon, 27 Nov 2017 00:26:57 +0200 (EET) Received: from [172.31.216.43] (helo=vie01a-pemc-psmtp-pe01) by vie01a-dmta-pe01.mx.upcmail.net with esmtp (Exim 4.88) (envelope-from ) id 1eJ5O6-0004hw-K8 for ffmpeg-devel@ffmpeg.org; Sun, 26 Nov 2017 23:26:58 +0100 Received: from localhost ([213.47.41.20]) by vie01a-pemc-psmtp-pe01 with SMTP @ mailcloud.upcmail.net id emSx1w00j0S5wYM01mSyFt; Sun, 26 Nov 2017 23:26:58 +0100 X-SourceIP: 213.47.41.20 From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Sun, 26 Nov 2017 23:26:56 +0100 Message-Id: <20171126222656.5206-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.15.0 Subject: [FFmpeg-devel] [PATCH] avcodec/error_resilience: Use atomic set on writing error_occurred per slice X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This is more correct if multiple slices are handled in parallel Signed-off-by: Michael Niedermayer --- 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(-) diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c index 8f172beca6..c9da30b84b 100644 --- a/libavcodec/error_resilience.c +++ b/libavcodec/error_resilience.c @@ -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); } } diff --git a/libavcodec/error_resilience.h b/libavcodec/error_resilience.h index 664a765659..5c000e13d1 100644 --- a/libavcodec/error_resilience.h +++ b/libavcodec/error_resilience.h @@ -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]; diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index b222de793b..6fa8a657a4 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -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) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index da76b9293f..5b37596d81 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -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); } } diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 2eb19c21bb..2581589bb7 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -49,6 +49,7 @@ #include "thread.h" #include "wmv2.h" #include +#include 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); } diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 96b8bb5364..648c7370fe 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -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; }