From patchwork Tue Sep 12 19:30:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43719 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4e27:b0:149:dfde:5c0a with SMTP id gk39csp3015879pzb; Tue, 12 Sep 2023 12:30:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHMlMLSDR4ivUyw6A/DLPrQcbcOn0jJMvc+HVg/3OLmpItUtbM3Vw0z24qvvmcICfndEMer X-Received: by 2002:a17:907:77c2:b0:9a1:f21e:cdfc with SMTP id kz2-20020a17090777c200b009a1f21ecdfcmr196037ejc.41.1694547045279; Tue, 12 Sep 2023 12:30:45 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i19-20020a170906115300b0099279b2cdddsi9108504eja.833.2023.09.12.12.30.43; Tue, 12 Sep 2023 12:30:45 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=umToHMHU; arc=fail (body hash mismatch); 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 41D2368C9CD; Tue, 12 Sep 2023 22:30:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04olkn2088.outbound.protection.outlook.com [40.92.73.88]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 545C368AC36 for ; Tue, 12 Sep 2023 22:30:34 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VgpOJXX2jRirunGTv/Om6mNm/zaau0K/mjwXsFHjuq+VM3ADlyeoPeLOoAIZrS+sAtEZADjHXMcNAhbX44vrRVJfvHOx4YMTcAD9RdqSOG+3uUzQzWL24io2zoCQpSDsaoIQ+s4l/+q86rBFv43zGNIo6AvJYDwikbDLJ4sBR+bv6wGdR0ZcvBHumjDWPxE/S8sjJFgIjQOE2fW7tgAu3zJ7EIku7f2/ns55vONSqOEoRbRjGClKVsnQoDnTIwViv2qNfNjhiS0bAQAsuP/SbXcDLSPqvnZpj0OSLdFf66qS6aTr96HtgijgvCDWBfFYD1VEXsce95RxuukMlVkhmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=l8yNqAAWt6oeCI7es13UmN2GuxNv8uOfkW5ZUYbypeM=; b=fNI5AH+Gs52ql5p8u6kDBZ2BlrMsI0GYt8rePzxWhzQm7/1eiI7FITrUn3Ai5hJ8GUpUWQAHye7KdTqP4mpzWoPov6PjOBlL427sjWLovJO7oh8TZ4Z3keviB5AA5c3W4jfrQ0HX349+MNPvFM4fEkp6Ix1SpdBp1ooNtB3SBeN0WpD4oN3C+SncQZrob6+tZgGcww0Fc5Y9DiIpbHVxAm8ZkkuGwkW1HoR95KdFUnFGOTfv8Cm9jYCjFoHYdjElEio+cMMjNC4f4VeumYqJIxDnfUk2+O49m6hnxdOH6QHcXnHbY5VUttCmldwg7PR84rCMmtcJsJsQzl+3/JOVRA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=l8yNqAAWt6oeCI7es13UmN2GuxNv8uOfkW5ZUYbypeM=; b=umToHMHUN2YEqq7m0QUnUc7fW9yqz80dkowf8mMJ6faNSJLmOVPKRXh4L+Qci8i4LRJVd33ZV+YH6ZxP8MBpKGsimhFnxpqUlCcwELzNfl0tu59nR1lhjGiNDGAdH0KEnHEbI7sdQMp4BkfbW0swJrRdr2ieCAgoU/6be3/1WIbGSDRyvB7RHA/w3Z87zJ87oPslBx6mplIwfOnh6OhuFU4AvtaS9gVoPYYU6Ef27Aozn/v1WV2HgVNounvJig6rakXq3cy6Zq+sSSHR2vQ7qhcQ6LiNdF9j3wXIT8WRBFRjySue85u277WiQn4hleZtM3vTSj6hviyyCh0vvXy/ZQ== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AS8P250MB0251.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:37e::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6768.33; Tue, 12 Sep 2023 19:30:32 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::3fff:eb7b:b8e2:4dba]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::3fff:eb7b:b8e2:4dba%4]) with mapi id 15.20.6768.036; Tue, 12 Sep 2023 19:30:32 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 12 Sep 2023 21:30:14 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [/xnmOkhJNOAnpHH/ZW5SgY5igzZfVim+] X-ClientProxiedBy: ZR2P278CA0046.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:53::19) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20230912193015.2762124-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AS8P250MB0251:EE_ X-MS-Office365-Filtering-Correlation-Id: 15e63f02-9dff-4108-c48d-08dbb3c6bab9 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: gkRTU2z4YxTP73VG6YlEdE7VhipOM0WMy5xchOdDkv2hXGSSBoH10U5SgpuoiDmFKXYz3OaHzSBCGyZN/qdH+qi7gSqyYd0Bhp0exk2tV8cX9HND+PEOH2LVwfR6jjetaCV55oj9+lxQYuHbfylIuDzFzY9crdrhJS46LdJ1ts+O2xE5MzwKUrFoA36yGvIV5/yl3pb9HkWWSbmEFBE3HG2prvL/FR62GiXRUSl2U2Eh1Wd6MlqZpB8tpVob8+XYix60rX5nPUx9/hLXmjasSYwapNqybXiTmONqoZqhNLOPPupXJl1YxAHl3MQx3aOpNL80q9KN5IXcfjEZmHBFlcT5BMlSFTsGBEBng0gc3JN7wGKTq8qhSnRbELwCnDVDK5Cv+oAsN5Oz263yVwchdCG1QBj4SuFmdPafNaa47NQj2IQ/mM62Dt2EODpT4srI5uIFei2Iy/a8p9WBnBjEHVnm43cBO7dQmYjUzzXPNvbxvZo1CapHrfTe7aBm5ZuS/E2G0Z0JvMTbKb9hvwb2+LZdKaLRCElHwalCYOJ0VzPXsXgsmXXabSyhFdPb3skYf5CwJ8OBRprCTRXU8EXq+nBiTAIfPAzXIGjVweVxfiEiEMgFY9qA2Hz4/i417GWJ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: XfXPDNWCUcEDJqI4P8QvDyzAWhK8vAOwGDyEOT1+Os/XYE3jgUlRP/awzV+f47Gglk2PH2QZTydKDCGE50a7oaNVIfD5cI6L7PdWq7hYqqhJBCWc6s27AKhBq1YmqE3IT3Ec1sfs4WVefritmbRV103z+wUNR4nUoEs44uFuidTmnnDFArx3gOiXkW4wRc4Ohq1je9dO1QjwnLpw/8FUfoVTK7NZ+17/nA876OfV7nk6wMbNqPCzyLRBqu9FkEiekvrLbk23KJ0oNI8bIUAGH68JNf5NYkzSUXwjz4UaSm58lFZvNs9XkWi9wc7OTAWo30WSPOE3HG67WzuVd+SJoi1H/F4a9AthkVKxMIodAOv5ApMCQPIl6N7sf1X6piftoekHIdlIyaTy2y1nKYojkVzIJO3dOIIqC/OvKBsKv8HmxNbzPtwQ3doqiBkmdfBlEXos8YVkPj/2skQrcV50u37W4oLLYvQOeeacqOe/IQLYAPX3xV8yxHoCVplofQ6Yk5zROXhm6krVH0CAbOKi7acfwTLFbIWWFeilSfCuqOxVM1GnGe5asSqtRtxWzb1Yz+eDy0hfiIoqx+CYvZL/vZufHKSh+Qd+erwDViBYz2UkPiUVeiXzR2UuhdIGeb3tXKSoWxV/w1Ef9ai9qcgGi3LEC8aMA7afouMoZSPKa3+5GnHiVkxIbyez1lp08dMEU32S12XU5pXvJmYYzBV4M3/CFKOWgXZ5h7gvaEpbjkAGsSN83IG5D6GiqqnOjBSHbkcAelCgQo0NFBCIJmuNuKHO7aL6hzjDu1DjFT0UjVAcQToeXQqfsqpgZp+e6snHkuUo8+fRjMV1tXI/BLT1EH+p1XsKMSRgs68EBiqyVynLnwSwqJQnGQeZCnY5AbfWEuPIRefKQwcDUVzgd/AeC+Z2opeAjR28zWd36W/jCZ03bs/QwM/4su0wAs/qButIhncP4m3J8i1WqJ33LmCoqU8dTR7luTMiqhdHsGxDpxjzBTXAi6h2aeM1tgP1DhUtvlECSXd6/BF4z2yKlVl9FBwdw4Rjg/hgcPSwbD7YOyrKoLpc5p5l5x/ftFflGWIpWmRp3vs9cb9nxeNnzTwgeVGG08LfEuNTNIwp1hB6UUpZL9US4YSZ6PkbVkX1NW0v+93Ba/jqX2SpLWE+9jfv6zf5t1dHA10qyT8B4VfkTuqwAdPw1w4ujYcZigfQ5nmK9fJYmWXoN2oGiBRTEd18Pw+xcSeogMw2yNBpWsmd0iqZPlQqK6PS9EliQ7qFECUz X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 15e63f02-9dff-4108-c48d-08dbb3c6bab9 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Sep 2023 19:30:32.3565 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8P250MB0251 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/error_resilience: Make applying decode_error_flags optional X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HxiRE2hkfqj1 Add a pointer parameter that if supplied will be used to return the updated decode_error_flags. This will allow to fix several races when using frame-threading; these resulted from AVFrame that the earlier code updated concurrently being used as source in an av_frame_ref() call in the decoder's update_thread_context. Signed-off-by: Andreas Rheinhardt --- libavcodec/error_resilience.c | 7 +++++-- libavcodec/error_resilience.h | 12 +++++++++++- libavcodec/h263dec.c | 2 +- libavcodec/h264dec.c | 2 +- libavcodec/mpeg12dec.c | 2 +- libavcodec/mss2.c | 2 +- libavcodec/rv10.c | 4 ++-- libavcodec/rv34.c | 6 +++--- libavcodec/vc1dec.c | 2 +- 9 files changed, 26 insertions(+), 13 deletions(-) diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c index 68e20925e0..880aea6f30 100644 --- a/libavcodec/error_resilience.c +++ b/libavcodec/error_resilience.c @@ -889,7 +889,7 @@ void ff_er_add_slice(ERContext *s, int startx, int starty, } } -void ff_er_frame_end(ERContext *s) +void ff_er_frame_end(ERContext *s, int *decode_error_flags) { int *linesize = NULL; int i, mb_x, mb_y, error, error_type, dc_error, mv_error, ac_error; @@ -1114,7 +1114,10 @@ void ff_er_frame_end(ERContext *s) av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n", dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type)); - s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE; + if (decode_error_flags) + *decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE; + else + s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE; is_intra_likely = is_intra_more_likely(s); diff --git a/libavcodec/error_resilience.h b/libavcodec/error_resilience.h index 47cc8a4fc6..b03f8ec896 100644 --- a/libavcodec/error_resilience.h +++ b/libavcodec/error_resilience.h @@ -90,7 +90,17 @@ typedef struct ERContext { } ERContext; void ff_er_frame_start(ERContext *s); -void ff_er_frame_end(ERContext *s); + +/** + * Indicate that a frame has finished decoding and perform error concealment + * in case it has been enabled and is necessary and supported. + * + * @param s ERContext in use + * @param decode_error_flags pointer where updated decode_error_flags are written + * if supplied; if not, the new flags are directly + * applied to the AVFrame whose errors are concealed + */ +void ff_er_frame_end(ERContext *s, int *decode_error_flags); void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status); diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index 52e51dd489..9f63f1a7cb 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -622,7 +622,7 @@ retry: av_assert1(s->bitstream_buffer_size == 0); frame_end: if (!s->studio_profile) - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); if (avctx->hwaccel) { ret = FF_HW_SIMPLE_CALL(avctx, end_frame); diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index f13b1081fc..8e90678125 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -779,7 +779,7 @@ end: if (sl->ref_count[1]) ff_h264_set_erpic(&h->er.next_pic, sl->ref_list[1][0].parent); - ff_er_frame_end(&h->er); + ff_er_frame_end(&h->er, NULL); if (use_last_pic) memset(&sl->ref_list[0][0], 0, sizeof(sl->ref_list[0][0])); } diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 1accd07e9e..4b5341b914 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -2033,7 +2033,7 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) if (/* s->mb_y << field_pic == s->mb_height && */ !s->first_field && !s1->first_slice) { /* end of image */ - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); ff_mpv_frame_end(s); diff --git a/libavcodec/mss2.c b/libavcodec/mss2.c index 70aa56cb84..2237cc8bb1 100644 --- a/libavcodec/mss2.c +++ b/libavcodec/mss2.c @@ -422,7 +422,7 @@ static int decode_wmv9(AVCodecContext *avctx, const uint8_t *buf, int buf_size, ff_vc1_decode_blocks(v); if (v->end_mb_x == s->mb_width && s->end_mb_y == s->mb_height) { - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); } else { av_log(v->s.avctx, AV_LOG_WARNING, "disabling error correction due to block count mismatch %dx%d != %dx%d\n", diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index 5edd934f82..6abceade4e 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -477,7 +477,7 @@ static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf, if ((s->mb_x == 0 && s->mb_y == 0) || !s->current_picture_ptr) { // FIXME write parser so we always have complete frames? if (s->current_picture_ptr) { - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); ff_mpv_frame_end(s); s->mb_x = s->mb_y = s->resync_mb_x = s->resync_mb_y = 0; } @@ -649,7 +649,7 @@ static int rv10_decode_frame(AVCodecContext *avctx, AVFrame *pict, } if (s->current_picture_ptr && s->mb_y >= s->mb_height) { - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); ff_mpv_frame_end(s); if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index af4d6a3400..e9660bb457 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -1560,7 +1560,7 @@ static int finish_frame(AVCodecContext *avctx, AVFrame *pict) MpegEncContext *s = &r->s; int got_picture = 0, ret; - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); ff_mpv_frame_end(s); s->mb_num_left = 0; @@ -1655,7 +1655,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, AVFrame *pict, av_log(avctx, AV_LOG_ERROR, "New frame but still %d MB left.\n", s->mb_num_left); if (!s->context_reinit) - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); ff_mpv_frame_end(s); } @@ -1790,7 +1790,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, AVFrame *pict, av_log(avctx, AV_LOG_INFO, "marking unfished frame as finished\n"); /* always mark the current frame as finished, frame-mt supports * only complete frames */ - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); ff_mpv_frame_end(s); s->mb_num_left = 0; ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0); diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index b8663aaf98..449d2fea5e 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -1348,7 +1348,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict, if ( !v->field_mode && avctx->codec_id != AV_CODEC_ID_WMV3IMAGE && avctx->codec_id != AV_CODEC_ID_VC1IMAGE) - ff_er_frame_end(&s->er); + ff_er_frame_end(&s->er, NULL); } ff_mpv_frame_end(s);