From patchwork Mon Mar 20 23:33:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 40736 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2165853pzb; Mon, 20 Mar 2023 16:34:45 -0700 (PDT) X-Google-Smtp-Source: AK7set888M3Ydb6YYS27pMFyS0gGuDicDafukB39dnRJ87qI4JfcEPV59p5Dtthlc0aJooa59EbB X-Received: by 2002:aa7:d346:0:b0:4fd:2a29:ceac with SMTP id m6-20020aa7d346000000b004fd2a29ceacmr1550718edr.14.1679355284954; Mon, 20 Mar 2023 16:34:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679355284; cv=none; d=google.com; s=arc-20160816; b=I3TPtJzk4WcZu2tTyP6ytpqAYzbzJI/LxuMctoaGGSb4E59BFRYILrrBJ7p0qwnUOQ Oll73YIeo0gqBUOV4IUltvQec5GNhmlYht2NK71mREKoYPhRYUGuR5wh/Sw162TwJkzo Rqikl4HsAgrUQLvIEGImGZ0TYi57HPnS5jYjndIeSApua1j5Taqu39zTlATIPDGcyRxO 0Y8YoV4JLEC0wU7a5QGnVrB4GOS6kI12hQ813BOojB7Rd4KMVIMBibn3GnZ+fGDMAair qV6RkEq9V3SGjaHBVFXeIA1G+6bI5fKhkCFDZKcKh3hbZKejAXu4Sfbm1urf74LB3Aeu WuCw== 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=fb0j8jVCYB7/MpUHtROVCDl/fqOLLeJwyTA/tyegM0g=; b=0HpgLH/S2tK5WPIQxPQYNpuxhT1PMoV2G6iaIh89p2PRoXNJXI+L8MC7JLmXlIyoam Wux6FKgURQ86RdDsuFAZYTaueuKwsNBARitH3CaH9KnDBxTF0TQUrPDEVUNCwDIvIX8a 2oxSLSe8K3QqoQQFyQpZ9+Va0tSmB20odoH1XzHTJStK1Us9uWcPohM8gjEl7dh9BPbG P22TfT8m5l4UjdpZJO/RfYaGfJkxf2uJW7M1L1kwrHRzUw95eIogiGHGaWT1LeX77LcX bPbPZjSqxLzt/4u+Ham1H8J0mhI+lZKswgzWc327JW7s2AQHIBopIXnocLCxQ64dZ73p 6npg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=MhaQS2pU; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l6-20020aa7c3c6000000b00501cf6775dasi2632117edr.46.2023.03.20.16.34.44; Mon, 20 Mar 2023 16:34:44 -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=@gmail.com header.s=20210112 header.b=MhaQS2pU; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E789E68C5C2; Tue, 21 Mar 2023 01:34:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A2D8568C430 for ; Tue, 21 Mar 2023 01:34:16 +0200 (EET) Received: by mail-lf1-f47.google.com with SMTP id i13so1317563lfe.9 for ; Mon, 20 Mar 2023 16:34:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679355256; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=ERgwxiTcg5ihymMUP7IKpflpzkqEYrm8hdhvVy1HCcA=; b=MhaQS2pUcntCcA/X4rKmKpiJRO3DiwfOELJIPGqlIO3Edtj3BGNZt6dF3WqZZEuywo IGxeBb0EaHfhUatRNiUHVV6H5HRpGTRjV7BgN3xNc22Oj8azvm59CQ0wzDP2iMq65snI Hw5ntHgLvoxNZBo3BilS6ehaQRf3puQcOGD1fzegdn51JR01NsK83qIXRs6wj/e4LFez xaIjX401ARJL5BivR3Oy4xVH2dFbvcPwbVB5BqY6Gki6jSTu6hwWegdu5YNeYsIVzrWr ACW/sHvZpXZfuaXiYWPSoNUl6fCJ+oQL7nN4fwngzwITWSoUbRwNNcDWK9I1KXXkhQ2l r+YA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679355256; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ERgwxiTcg5ihymMUP7IKpflpzkqEYrm8hdhvVy1HCcA=; b=NZFFLvRkMzR7lzWE0hFTmyFaU/J34ttCnCG8FtSulCp+PDxgzHlatP37JVWrvxWEz5 N7iWtjX0CViDUEf9plSmNB26FWMI/9LHeIFc5A2MgeGcJlzTOkGuzbXa1ktDhqlH/uLy 9ay3ZhQMl0D+JqWn+0w3NVfRgE+MKwfn7NKCCBU/UkbZuCxamwYfb2YnuLXSIcUvr0tM UJZ+8U0hfehc7JiPkxIvNSYgFj+R7sAWKSl42UScr7exsG+6l0D9oL9DD9NSdcvVhYtU y+PYfqINaEBh6VCVHsYhF7uy/1x79WCSnQUC5Ws6Oh0gwsiHvOOdxjpgDodD5PTxEgNo h+Sw== X-Gm-Message-State: AO0yUKXR7B3sFXO/qvx0+h8aF8UjibFWelys1/FLdRPuALPlvLmlT+aC sx9AX3xjsOTrWuanfsbbwbM8Lh/aMBE= X-Received: by 2002:ac2:489a:0:b0:4dc:537c:9230 with SMTP id x26-20020ac2489a000000b004dc537c9230mr247971lfc.8.1679355255768; Mon, 20 Mar 2023 16:34:15 -0700 (PDT) Received: from localhost.localdomain (91-153-198-187.elisa-laajakaista.fi. [91.153.198.187]) by smtp.gmail.com with ESMTPSA id j19-20020a19f513000000b004e84b79de9bsm1900701lfb.254.2023.03.20.16.34.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Mar 2023 16:34:15 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Mar 2023 01:33:56 +0200 Message-Id: <20230320233408.134255-3-jeebjp@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230320233408.134255-1-jeebjp@gmail.com> References: <20230320233408.134255-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v0 02/14] avcodec: move AVCodecInternal allocation to avcodec_alloc_context3 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: 1sKkUly6vRaG This allows for private values to be stored before the {de,en}coder has been opened and initialized. Add a new unsigned boolean entry to specifically note that a context has been opened instead of just depending on the internal pointer. --- libavcodec/avcodec.c | 18 +++++++++++------- libavcodec/frame_thread_encoder.c | 7 ++++--- libavcodec/internal.h | 5 +++++ libavcodec/options.c | 20 +++++++++++++++++++- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index fb1362290f..c110b19e08 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -115,7 +115,7 @@ static int64_t get_bit_rate(AVCodecContext *ctx) int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options) { int ret = 0; - AVCodecInternal *avci; + AVCodecInternal *avci = NULL; const FFCodec *codec2; if (avcodec_is_open(avctx)) @@ -147,12 +147,13 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE) return AVERROR(EINVAL); - avci = av_mallocz(sizeof(*avci)); + avci = avctx->internal; if (!avci) { - ret = AVERROR(ENOMEM); - goto end; + av_log(avctx, AV_LOG_ERROR, + "This AVCodecContext was not properly allocated! Please utilize " + "avcodec_alloc_context3!\n"); + return AVERROR(EINVAL); } - avctx->internal = avci; avci->buffer_frame = av_frame_alloc(); avci->buffer_pkt = av_packet_alloc(); @@ -360,6 +361,9 @@ FF_ENABLE_DEPRECATION_WARNINGS end: + if (ret >= 0 && avci) + avci->ctx_opened = 1; + return ret; free_and_end: avcodec_close(avctx); @@ -470,7 +474,7 @@ av_cold int avcodec_close(AVCodecContext *avctx) ff_icc_context_uninit(&avci->icc); #endif - av_freep(&avctx->internal); + avci->ctx_opened = 0; } for (i = 0; i < avctx->nb_coded_side_data; i++) @@ -703,7 +707,7 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) int avcodec_is_open(AVCodecContext *s) { - return !!s->internal; + return s->internal && s->internal->ctx_opened; } int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 62d9580ad4..683ba52608 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -110,8 +110,7 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_unlock(&c->finished_task_mutex); } end: - avcodec_close(avctx); - av_freep(&avctx); + avcodec_free_context(&avctx); return NULL; } @@ -195,15 +194,17 @@ av_cold int ff_frame_thread_encoder_init(AVCodecContext *avctx) for(i=0; ithread_count ; i++){ void *tmpv; + AVCodecInternal *avci; thread_avctx = avcodec_alloc_context3(avctx->codec); if (!thread_avctx) { ret = AVERROR(ENOMEM); goto fail; } tmpv = thread_avctx->priv_data; + avci = thread_avctx->internal; *thread_avctx = *avctx; thread_avctx->priv_data = tmpv; - thread_avctx->internal = NULL; + thread_avctx->internal = avci; thread_avctx->hw_frames_ctx = NULL; ret = av_opt_copy(thread_avctx, avctx); if (ret < 0) diff --git a/libavcodec/internal.h b/libavcodec/internal.h index a283c52e01..f21101752d 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -163,6 +163,11 @@ typedef struct AVCodecInternal { #if CONFIG_LCMS2 FFIccContext icc; /* used to read and write embedded ICC profiles */ #endif + + /** + * a boolean to describe whether context is opened or not. + */ + unsigned int ctx_opened; } AVCodecInternal; /** diff --git a/libavcodec/options.c b/libavcodec/options.c index a9b35ee1c3..f8fab164fb 100644 --- a/libavcodec/options.c +++ b/libavcodec/options.c @@ -28,6 +28,7 @@ #include "avcodec.h" #include "codec_internal.h" +#include "internal.h" #include "libavutil/avassert.h" #include "libavutil/internal.h" #include "libavutil/mem.h" @@ -89,6 +90,7 @@ static const AVClass av_codec_context_class = { static int init_context_defaults(AVCodecContext *s, const AVCodec *codec) { const FFCodec *const codec2 = ffcodec(codec); + AVCodecInternal *avci = NULL; int flags=0; memset(s, 0, sizeof(AVCodecContext)); @@ -132,7 +134,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if(codec && codec2->priv_data_size){ s->priv_data = av_mallocz(codec2->priv_data_size); if (!s->priv_data) - return AVERROR(ENOMEM); + goto alloc_fail; if(codec->priv_class){ *(const AVClass**)s->priv_data = codec->priv_class; av_opt_set_defaults(s->priv_data); @@ -147,7 +149,21 @@ FF_ENABLE_DEPRECATION_WARNINGS d++; } } + + avci = av_mallocz(sizeof(*avci)); + if (!avci) + goto alloc_fail; + + s->internal = avci; + return 0; + +alloc_fail: + av_freep(&s->internal); + + av_freep(&s->priv_data); + + return AVERROR(ENOMEM); } AVCodecContext *avcodec_alloc_context3(const AVCodec *codec) @@ -174,6 +190,8 @@ void avcodec_free_context(AVCodecContext **pavctx) avcodec_close(avctx); + av_freep(&avctx->internal); + av_freep(&avctx->extradata); av_freep(&avctx->subtitle_header); av_freep(&avctx->intra_matrix);