From patchwork Sat Mar 23 14:00:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 47372 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp230600pzb; Sat, 23 Mar 2024 07:01:51 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV6H6tKZOoizvM+pApR+jkt37wIjh+9wRPg6hiFKdSy9/T1m8znGkc/j0uHfTlgsatupYUcfhL3JsEF75p1ve+nSm4zoGppXgPBdw== X-Google-Smtp-Source: AGHT+IFwlu0cIXLOTXyBcGgwGYnj/3sTQAgFOO4SgEyaSorpwSuktIuNaKl4U3Q0l3rlkq+0I+x0 X-Received: by 2002:a17:907:86a7:b0:a47:4b96:750f with SMTP id qa39-20020a17090786a700b00a474b96750fmr331684ejc.0.1711202511596; Sat, 23 Mar 2024 07:01:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711202511; cv=none; d=google.com; s=arc-20160816; b=v8g0NJveedaUfzTw2ZHIiys2L+XqfCzX5FiYH7780ayZRcOiUCWAMzHtra0exW7v+n kL8edMcZVnUZ4fCljO4cvWPjRhuBQvm7HzWi3lsYUEyF5woTGoUT9QSDtC1Ju+6/7t9w GUq4g0kjz9wRQ3+/f/2A/i1BIz3mp8sTXUDeuMxPyB/Iuwscq4aHK6gA8T/HzNNw7UwT CewVkX1fmxDVqkZ5T4+NiV3kMlnjfayZh3UOuZcpIQHQUXneGx0EcTvInCNZaeyUKl3M QppjVyyMepo01WBOHnx/4nej35/LqADUcBbPo2UKHhv9JJvTVkNsZulrOC4/UBRD57t/ +Fig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=soS25HZqc5HhdzjyosPvFc7k+Snp33xekZ0kud5TDG4=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=d+7P7iEzJjOV1+5e1sKh2u4xMXS3D2y7hjmcnKCGZS/e2sdXYYiPRry7a5eAtGf9CL Z9PdpyCqSFGc820h+zkNdMMVQQ6NbAz7c3puCXC/ZetJSjBI0CtJfXCGCuUOgXoABYbx LQbiB5crmb4+jEr/oFLjZImdhckBFKM77w648STos6huBh+a6pmSg4W6BiN+OAOrviog W7tscMVKWp7nIDTUCFbu7/L0o41i/jZpRfpWJqSJ0O1ute1m9v9QKD6a3DyVzHdfrssD HOMyjwsRbvDw2ryem4yDK3QRlv0Jjr1gMbLCncZ/TrfYKkdrMzVbw+ddUGyYTFCHQM8H XT4A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=eFAlEC3r; 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 gh19-20020a170906e09300b00a46cc196cdesi781776ejb.247.2024.03.23.07.01.51; Sat, 23 Mar 2024 07:01:51 -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=@khirnov.net header.s=mail header.b=eFAlEC3r; 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 3B33E68D58A; Sat, 23 Mar 2024 16:01:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C0BD168D572 for ; Sat, 23 Mar 2024 16:01:37 +0200 (EET) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=eFAlEC3r; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 1E4BD4D44 for ; Sat, 23 Mar 2024 15:01:37 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id gkc_i9cj4QUU for ; Sat, 23 Mar 2024 15:01:34 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1711202494; bh=Wu8IdA62pOqIi35sVwDyISj3CviBYNkCbVx3HHw+ANE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=eFAlEC3rML64LCP1tuNolNRbgT6LkfZi/1fSJXZCgJ5OijyAmuYGQukakfTJl7Y8W DI6SMgfXcU++UG0Pvy21vEG1GsjcTuhGao5DMlbrPTIJj8cmXg9RvuB0hK7OWgSaPS Hzz0AR6TIeMvuOSs9XlFE+1DRbV5aHNWdEZp1RbbFLsUcQf42semGE5oYJMLdzZv2t H2FTLptotSMWEOIpe2/I+ISQTzdrcYzjG33bMyjrAZ5llVm9oPVN6iRhjthcZgXYpU mdPpQJAtqV9kSeNrFFj47TbTEvw/N8mNvQZPywy3Fv2WqqnewzYBPh2+raCW/69pDP /GSXNbeMjgcNg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id C9FE94D42 for ; Sat, 23 Mar 2024 15:01:34 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id A326D3A0357 for ; Sat, 23 Mar 2024 15:01:34 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 15:00:43 +0100 Message-ID: <20240323140054.4222-1-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 08/12] lavc/frame_thread_encoder: avoid assigning a whole AVCodecContext 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ZZJQUKMaku6V It is highly unsafe, as AVCodecContext contains many allocated fields. Everything needed by worked threads should be covered by * routing through AVCodecParameters * av_opt_copy() * copying quantisation matrices manually avcodec_free_context() can now be used for per-thread contexts. --- libavcodec/frame_thread_encoder.c | 44 ++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index cda5158117..5ea6386dfb 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -28,6 +28,7 @@ #include "libavutil/thread.h" #include "avcodec.h" #include "avcodec_internal.h" +#include "codec_par.h" #include "encode.h" #include "internal.h" #include "pthread_internal.h" @@ -111,8 +112,7 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_unlock(&c->finished_task_mutex); } end: - ff_codec_close(avctx); - av_freep(&avctx); + avcodec_free_context(&avctx); return NULL; } @@ -121,6 +121,7 @@ av_cold int ff_frame_thread_encoder_init(AVCodecContext *avctx) int i=0; ThreadContext *c; AVCodecContext *thread_avctx = NULL; + AVCodecParameters *par = NULL; int ret; if( !(avctx->thread_type & FF_THREAD_FRAME) @@ -194,18 +195,27 @@ av_cold int ff_frame_thread_encoder_init(AVCodecContext *avctx) } } + par = avcodec_parameters_alloc(); + if (!par) { + ret = AVERROR(ENOMEM); + goto fail; + } + + ret = avcodec_parameters_from_context(par, avctx); + if (ret < 0) + goto fail; + for(i=0; ithread_count ; i++){ - void *tmpv; thread_avctx = avcodec_alloc_context3(avctx->codec); if (!thread_avctx) { ret = AVERROR(ENOMEM); goto fail; } - tmpv = thread_avctx->priv_data; - *thread_avctx = *avctx; - thread_avctx->priv_data = tmpv; - thread_avctx->internal = NULL; - thread_avctx->hw_frames_ctx = NULL; + + ret = avcodec_parameters_to_context(thread_avctx, par); + if (ret < 0) + goto fail; + ret = av_opt_copy(thread_avctx, avctx); if (ret < 0) goto fail; @@ -217,6 +227,18 @@ av_cold int ff_frame_thread_encoder_init(AVCodecContext *avctx) thread_avctx->thread_count = 1; thread_avctx->active_thread_type &= ~FF_THREAD_FRAME; +#define DUP_MATRIX(m) \ + if (avctx->m) { \ + thread_avctx->m = av_memdup(avctx->m, 64 * sizeof(avctx->m)); \ + if (!thread_avctx->m) { \ + ret = AVERROR(ENOMEM); \ + goto fail; \ + } \ + } + DUP_MATRIX(intra_matrix); + DUP_MATRIX(chroma_intra_matrix); + DUP_MATRIX(inter_matrix); + if ((ret = avcodec_open2(thread_avctx, avctx->codec, NULL)) < 0) goto fail; av_assert0(!thread_avctx->internal->frame_thread_encoder); @@ -227,12 +249,14 @@ av_cold int ff_frame_thread_encoder_init(AVCodecContext *avctx) } } + avcodec_parameters_free(&par); + avctx->active_thread_type = FF_THREAD_FRAME; return 0; fail: - ff_codec_close(thread_avctx); - av_freep(&thread_avctx); + avcodec_parameters_free(&par); + avcodec_free_context(&thread_avctx); avctx->thread_count = i; av_log(avctx, AV_LOG_ERROR, "ff_frame_thread_encoder_init failed\n"); ff_frame_thread_encoder_free(avctx);