From patchwork Thu Sep 2 15:41:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 29959 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp400719iov; Thu, 2 Sep 2021 08:43:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx3mJ1HlbA63JBAWxi9McQcdQlX5O/dUXa9hAyxZmEn1taV+zUGlYW8eTy8Ap8Tw6zyHEuJ X-Received: by 2002:a17:906:6011:: with SMTP id o17mr4400445ejj.157.1630597380741; Thu, 02 Sep 2021 08:43:00 -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 jg30si2140756ejc.709.2021.09.02.08.43.00; Thu, 02 Sep 2021 08:43:00 -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=Otp9Kqnk; 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 C001B68A56C; Thu, 2 Sep 2021 18:42:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-oln040092064055.outbound.protection.outlook.com [40.92.64.55]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1905D68A60C for ; Thu, 2 Sep 2021 18:42:01 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Cyd4qQc86Vl48271UeE8zHRp/2M9dee60ErGyviomgE8iVD1Zso2n+bbwun6/NmMVvi2kRG16LAmV4KWshvG1UhQiCZr+IY5q9R9bd6mSr06asL9iyLoD7oNvAJHRXcaEIzTUcPJUXvKco8V4AUImrJ/CnLbHi0B4LEf1EW2wbCquYAhd6SW74GDlNZEvYRBBj1W3CcMnDG1h2u1J6G5MIcxyrCw8lrwroYgSGzUGiRwkNuZmrgJ/V+kuY51Jr4cNLLCkvv3qgXni/K63lRg+2SjmXgx4S26a62BEgSl7RjGc7C+XpYYoqfKcy/ZBSxRjzhNn0KjjRbsEND2KnBwFw== 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-SenderADCheck; bh=QqsZ84jeEP01pqAFjTRCWp4ATJ4LDjEOl/XwYTobQuo=; b=nlvnm5OuPQLjFTDkEwbMf4L0trhqdycKT4c5/IL9pF26IMyrGAdIJAoZxCxiWYPyyCDk1HFgxg9AEDbgvAzqvTfZpnHry98G+teEv/+6JLTlZ6dxhAK4E8x4iAQA6F7DDUJrGWX3KR9DhpW5yWBY31SZY0euYc5trSnNdcW8ZuLOuzGzHJEZSw/6NLTnEGxq90YbI/tnk3Sy+K+S3NddDKB52mXnYT/7Pa7AJY/EQZU0N1Xvhgit/SCrUQZd+DbOdq41RirdqA6KvRDkwqo5G3eN2Kw5aV5C6xrCQIuzlaJIAGTIzMCZkPjYQnqa7NxKG+v9UhzaK7IO4yX3nD5JzA== 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=QqsZ84jeEP01pqAFjTRCWp4ATJ4LDjEOl/XwYTobQuo=; b=Otp9KqnkF93mq1dxnZsSrY4syvtvklffZcKXTMyvMJMMZFwYfOp2CSbJlNEJWd3FdCqvfAwElgr/0zr/6zyafYzh6rnav3pwk3GA3SIuDFbtU/HUpiqyB5nDZ37IgvGO4zLvrir9GGArQ01tLkW03GqqtEJetWmxrX1wqwQpxMItTM/CflxuNnDtlChyFLwta8ysWpzsuGCwK8lAzqFDoz3CmP9+Rg80CJtCLmn4EJwdvpzVAn0FyIMA0QXrWfeETNV8TT/eNyuXht8fT6U2rDf3baoRGkzb353XOEerbyYOeU/e90sn4gXdk0CqDEtDikD1w7cyst8eVNUPJBgskg== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM7PR03MB6532.eurprd03.prod.outlook.com (2603:10a6:20b:1c3::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4457.17; Thu, 2 Sep 2021 15:41:48 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f8b5:1ef2:89b2:f8c5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f8b5:1ef2:89b2:f8c5%7]) with mapi id 15.20.4457.024; Thu, 2 Sep 2021 15:41:48 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 2 Sep 2021 17:41:21 +0200 Message-ID: X-Mailer: git-send-email 2.30.2 In-Reply-To: References: X-TMN: [i3sts1GMO+orvVXMnIMcm9ubkACDARrY] X-ClientProxiedBy: PR1P264CA0031.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:19f::18) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20210902154127.2571616-6-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.142.38) by PR1P264CA0031.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:19f::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4478.20 via Frontend Transport; Thu, 2 Sep 2021 15:41:48 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5e6ea7fa-67db-415e-e5aa-08d96e282d2d X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiRAro5Pl0DReHj5zSq9SRg207texylz2fYWp3r0eytqA96m8Er4k8Wo/4KJX2idheX3C4g/LJEp/S9qYl3KuqVTPtJU2wzIR4feBvoDjTQTDJSP84ZGwX9lcVuxcxKQDEg/HpUdTVrHiMOF6PZRp4E5AZC8LJebx4OzqAt8xIAKVPtAgw1C9B0QgyKCUl9ctXzCPgbzx/9h7vROsR/VkslceWvjhgdQflEh6W9CXFdKRjE5PZH5sbKPXhUnfWMuc+b4TUb635nuWDNnB8uTS+3estzDQSVIr+7+3Za/dhYO3dsNR15CphJdrojvLChsq/iozSw+xj+EqlF/gjrni0zLaxf+CrhkMx9lW2vCk3S0ggURfo1P+RcewnxPcGP4kqJ5pBYFrxVzluPqPJvTOebzNZ90wvFO50F+eMrNvmZuyu4XlpTcWKD5rKfPaQ2y1AlcGyN5n3xHjC7boWp3PmFdGXffSJ6GnS1u6zb9OJqnxQ+rAeTH859uQpx98A9zjSy4xDMohratR5UKMzwA4OIMKQ0ApuXa5xkGtZlEkTR0QOOAtPhvjSZOSagANgpvpV8ISk/rLz1xmRD3ZKMNO94DJTUMzwQYKJTYgevANJctF96fC7zrM1R42vtcrrjeYXhXSdCrKIJVUwp13HPiVBJDc9PmHyI/u646TDB/uLAkODTGZJlrd8KCMrmDz9nwOBk1OTy47HQzMsoK/aGLu/8ABX1t6aGlEgUYWjyXG1CM8OdtzTVuWTVnd5VfrIKf+tE= X-MS-TrafficTypeDiagnostic: AM7PR03MB6532: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: V+d/RTtHzrpf/tf/v57JHXxWflGCLhjupqrFcMhqAS+YOh328fi3VS2zs/kV9TndvrBI3ms6hPhsxw4i3d+lb4xFors/SMXCNEJ+uST1VqSCdvqNi19TklfRQJBhKuHxfwIakRz35TTznWrzlQ271fWuZFBlGI9DGMovSA4ujajobwkxnqiGafn8LLYYurfZW5ZFRdipekjJpwevLSIPiGrACfXgNwbUPNL9VA7E7uc7+cXyZRuIuD0PtcINUrmQCdLxD2pDKt9yCwu7tAcwXLvzop7hLjmapBHRYhJvZVeY8dhkL4PSauAJRc8W9zxB7CgA0Zxbkf69ekzz5n+s1s2X2bHwFH2V1yChpAGlcUqbYz7zt3AWCfJrsRFpWNP733E5+f8tQUjTeHN4qrPAu9GdPaPH0ajL3es44kgv+ZDjBglFsBvNijvOy/jCBySR X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vEspVnC9aRSdblFQUQT83dUjYvg+W4clh5n1U3p+KbC9+9h3bnsFqYBF8saRbHhY3iH4O515CH/5x7hxra5LlUjCwFikD4Q9zCGX2G/DGPMXYTxnGdmTXoytkBEbxUaARAgzfHqHAXzoPKi0NKxEhQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5e6ea7fa-67db-415e-e5aa-08d96e282d2d X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2021 15:41:48.7327 (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: AM7PR03MB6532 Subject: [FFmpeg-devel] [PATCH 07/13] avcodec/frame_thread_encoder: Check initializing mutexes/conditions 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: AifFOFkQsQbb Signed-off-by: Andreas Rheinhardt --- libavcodec/frame_thread_encoder.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 9bc48c7761..e5f6544750 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -29,6 +29,7 @@ #include "libavutil/thread.h" #include "avcodec.h" #include "internal.h" +#include "pthread_internal.h" #include "thread.h" #define MAX_THREADS 64 @@ -52,6 +53,7 @@ typedef struct{ pthread_mutex_t task_fifo_mutex; /* Used to guard (next_)task_index */ pthread_cond_t task_fifo_cond; + unsigned pthread_init_cnt; unsigned max_tasks; Task tasks[BUFFER_SIZE]; pthread_mutex_t finished_task_mutex; /* Guards tasks[i].finished */ @@ -65,6 +67,12 @@ typedef struct{ atomic_int exit; } ThreadContext; +#define OFF(member) offsetof(ThreadContext, member) +DEFINE_OFFSET_ARRAY(ThreadContext, thread_ctx, pthread_init_cnt, + (OFF(buffer_mutex), OFF(task_fifo_mutex), OFF(finished_task_mutex)), + (OFF(task_fifo_cond), OFF(finished_task_cond))); +#undef OFF + static void * attribute_align_arg worker(void *v){ AVCodecContext *avctx = v; ThreadContext *c = avctx->internal->frame_thread_encoder; @@ -127,6 +135,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx) int i=0; ThreadContext *c; AVCodecContext *thread_avctx = NULL; + int ret; if( !(avctx->thread_type & FF_THREAD_FRAME) || !(avctx->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS)) @@ -185,11 +194,9 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx) c->parent_avctx = avctx; - pthread_mutex_init(&c->task_fifo_mutex, NULL); - pthread_mutex_init(&c->finished_task_mutex, NULL); - pthread_mutex_init(&c->buffer_mutex, NULL); - pthread_cond_init(&c->task_fifo_cond, NULL); - pthread_cond_init(&c->finished_task_cond, NULL); + ret = ff_pthread_init(c, thread_ctx_offsets); + if (ret < 0) + goto fail; atomic_init(&c->exit, 0); c->max_tasks = avctx->thread_count + 2; @@ -246,6 +253,10 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ int i; ThreadContext *c= avctx->internal->frame_thread_encoder; + /* In case initializing the mutexes/condition variables failed, + * they must not be used. In this case the thread_count is zero + * as no thread has been initialized yet. */ + if (avctx->thread_count > 0) { pthread_mutex_lock(&c->task_fifo_mutex); atomic_store(&c->exit, 1); pthread_cond_broadcast(&c->task_fifo_cond); @@ -254,17 +265,14 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ for (i=0; ithread_count; i++) { pthread_join(c->worker[i], NULL); } + } for (unsigned i = 0; i < c->max_tasks; i++) { av_frame_free(&c->tasks[i].indata); av_packet_free(&c->tasks[i].outdata); } - pthread_mutex_destroy(&c->task_fifo_mutex); - pthread_mutex_destroy(&c->finished_task_mutex); - pthread_mutex_destroy(&c->buffer_mutex); - pthread_cond_destroy(&c->task_fifo_cond); - pthread_cond_destroy(&c->finished_task_cond); + ff_pthread_free(c, thread_ctx_offsets); av_freep(&avctx->internal->frame_thread_encoder); }