From patchwork Mon Feb 8 12:23:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25503 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 022BF4493E4 for ; Mon, 8 Feb 2021 14:23:47 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C47F16880FB; Mon, 8 Feb 2021 14:23:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1D626880FB for ; Mon, 8 Feb 2021 14:23:39 +0200 (EET) Received: by mail-ed1-f43.google.com with SMTP id s5so17798850edw.8 for ; Mon, 08 Feb 2021 04:23:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:reply-to:mime-version :content-transfer-encoding; bh=et1PRt1S+4vgoaBZ+P/rE+r2XeU6M4PLpHACVOok9WM=; b=bsYQ58RPcv+1q9XoMpn8t7Yqu9660nJkxLcnTO91Ow0PDswxnyoTSB7zDA7XmdUyXA rowihXeEYgSJRdBCLa4zYLLXfzKvhAPkNGgTJLhaZPrYnO7RPK1tplUmOdPWmMJxlRMN WlVU5uKmAnwT1oPUz9rB3YxbNjbkyKJaqgos1euoKETKvArelNLmY7QDOCKfFlFJsTK2 cvuhd2iLScsWzt/ysEQ+jvVOSFCZS3WXNodW+sLexLYuHMKjW3N/HaqaFBFk3xysI7VR Sc9aQ9ZI5uCXQ8j78fwKjMQaHquxpfQdcHjLEmbogDvQL+Tu44eMRsrgjsB4+3n0bOgD fiqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :mime-version:content-transfer-encoding; bh=et1PRt1S+4vgoaBZ+P/rE+r2XeU6M4PLpHACVOok9WM=; b=MjUUsYVKMAdBWm0jLb9o5YdU0s7NHYJ5Yr1z+rh5QjJPLnMfN1lLQ00VwPFjvNfAIL /4kpGv/0M+fm7N0WnVLwKf4SlBh/M8wqUJPoEP3A1LFHAdlCmPR/xDtd8gVL16Hu381p NZCGbgkmbD1BA9rpSZ+bEcpq5H1j6Z0Zpo/VvH5Rg+3qW388u0cLd014cWGTyubZsH8u LE3UzzNg+I+ufWGSCqwbJVwgjPsa69zDezmRLbJ1xLNX9hFP4iXA33+e02VoPxqDXCvl tFcfrTcM6OImH8asqwM9I7HypSzaPpp5Sud5MsWMP1+7VH2G8to8UMUIgy18E2Yvz9Yq oPJg== X-Gm-Message-State: AOAM530JuOlOZscZ+p7/KQ+HVbO22JZfwr/LCM9cRRpRVKz1beuCUT4n r1SJSsFx8ARuZaIPPBqWZhxkNiJebJw= X-Google-Smtp-Source: ABdhPJxSr5+sYcSeijS7oJWsJ/m/3qmo5SUQsoklEszRVqYE2Cs2wc1njzPhGNAX5mnabE2D4Yi8iw== X-Received: by 2002:aa7:dd57:: with SMTP id o23mr16909455edw.252.1612787019219; Mon, 08 Feb 2021 04:23:39 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.23.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:23:38 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:23 +0100 Message-Id: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/8] avcodec/frame_thread_encoder: Improve type safety 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavcodec/frame_thread_encoder.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 83229f620a..ee289c90e3 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -35,8 +35,8 @@ #define BUFFER_SIZE (2*MAX_THREADS) typedef struct{ - void *indata; - void *outdata; + AVFrame *indata; + AVPacket *outdata; int64_t return_code; unsigned index; } Task; @@ -255,19 +255,12 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ while (av_fifo_size(c->task_fifo) > 0) { Task task; - AVFrame *frame; av_fifo_generic_read(c->task_fifo, &task, sizeof(task), NULL); - frame = task.indata; - av_frame_free(&frame); - task.indata = NULL; + av_frame_free(&task.indata); } for (i=0; ifinished_tasks[i].outdata != NULL) { - AVPacket *pkt = c->finished_tasks[i].outdata; - av_packet_free(&pkt); - c->finished_tasks[i].outdata = NULL; - } + av_packet_free(&c->finished_tasks[i].outdata); } pthread_mutex_destroy(&c->task_fifo_mutex); From patchwork Mon Feb 8 12:23:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25504 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1C34C44A631 for ; Mon, 8 Feb 2021 14:24:09 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F3DDE688385; Mon, 8 Feb 2021 14:24:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6A5EA68832B for ; Mon, 8 Feb 2021 14:24:03 +0200 (EET) Received: by mail-ej1-f45.google.com with SMTP id bl23so24292833ejb.5 for ; Mon, 08 Feb 2021 04:24:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=ERZN+7p1WNQQ+Va7GqMs2VtXeI3il3mfVwABgz4MybQ=; b=sRDwvdakmE4lWXs4UNatWnRFRbwvHJDQ2RrWlNThbGDiv/t66lHIvXpkO+JGT11kDY gqrfBjNPsAtUulpyLdrzYMO7AxpLVEtdoCfwKql957zEUDMh9oE4vR1bNJ4tlnZesGUs dYpZFWyhUaTCtB/mP9Uweu9jlx01W95gIuitwotD0gTbdaENKfPR7QkpHtvcJbAaAKHv 12jiihoLmnklD5Jtdeb/C1Eh4eFvY3ahrqe8791HDYjG2U5vGpmWPSpMI7kzWqAFhpOr 4JVW2cFz5Xzf84Xd7aJSig25FwmGq7BKtZrrgY+cpeWmceRugg2vm+aeitFmdJcRPPMJ RG1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=ERZN+7p1WNQQ+Va7GqMs2VtXeI3il3mfVwABgz4MybQ=; b=jRbTeLrTpbxdmfMxGyT3VZY6i/AFYwvWT7yHwiJsxgZ6AbdIU05DKQYg5vDGRHN1xP V/xM13IBKQ+aFJ567BhE2KtMARdcmV0nh9mTHlFdeW8ZNSBVc19jyONft8RXAqczvWvL YVD2ZqnrnRmqTptOZ7AegIR3ontofnMmsN/RLlLNv1ZFFSRi15+XXAsxaeClKnuYXTI2 fUxR+kjGhKXrr2+M78HcfhUSgNZXeYs+NvUUACHpQHeKkvZSbsMU6WEs2hGqMpvtyclQ K3F2JJHwuLp993ipWQLilz04ulu0QtJo/Y+lCx0r+Y0bkDBA1EAeeMCz0iW8MgUDocJn vJUg== X-Gm-Message-State: AOAM530P1ECmY6dmnhUu4n8eZzoXWSm5uaretvxltMJ/hW6IlcphKUj8 sG+bRPlc+DIvXsHvLD/zB+UjBuHsC1Q= X-Google-Smtp-Source: ABdhPJxqUpCmG/UNAgAKse/ekMHe6qgWn03ly+RCd6mTeNZDC4EDuMMkrbHZ63RHBjeyCFEWvnMHbw== X-Received: by 2002:a17:906:1e87:: with SMTP id e7mr16590685ejj.322.1612787042712; Mon, 08 Feb 2021 04:24:02 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:02 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:24 +0100 Message-Id: <20210208122330.555354-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/8] avcodec/frame_thread_encoder: Fix segfault on allocation error 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fixes a segfault from av_fifo_size(NULL) that happens in ff_frame_thread_encoder_free if the fifo couldn't be allocted; furthermore the mutexes and conditions that are destroyed in ff_frame_thread_encoder_free are not even initialized at this point, so don't call said function. Signed-off-by: Andreas Rheinhardt --- libavcodec/frame_thread_encoder.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index ee289c90e3..9ca34e7ffb 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -182,8 +182,10 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){ c->parent_avctx = avctx; c->task_fifo = av_fifo_alloc_array(BUFFER_SIZE, sizeof(Task)); - if(!c->task_fifo) - goto fail; + if (!c->task_fifo) { + av_freep(&avctx->internal->frame_thread_encoder); + return AVERROR(ENOMEM); + } pthread_mutex_init(&c->task_fifo_mutex, NULL); pthread_mutex_init(&c->finished_task_mutex, NULL); From patchwork Mon Feb 8 12:23:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25505 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1AB7544A631 for ; Mon, 8 Feb 2021 14:24:12 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 00E9E6891E2; Mon, 8 Feb 2021 14:24:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D45EB6897C2 for ; Mon, 8 Feb 2021 14:24:04 +0200 (EET) Received: by mail-ed1-f48.google.com with SMTP id s26so12036917edt.10 for ; Mon, 08 Feb 2021 04:24:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=+FhbnOQDBaPHLUSkG1S9Vti2MXSpHbkWkm6x8gCHtr8=; b=gzHRTCCY6poV/HyEfiu1/bgatH75/vmP04Nd0b4J/cl+/BliFfNAJH8MOQA9yMq2Te HKcnz7vvcXN+s+9iTTh8gQ/WZ3zE1Y9AjJv+kMeYZbriOfvYK6rbOm/xxn2Zo5SzUPl3 tZCh/5HfuBfWTe12mKprV+GmGZ2YquXHUyaYaaGdB09ubZFVmHBBxZD+jXmXnCQVEb7f mX7CK3aucd5vB8NfGkATkaIyOvSbcSPqpZM/MnOosNoQlMx9ub9hsbrBPNTOYuPjWAwx ZTtFE5WnrDjZe/PrwDcLc1lhuoPOfW8xLBBeoF5GilD6rYPcWI9ELOMbxvpnaA0XUghc K2qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=+FhbnOQDBaPHLUSkG1S9Vti2MXSpHbkWkm6x8gCHtr8=; b=oa2HnV7Zul8xe0n5RVajMgSo2OgPq62pPwyc/1gaYmyjKUPccQwP4jRloBbidZZMvV CXAeUFbDnm7oKRhxIplw1l5CsnAN2P0i6tqpXJFOCZby/jlmAFK4TM7WEAEnNlVznR91 9J+xk8iy+WrNzqWL0UrzAtqIaec7AgLLGjf3eNfxanI5ONEQDU8mEGysJAWeAMIwfhzE RhYFr5QoDIduDIIgZdMueMX5ne9+JyPr2Npq6+vEENQERfMErLg9oL8rIhz7a9e3sor3 2g8TW1cU+Oj3lr1/QmTFj5bS+CQL1sB2JJaQ9Sg/u6KD5X6+XYHs/VYGBBCbPt+c46tB ljYw== X-Gm-Message-State: AOAM533m/ce9FAYPROJAPAonL+wx7iLXHeSLFuAPdlWY8KJmIjlh7gwI wIw1KWGgsrhs40odQzY3gRbk/5hN+T0= X-Google-Smtp-Source: ABdhPJzvIBkvI/U+f/OC/NJPtt/b2gArzQv2DqU4ckHBzogoHsolPxBNnpDCsFPaddPB9mLIqVOWjw== X-Received: by 2002:aa7:c755:: with SMTP id c21mr16994506eds.47.1612787043701; Mon, 08 Feb 2021 04:24:03 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:03 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:25 +0100 Message-Id: <20210208122330.555354-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/8] avcodec/frame_thread_encoder: Avoid allocations of AVPackets, fix deadlock 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Up until now, when doing frame thread encoding, each worker thread tried to allocate an AVPacket for every AVFrame to be encoded; said packets would then be handed back to the main thread, where the content of said packet is copied into the packet actually destined for output; the temporary AVPacket is then freed. Besides being wasteful this also has another problem: There is a risk of deadlock, namely if no AVPacket can be allocated at all. The user doesn't get an error at all in this case and the worker threads will simply try to allocate a packet again and again. If the user has supplied enough frames, the user's thread will block until a task has been completed, which just doesn't happen if no packet can ever be allocated. This patch instead modifies the code to allocate the packets during init; they are then reused again and again. Signed-off-by: Andreas Rheinhardt --- libavcodec/frame_thread_encoder.c | 61 +++++++++++++++++++------------ 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 9ca34e7ffb..bcd3c94f8b 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -32,13 +32,18 @@ #include "thread.h" #define MAX_THREADS 64 -#define BUFFER_SIZE (2*MAX_THREADS) +/* There can be as many as MAX_THREADS + 1 outstanding tasks. + * An additional + 1 is needed so that one can distinguish + * the case of zero and MAX_THREADS + 1 outstanding tasks modulo + * the number of buffers. */ +#define BUFFER_SIZE (MAX_THREADS + 2) typedef struct{ AVFrame *indata; AVPacket *outdata; int64_t return_code; unsigned index; + int finished; } Task; typedef struct{ @@ -49,8 +54,9 @@ typedef struct{ pthread_mutex_t task_fifo_mutex; pthread_cond_t task_fifo_cond; - Task finished_tasks[BUFFER_SIZE]; - pthread_mutex_t finished_task_mutex; + unsigned max_tasks; + Task tasks[BUFFER_SIZE]; + pthread_mutex_t finished_task_mutex; /* Guards tasks[i].finished */ pthread_cond_t finished_task_cond; unsigned task_index; @@ -63,17 +69,13 @@ typedef struct{ static void * attribute_align_arg worker(void *v){ AVCodecContext *avctx = v; ThreadContext *c = avctx->internal->frame_thread_encoder; - AVPacket *pkt = NULL; while (!atomic_load(&c->exit)) { int got_packet = 0, ret; + AVPacket *pkt; AVFrame *frame; Task task; - if(!pkt) pkt = av_packet_alloc(); - if(!pkt) continue; - av_init_packet(pkt); - pthread_mutex_lock(&c->task_fifo_mutex); while (av_fifo_size(c->task_fifo) <= 0 || atomic_load(&c->exit)) { if (atomic_load(&c->exit)) { @@ -84,7 +86,12 @@ static void * attribute_align_arg worker(void *v){ } av_fifo_generic_read(c->task_fifo, &task, sizeof(task), NULL); pthread_mutex_unlock(&c->task_fifo_mutex); + /* The main thread ensures that any two outstanding tasks have + * different indices, ergo each worker thread owns its element + * of c->tasks with the exception of finished, which is shared + * with the main thread and guarded by finished_task_mutex. */ frame = task.indata; + pkt = c->tasks[task.index].outdata; ret = avctx->codec->encode2(avctx, pkt, frame, &got_packet); if(got_packet) { @@ -101,13 +108,12 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_unlock(&c->buffer_mutex); av_frame_free(&frame); pthread_mutex_lock(&c->finished_task_mutex); - c->finished_tasks[task.index].outdata = pkt; pkt = NULL; - c->finished_tasks[task.index].return_code = ret; + c->tasks[task.index].return_code = ret; + c->tasks[task.index].finished = 1; pthread_cond_signal(&c->finished_task_cond); pthread_mutex_unlock(&c->finished_task_mutex); } end: - av_free(pkt); pthread_mutex_lock(&c->buffer_mutex); avcodec_close(avctx); pthread_mutex_unlock(&c->buffer_mutex); @@ -194,6 +200,12 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){ pthread_cond_init(&c->finished_task_cond, NULL); atomic_init(&c->exit, 0); + c->max_tasks = avctx->thread_count + 2; + for (unsigned i = 0; i < c->max_tasks; i++) { + if (!(c->tasks[i].outdata = av_packet_alloc())) + goto fail; + } + for(i=0; ithread_count ; i++){ AVDictionary *tmp = NULL; int ret; @@ -261,8 +273,8 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ av_frame_free(&task.indata); } - for (i=0; ifinished_tasks[i].outdata); + for (unsigned i = 0; i < c->max_tasks; i++) { + av_packet_free(&c->tasks[i].outdata); } pthread_mutex_destroy(&c->task_fifo_mutex); @@ -276,7 +288,7 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr){ ThreadContext *c = avctx->internal->frame_thread_encoder; - Task task; + Task *outtask, task; int ret; av_assert1(!*got_packet_ptr); @@ -298,27 +310,28 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF pthread_cond_signal(&c->task_fifo_cond); pthread_mutex_unlock(&c->task_fifo_mutex); - c->task_index = (c->task_index+1) % BUFFER_SIZE; + c->task_index = (c->task_index + 1) % c->max_tasks; } + outtask = &c->tasks[c->finished_task_index]; pthread_mutex_lock(&c->finished_task_mutex); if (c->task_index == c->finished_task_index || - (frame && !c->finished_tasks[c->finished_task_index].outdata && - (c->task_index - c->finished_task_index) % BUFFER_SIZE <= avctx->thread_count)) { + (frame && !outtask->finished && + (c->task_index - c->finished_task_index + c->max_tasks) % c->max_tasks <= avctx->thread_count)) { pthread_mutex_unlock(&c->finished_task_mutex); return 0; } - - while (!c->finished_tasks[c->finished_task_index].outdata) { + while (!outtask->finished) { pthread_cond_wait(&c->finished_task_cond, &c->finished_task_mutex); } - task = c->finished_tasks[c->finished_task_index]; - *pkt = *(AVPacket*)(task.outdata); + /* We now own outtask completely: No worker thread touches it any more, + * because there is no outstanding task with this index. */ + outtask->finished = 0; + av_packet_move_ref(pkt, outtask->outdata); if(pkt->data) *got_packet_ptr = 1; - av_freep(&c->finished_tasks[c->finished_task_index].outdata); - c->finished_task_index = (c->finished_task_index+1) % BUFFER_SIZE; + c->finished_task_index = (c->finished_task_index + 1) % c->max_tasks; pthread_mutex_unlock(&c->finished_task_mutex); - return task.return_code; + return outtask->return_code; } From patchwork Mon Feb 8 12:23:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25506 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2507D44A631 for ; Mon, 8 Feb 2021 14:24:13 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F2BAB689A8D; Mon, 8 Feb 2021 14:24:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CF0A768832B for ; Mon, 8 Feb 2021 14:24:05 +0200 (EET) Received: by mail-ej1-f43.google.com with SMTP id w2so24224552ejk.13 for ; Mon, 08 Feb 2021 04:24:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=0BTUUzaA7XC36OjxrxcUm/LRpGt/f9x1ap+xaatKCtI=; b=vRMeSAIJHs3dkzO+NVwLWsP1+uWZZeHduZ9hl9mQERJa7IuU6A+lCBvwH6ZZ7bRlCn afVqE04sqUL53zvv94kQKjRpiYlVwO83aYMYbFR/XJqg/5pH/8K4/N+MIAtl+ZfCnHuy Yr0qHO35IwbJbpMh1SbZN2ATrhc8KAyjDNhN9L+K/Y6yZeDjBGfTA8qFyeyLCITCWpF3 r17a+IQNGR+oEAAfAni30OnuRMzQ0KTZkTJQ4qSlQA2NdvxZTn0+gGCg6UcBFWVO1La3 VjY7Wv2DcD2o9of+0KsPCq1FSKap4JvoyuiIzXww8qFhZlWyKYciBvul8HBsjyX4Hab2 cW9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=0BTUUzaA7XC36OjxrxcUm/LRpGt/f9x1ap+xaatKCtI=; b=fByYBd+6+Pm3sjEI0YQ//OTPZEY6vC56tnQjzqLTZ7i/NaLQbpE51eg5pPuUQNySFZ JQjsLN95i9INEdKv8aU7m7HcDmjAbYVin8niT/4wfDLEdCcJ1vaDJUwOxlzj57qyRBBj D7Xp9913MtAe65lpXIm23kz9scp6acB1r56ijK0sCJK4EvDZdMx8YHxLrvDC+v3Vlvp3 gW4bo6wCRRDS/soJp4Hjk099D+TSyU511T6uxeFTjqJog/3e6g4I1JSpBWRLf2N+1inE ODMS26ip93uhQqLEwBf4lG2/RaiiXnrqzAHxGmX3hGR1JoeH8iacGxolgfQnQI2bLErT aJag== X-Gm-Message-State: AOAM530urTCfAsUQaqYB1YfSz987FU9KrkFyV6Lsp8tzCgYIP+3d1Ag7 JRlIGL20Fdr3WOVddsiIlPoe5Ykc3Q0= X-Google-Smtp-Source: ABdhPJxt/Yyn9QFdfGFMlTYUsOH4uXFq5yolfaYbtAmq+kvB/ItDesQyOL1t0HIQCc7c/t2t4RAU7A== X-Received: by 2002:a17:906:4c4b:: with SMTP id d11mr16904964ejw.387.1612787045086; Mon, 08 Feb 2021 04:24:05 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:04 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:26 +0100 Message-Id: <20210208122330.555354-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/8] avcodec/frame_thread_encoder: Avoid creating reference to frame 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavcodec/encode.c | 4 ++++ libavcodec/frame_thread_encoder.c | 11 ++++------- libavcodec/frame_thread_encoder.h | 3 ++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 29f41c3f92..282337e453 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -152,6 +152,10 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt) if (CONFIG_FRAME_THREAD_ENCODER && avci->frame_thread_encoder && (avctx->active_thread_type & FF_THREAD_FRAME)) + /* This might modify frame, but it doesn't matter, because + * the frame properties used below are not used for video + * (due to the delay inherent in frame threaded encoding, it makes + * no sense to use the properties of the current frame anyway). */ ret = ff_thread_video_encode_frame(avctx, avpkt, frame, &got_packet); else { ret = avctx->codec->encode2(avctx, avpkt, frame, &got_packet); diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index bcd3c94f8b..7c2894c933 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -286,10 +286,11 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ av_freep(&avctx->internal->frame_thread_encoder); } -int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr){ +int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, + AVFrame *frame, int *got_packet_ptr) +{ ThreadContext *c = avctx->internal->frame_thread_encoder; Task *outtask, task; - int ret; av_assert1(!*got_packet_ptr); @@ -297,11 +298,7 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF AVFrame *new = av_frame_alloc(); if(!new) return AVERROR(ENOMEM); - ret = av_frame_ref(new, frame); - if(ret < 0) { - av_frame_free(&new); - return ret; - } + av_frame_move_ref(new, frame); task.index = c->task_index; task.indata = (void*)new; diff --git a/libavcodec/frame_thread_encoder.h b/libavcodec/frame_thread_encoder.h index 1f79553f20..c400d6b32c 100644 --- a/libavcodec/frame_thread_encoder.h +++ b/libavcodec/frame_thread_encoder.h @@ -25,6 +25,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options); void ff_frame_thread_encoder_free(AVCodecContext *avctx); -int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr); +int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, + AVFrame *frame, int *got_packet_ptr); #endif /* AVCODEC_FRAME_THREAD_ENCODER_H */ From patchwork Mon Feb 8 12:23:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25507 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1590044A631 for ; Mon, 8 Feb 2021 14:24:14 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F0817689CA7; Mon, 8 Feb 2021 14:24:13 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C792C6883B3 for ; Mon, 8 Feb 2021 14:24:06 +0200 (EET) Received: by mail-ej1-f54.google.com with SMTP id bl23so24293128ejb.5 for ; Mon, 08 Feb 2021 04:24:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=ToCa5CibQWj1v1SBODyVeYMRH77vlyf+fy0h9wiDAWA=; b=VQYodgmMjzd4BRGVum+q3A4M5vibPfaSaaHUlAUu0i7qrLWNW1MHmbnkd/lgn+kCjw PrVb1u1Fa85aW9FER95OezNU9L3Lqk6644jD0DlrUwhjxWvh9S6NXET4rB7PXP/wai6B 6nAYSm7TEy8kX+2m978gBgZ6J+h/wnD8IA+XePQLi5qC4zJDWByiZ6zMD/KmCbgMmwQs 5xwMqfWC3+4xoOv4IS6BhYe8MWeyp4od/dzJREaCbfmIPjROBSM/tV+Cf33cgORwHMm1 pZapqPCuCv3g5mkZHgpgBRxA3E0kPs4TXvCZFecUcf8GfP3skFjz90V9MQuTBf+wYYXT H6Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=ToCa5CibQWj1v1SBODyVeYMRH77vlyf+fy0h9wiDAWA=; b=nD/QHv9gDbY1IVSTj4PHc3qj8WMccrAYa57+QyWnerEn9Tdn+t90LHScDtuX+2/Bex MS4WAS7iXia+uor2O0pvYqvQxb3unJJyPokeA3m5cH32mz29tG42NA9iIanWvI0Y3cx9 67WlvAziaPMvunZTpEscr8DjV+EeFa9gUZdibv/doZlyjkA2eb08xoAdM18YQzIC96C6 MzrXIRjfC9SC0ZSrIAM2Sc9TWwk02uXIbRo/slx21ImScdrOb6ijfkL7cpa4x5o8Haze STIpTG6Ehg6C+3DKpsQuKoHWeUR7Y4/DK9PCThy1gOquOpSH98LKfWqyqGbF8Cf3kL+U UYog== X-Gm-Message-State: AOAM533xE+4zf/LQvfmo5rJU/89WVDet+PK87xtYK9hlIRqaOZubLfZv 2oGdlLk9VDAqsevti02TMz1gp7ZNXtM= X-Google-Smtp-Source: ABdhPJw7fipo0iSEjoFIQ4ZsM3KMB7P80YV7gDfJQ4IMZ9c4qJQtXmw2DsGB/EZGT3kwbo6UT2ccWw== X-Received: by 2002:a17:906:a2da:: with SMTP id by26mr17229443ejb.191.1612787045993; Mon, 08 Feb 2021 04:24:05 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:05 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:27 +0100 Message-Id: <20210208122330.555354-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/8] avcodec/frame_thread_encoder: Avoid allocations of AVFrames 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Up until now, when using frame threaded encoding, an AVFrame would be allocated for every frame to be encoded. These AVFrames would reach the worker threads via a FIFO of tasks, a structure which contained the AVFrame as well as an index into an array which gives the place where the worker thread shall put the returned packet; in addition to that, said structure also contained several unused fields. This commit changes this: The AVFrames are now allocated during init in the array that is up until now only used to return the packets. The contents to be encoded are put into the AVFrame in the same array element that is also used to return the packets. Signed-off-by: Andreas Rheinhardt --- libavcodec/frame_thread_encoder.c | 40 +++++++++++++------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 7c2894c933..5fe886aed9 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -42,7 +42,6 @@ typedef struct{ AVFrame *indata; AVPacket *outdata; int64_t return_code; - unsigned index; int finished; } Task; @@ -74,7 +73,8 @@ static void * attribute_align_arg worker(void *v){ int got_packet = 0, ret; AVPacket *pkt; AVFrame *frame; - Task task; + Task *task; + unsigned task_index; pthread_mutex_lock(&c->task_fifo_mutex); while (av_fifo_size(c->task_fifo) <= 0 || atomic_load(&c->exit)) { @@ -84,14 +84,15 @@ static void * attribute_align_arg worker(void *v){ } pthread_cond_wait(&c->task_fifo_cond, &c->task_fifo_mutex); } - av_fifo_generic_read(c->task_fifo, &task, sizeof(task), NULL); + av_fifo_generic_read(c->task_fifo, &task_index, sizeof(task_index), NULL); pthread_mutex_unlock(&c->task_fifo_mutex); /* The main thread ensures that any two outstanding tasks have * different indices, ergo each worker thread owns its element * of c->tasks with the exception of finished, which is shared * with the main thread and guarded by finished_task_mutex. */ - frame = task.indata; - pkt = c->tasks[task.index].outdata; + task = &c->tasks[task_index]; + frame = task->indata; + pkt = task->outdata; ret = avctx->codec->encode2(avctx, pkt, frame, &got_packet); if(got_packet) { @@ -106,10 +107,9 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_lock(&c->buffer_mutex); av_frame_unref(frame); pthread_mutex_unlock(&c->buffer_mutex); - av_frame_free(&frame); pthread_mutex_lock(&c->finished_task_mutex); - c->tasks[task.index].return_code = ret; - c->tasks[task.index].finished = 1; + task->return_code = ret; + task->finished = 1; pthread_cond_signal(&c->finished_task_cond); pthread_mutex_unlock(&c->finished_task_mutex); } @@ -187,7 +187,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){ c->parent_avctx = avctx; - c->task_fifo = av_fifo_alloc_array(BUFFER_SIZE, sizeof(Task)); + c->task_fifo = av_fifo_alloc_array(BUFFER_SIZE, sizeof(unsigned)); if (!c->task_fifo) { av_freep(&avctx->internal->frame_thread_encoder); return AVERROR(ENOMEM); @@ -202,7 +202,8 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){ c->max_tasks = avctx->thread_count + 2; for (unsigned i = 0; i < c->max_tasks; i++) { - if (!(c->tasks[i].outdata = av_packet_alloc())) + if (!(c->tasks[i].indata = av_frame_alloc()) || + !(c->tasks[i].outdata = av_packet_alloc())) goto fail; } @@ -267,13 +268,8 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ pthread_join(c->worker[i], NULL); } - while (av_fifo_size(c->task_fifo) > 0) { - Task task; - av_fifo_generic_read(c->task_fifo, &task, sizeof(task), NULL); - av_frame_free(&task.indata); - } - for (unsigned i = 0; i < c->max_tasks; i++) { + av_frame_free(&c->tasks[i].indata); av_packet_free(&c->tasks[i].outdata); } @@ -290,20 +286,16 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, AVFrame *frame, int *got_packet_ptr) { ThreadContext *c = avctx->internal->frame_thread_encoder; - Task *outtask, task; + Task *outtask; av_assert1(!*got_packet_ptr); if(frame){ - AVFrame *new = av_frame_alloc(); - if(!new) - return AVERROR(ENOMEM); - av_frame_move_ref(new, frame); + av_frame_move_ref(c->tasks[c->task_index].indata, frame); - task.index = c->task_index; - task.indata = (void*)new; pthread_mutex_lock(&c->task_fifo_mutex); - av_fifo_generic_write(c->task_fifo, &task, sizeof(task), NULL); + av_fifo_generic_write(c->task_fifo, &c->task_index, + sizeof(c->task_index), NULL); pthread_cond_signal(&c->task_fifo_cond); pthread_mutex_unlock(&c->task_fifo_mutex); From patchwork Mon Feb 8 12:23:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25508 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1E52F44A631 for ; Mon, 8 Feb 2021 14:24:16 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 05C62689DCF; Mon, 8 Feb 2021 14:24:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B0032689B91 for ; Mon, 8 Feb 2021 14:24:07 +0200 (EET) Received: by mail-ej1-f49.google.com with SMTP id f14so24280975ejc.8 for ; Mon, 08 Feb 2021 04:24:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=v7ssXNBtcuGYkg5JyYIz79NeCxjN/W+ckJFz6eyFloo=; b=s/qCiFs8SOREksGqYx8mtP7XI8relQNJ24lB7wqjHfLdsQJWudGJcvjoiELMXKD8xs K04fMefrFdtml9gx4FuA4z8sZboskkb2lGYewsXOKhQcsHevgZBh/ilZ9SOYvqkJhkdt gUy+Z1EyqklgjFxh9msuPlVeIliwuyAzbR75LtPX3r1h1RllaGL99L+2bEYbT3EARm1z W144wSHR7KVyh6cnmvn5PB3lZiRohR2CpVBeVYSk3iuyuBXjDb2FBq8gKPni6aCQC059 N5pvRw1W91jeHb5tnQGbCrUZco0xDRV6ll1mRuISwJHaORYApHXCk3u17IjWJNXFsYmA W00Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=v7ssXNBtcuGYkg5JyYIz79NeCxjN/W+ckJFz6eyFloo=; b=khgez/CDYxl6wk7KxjUrf/2YH5xgUfRgXaDr+sCrjSd0MkpX0e/5B46zW8PcPweUl5 Im3XiYCdy1m1r8ycuifrZ3a5oWMdeWbdgni8zv8mfyi5hONKnrP/J3jK8PdpBL515x9o CBPXqICyrTVtu1UPdF2TzvTS/LsIqiYuyBNcNKc4Uw+FEJiFBJzjMbd/2UPdGv6T8s5c lLWwny74dXMWSTU/6PJpPhRPxtSY7HNVPdKed4sqFEUb8trLKciCyj9mA2BCA0wbGvF3 PBXM0bak8q7yz850KdsnvXA3hIc1SyaWRVGACGOTAObk1fF1777BJkv/fNgZldxBzs7V LFmQ== X-Gm-Message-State: AOAM530qHvOlwuqPKDvk7r0XEpNiMe4FT8hCmDa/i/FVoIhhWd3/dxqi 5iD/5yMuyzEoN+jvZ0d9AYltsdcXc1c= X-Google-Smtp-Source: ABdhPJz0oJoAvskyXGi+I0I3MLivl0BEzylO8ce2RoWkJFBYKChSjP8lDSgPlmZFjSCYLoyHoRiszw== X-Received: by 2002:a17:906:755:: with SMTP id z21mr17162406ejb.514.1612787046889; Mon, 08 Feb 2021 04:24:06 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:06 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:28 +0100 Message-Id: <20210208122330.555354-6-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/8] avcodec/frame_thread_encoder: Avoid FIFO 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It can be replaced by a simple counter. Signed-off-by: Andreas Rheinhardt --- Should I rename task_fifo_mutex/cond? libavcodec/frame_thread_encoder.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 5fe886aed9..c6323b6246 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -22,7 +22,6 @@ #include "frame_thread_encoder.h" -#include "libavutil/fifo.h" #include "libavutil/avassert.h" #include "libavutil/imgutils.h" #include "libavutil/opt.h" @@ -49,8 +48,7 @@ typedef struct{ AVCodecContext *parent_avctx; pthread_mutex_t buffer_mutex; - AVFifoBuffer *task_fifo; - pthread_mutex_t task_fifo_mutex; + pthread_mutex_t task_fifo_mutex; /* Used to guard (next_)task_index */ pthread_cond_t task_fifo_cond; unsigned max_tasks; @@ -58,6 +56,7 @@ typedef struct{ pthread_mutex_t finished_task_mutex; /* Guards tasks[i].finished */ pthread_cond_t finished_task_cond; + unsigned next_task_index; unsigned task_index; unsigned finished_task_index; @@ -77,14 +76,15 @@ static void * attribute_align_arg worker(void *v){ unsigned task_index; pthread_mutex_lock(&c->task_fifo_mutex); - while (av_fifo_size(c->task_fifo) <= 0 || atomic_load(&c->exit)) { + while (c->next_task_index == c->task_index || atomic_load(&c->exit)) { if (atomic_load(&c->exit)) { pthread_mutex_unlock(&c->task_fifo_mutex); goto end; } pthread_cond_wait(&c->task_fifo_cond, &c->task_fifo_mutex); } - av_fifo_generic_read(c->task_fifo, &task_index, sizeof(task_index), NULL); + task_index = c->next_task_index; + c->next_task_index = (c->next_task_index + 1) % c->max_tasks; pthread_mutex_unlock(&c->task_fifo_mutex); /* The main thread ensures that any two outstanding tasks have * different indices, ergo each worker thread owns its element @@ -187,12 +187,6 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){ c->parent_avctx = avctx; - c->task_fifo = av_fifo_alloc_array(BUFFER_SIZE, sizeof(unsigned)); - if (!c->task_fifo) { - av_freep(&avctx->internal->frame_thread_encoder); - return AVERROR(ENOMEM); - } - pthread_mutex_init(&c->task_fifo_mutex, NULL); pthread_mutex_init(&c->finished_task_mutex, NULL); pthread_mutex_init(&c->buffer_mutex, NULL); @@ -278,7 +272,6 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ pthread_mutex_destroy(&c->buffer_mutex); pthread_cond_destroy(&c->task_fifo_cond); pthread_cond_destroy(&c->finished_task_cond); - av_fifo_freep(&c->task_fifo); av_freep(&avctx->internal->frame_thread_encoder); } @@ -294,16 +287,15 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, av_frame_move_ref(c->tasks[c->task_index].indata, frame); pthread_mutex_lock(&c->task_fifo_mutex); - av_fifo_generic_write(c->task_fifo, &c->task_index, - sizeof(c->task_index), NULL); + c->task_index = (c->task_index + 1) % c->max_tasks; pthread_cond_signal(&c->task_fifo_cond); pthread_mutex_unlock(&c->task_fifo_mutex); - - c->task_index = (c->task_index + 1) % c->max_tasks; } outtask = &c->tasks[c->finished_task_index]; pthread_mutex_lock(&c->finished_task_mutex); + /* The access to task_index in the following code is ok, + * because it is only ever changed by the main thread. */ if (c->task_index == c->finished_task_index || (frame && !outtask->finished && (c->task_index - c->finished_task_index + c->max_tasks) % c->max_tasks <= avctx->thread_count)) { From patchwork Mon Feb 8 12:23:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25509 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 53A5444A631 for ; Mon, 8 Feb 2021 14:24:17 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3CD5B689E13; Mon, 8 Feb 2021 14:24:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8384068832B for ; Mon, 8 Feb 2021 14:24:08 +0200 (EET) Received: by mail-ej1-f45.google.com with SMTP id y9so24250832ejp.10 for ; Mon, 08 Feb 2021 04:24:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=eM4RQMP6H0dgwbkUWvZLye/tZdvsWCU6hIqSOKVbeew=; b=PT6fNpwHz12MMlyCt7hbwPUH9p4ReiyQKLclgsXjfIlC8MTvH+ipV2gm/BdMS12kyO qJioVwq/WJVXexfI0kzKR7BfnD4wBs5dgYe6rZRZwvhCV2U4cFdoHhSQAqfQNmdaHcbe VT9TTxq8uMHHSPu8cPwD2UMTRVPvUGKSF6dfHR7LHocgmnz+YnrEDc+Ko2XSyQmIk/pO KcsGw1mRnxEjCts5MAME6UnrBb5RXebIrszO7qoCkdSrxWB6cdPPRKOJ+Dv4BSY6XLsV zjQQr73RIsreHspdEdGdHQlRIjNDT+jvoA3zuLiFxAlhRZbpaWfaBZzGrYjaLJ2vzQK8 aTfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=eM4RQMP6H0dgwbkUWvZLye/tZdvsWCU6hIqSOKVbeew=; b=OQ5Dtfq0LeLyXXs6b+40jb7gVLyarm7ds1Aal4o+9kexkdvgRerlDXfI/Qxip8MA4v aGdzLPPhhLFPSkpTxP/OxzmMCoZnmiZlXOqqzNW0WAbfK+la43aFl+FZKssBOgTJuZ5a ggjAXN+t6ErODm3d3WdfJB4eRHdFuiymHcjtEjjIDOyYlQ0KJ6QC02pldzbT95w1ukYI 6cQOe+PQkFXtMiagGRt76d65QiUFoWLFGSsmWZPfzvDMyJVnoJBLIN6Y2R/6+SuudCUY gqUtyXu2jU6oYp+ZBI1bJdyLNHd4nIvMJ9fS/lMdqzsQMN2isVUOvCvOQrlLLq+o0DIJ RwPA== X-Gm-Message-State: AOAM530/RAeiaBMtD0QT6EhEJKX2Wz7u0Yeo/luuDg5oJOA9NzsaN3zr zM5EdsfzF5TLreCeGcHB4uGRr8EdQ18= X-Google-Smtp-Source: ABdhPJxpTTQlQfgETiCL3Q4V7EIV5X8Wsa6CRoTOU++9Vm00da6tJ3dv0fru6OBmUTT2kbxrX5S64A== X-Received: by 2002:a17:906:3916:: with SMTP id f22mr11111611eje.328.1612787047855; Mon, 08 Feb 2021 04:24:07 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:07 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:29 +0100 Message-Id: <20210208122330.555354-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/8] avcodec/frame_thread_encoder: Reduce amount of code guarded by mutex 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- This is not done for speed, but for consistency (because the return statement already accessed outtask after unlocking the mutex). libavcodec/frame_thread_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index c6323b6246..f1f4fcb490 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -305,6 +305,7 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, while (!outtask->finished) { pthread_cond_wait(&c->finished_task_cond, &c->finished_task_mutex); } + pthread_mutex_unlock(&c->finished_task_mutex); /* We now own outtask completely: No worker thread touches it any more, * because there is no outstanding task with this index. */ outtask->finished = 0; @@ -312,7 +313,6 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, if(pkt->data) *got_packet_ptr = 1; c->finished_task_index = (c->finished_task_index + 1) % c->max_tasks; - pthread_mutex_unlock(&c->finished_task_mutex); return outtask->return_code; } From patchwork Mon Feb 8 12:23:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25510 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 50B6944A631 for ; Mon, 8 Feb 2021 14:24:18 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3805F689D84; Mon, 8 Feb 2021 14:24:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5E4BD689D16 for ; Mon, 8 Feb 2021 14:24:09 +0200 (EET) Received: by mail-ej1-f47.google.com with SMTP id f14so24281114ejc.8 for ; Mon, 08 Feb 2021 04:24:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=1Fe9OwwNwrm4UrjH6OS76VYejQ6RQnDGthUxzRIgooE=; b=MJ4lH8mFD4+HkW7+t/wnOdIEjPNxt2Ge6usorNiw0/zDyRJUtNBnemRVC6ME4MwUnw xaElEzGP22o3tdXnYRUeRR9XyH7A5L1BudplzGDYCENewpgnHJ5cp+IS/rziCKKEtHB9 HcrhoxFPzgodqNcCGWcItm60FClJmHhMEq/0E4Ah7mYc1NrJr8KCxQfqvA+0KqOYjH7n 3CpTbTtLle6s7Nkt6t+tOugCAdCT1vSvVE/rp29RvMUOpvYK/zUvkNg8mPGMcpw4ci1F Wk5jUfY2SP7Hpq9LTny05jhQQR+7aVGtXsiOkkJE2v58BWye0yHN30Q05Ul/Zmixy76K 2tAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=1Fe9OwwNwrm4UrjH6OS76VYejQ6RQnDGthUxzRIgooE=; b=NllJ/dT3JdtMOBMM1ojgWqsj9qghi6nDiScUZ+quFHHGcAzpFnrMNZvQTq3c3cVheG ypj9HlgvT6aHNJDErSSGU310YkqWjfGz5DYHrWX/8tJfAX0IjK+Rh+9wEcjB9ZY6oAoY W8CVN2U9Nk8xpllTd+SgipC8sw7pMfERmZCVeyQZIRU4xua/7U015fBKuY2Br0/XmTZx QiSvLnL7++Lq0TJCDHuTW1D0YbpPZVImV4y2Ae/y5j8DRYt6+YOKtLnABRCa4mQV9E5d A0Jo8aguGGX7yENLAZ53PUbtO0jm9+viTtf8PfMF9m/6meZ7RtTwF1JvzxlCGfvqmBER hQtw== X-Gm-Message-State: AOAM5318DKTpFLqP9wRVDAQZVImJbWuOqeUf5fkZzoMZajesihorWv5n 7YDqKu+oXb6IFCyHafkcZWsOoVqQ/tY= X-Google-Smtp-Source: ABdhPJzVEdiF+686s+jv5NlXKGkLdb+lOAJ8JCg85F2BrJull8L2DJBQFcSIONfiM8bFsI16jU6B6Q== X-Received: by 2002:a17:906:71d5:: with SMTP id i21mr6070127ejk.232.1612787048686; Mon, 08 Feb 2021 04:24:08 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id ah20sm8486820ejc.99.2021.02.08.04.24.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Feb 2021 04:24:08 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 13:23:30 +0100 Message-Id: <20210208122330.555354-8-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> References: <20210208122330.555354-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 8/8] avcodec/frame_thread_encoder: Use more natural types 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavcodec/frame_thread_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index f1f4fcb490..778317d60b 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -40,7 +40,7 @@ typedef struct{ AVFrame *indata; AVPacket *outdata; - int64_t return_code; + int return_code; int finished; } Task;