From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ffmpeg-devel-bounces@ffmpeg.org>
Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100])
	by master.gitmailbox.com (Postfix) with ESMTP id D8C0C40910
	for <ffmpegdev@gitmailbox.com>; Wed, 23 Mar 2022 16:27:03 +0000 (UTC)
Received: from [127.0.1.1] (localhost [127.0.0.1])
	by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3F3C768B13B;
	Wed, 23 Mar 2022 18:27:01 +0200 (EET)
Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com
 [209.85.167.176])
 by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 213BC680C04
 for <ffmpeg-devel@ffmpeg.org>; Wed, 23 Mar 2022 18:26:55 +0200 (EET)
Received: by mail-oi1-f176.google.com with SMTP id e4so2160222oif.2
 for <ffmpeg-devel@ffmpeg.org>; Wed, 23 Mar 2022 09:26:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;
 h=message-id:date:mime-version:user-agent:subject:content-language:to
 :references:from:in-reply-to:content-transfer-encoding;
 bh=dsSn6shAxZLhZVCW3a0gVKyJdU8N9iocOppW9zppoq0=;
 b=CFvuI6SxPiuUE5u80M0ptmmBLLaKSrnIkU6KJBxjk9P69RWmVBlvv6PA99ArlJCSTC
 5f90Vm/k9F79/fS82/bgiQfvCBOc8PsJHUu4DocAnxLsXPK1Gi4BLLTpWevtQc7XhUOG
 CXUDqxlSjhn1mu4d27qgamkeQnudlEhu6XXEm1KXO58JIjCVFFZ/nYYVIAi+LfWn08Xr
 JNTYXWjz0GLH1lGBOBhNITwut4ssEHMQn1/z6bAk+rUMUpj7pMLoneRxcaBGARRPi9q3
 yGHkYdfs0BDs6g+s2gfspNkFDLzq+0w9v+MxKVoO/dvch/Ur1z87STUUidHuspMpFlGb
 Bpog==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20210112;
 h=x-gm-message-state:message-id:date:mime-version:user-agent:subject
 :content-language:to:references:from:in-reply-to
 :content-transfer-encoding;
 bh=dsSn6shAxZLhZVCW3a0gVKyJdU8N9iocOppW9zppoq0=;
 b=gasPuaSWAeWUPyl9SWuG7Gj7xVeKXCiwUQ0ymS1nPVyU0fz6ev091IbOKr5yRm/w9p
 VNFKRKWq2Z16E7MtBThEJ70UG+XSK0taFIlcgSeFTNmm2qph4Ss/KewMLW0h0tuqxeR0
 nGu0hxZPqSb/uXFHtHBJj8OlrCTUQqziGwJIxUQI7k53cZ8OPPj2Gafs+LDg2sPDQ7NM
 WDitcdsaYQ7yrLLjvkugmzWpOH5WqmNhaEyANiVtxr03kCftpSUEm+/hMNaVXtQw5539
 3ITWSZ6+WHAUmLg/PiqY8nFuMs8Iq/x9FIMz6LPAav23ehLbtCEna8if3UrmDyET+5yc
 HvMg==
X-Gm-Message-State: AOAM532mp1T0TbvWoKEgl4JRAXQSU996QaLlfFdX7eNaTXxXeFeqGYC0
 85FYEeGO7lveYDB/El4ORO5V5QddCm1lTA==
X-Google-Smtp-Source: ABdhPJzsxPTxV+XW5AgXh1s9NSqw2tK9+ORTET0bQ8qNo280oV5dTHB3BucY15DmWtjhAw8O8UzIMg==
X-Received: by 2002:aca:2311:0:b0:2ec:cb84:c5bb with SMTP id
 e17-20020aca2311000000b002eccb84c5bbmr441101oie.246.1648052812316; 
 Wed, 23 Mar 2022 09:26:52 -0700 (PDT)
Received: from [192.168.0.13] ([186.136.131.95])
 by smtp.gmail.com with ESMTPSA id
 l12-20020a056870d3cc00b000ddeb925982sm127093oag.38.2022.03.23.09.26.50
 for <ffmpeg-devel@ffmpeg.org>
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Wed, 23 Mar 2022 09:26:51 -0700 (PDT)
Message-ID: <dab71fb6-69fe-ef62-6a0c-355efa87653e@gmail.com>
Date: Wed, 23 Mar 2022 13:26:48 -0300
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101
 Thunderbird/91.7.0
Content-Language: en-US
To: ffmpeg-devel@ffmpeg.org
References: <20220323155720.20017-1-anton@khirnov.net>
 <20220323155720.20017-5-anton@khirnov.net>
From: James Almer <jamrial@gmail.com>
In-Reply-To: <20220323155720.20017-5-anton@khirnov.net>
Subject: Re: [FFmpeg-devel] [PATCH 5/8] lavc/encode: add an encoder-specific
 get_buffer() variant
X-BeenThere: ffmpeg-devel@ffmpeg.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: ffmpeg-devel-bounces@ffmpeg.org
Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
Archived-At: <https://master.gitmailbox.com/ffmpegdev/dab71fb6-69fe-ef62-6a0c-355efa87653e@gmail.com/>
List-Archive: <https://master.gitmailbox.com/ffmpegdev/>
List-Post: <mailto:ffmpegdev@gitmailbox.com>



On 3/23/2022 12:57 PM, Anton Khirnov wrote:
> Several encoders (roqvideo, svq1, snow, and the mpegvideo family)
> currently call ff_get_buffer(). However this function is written
> assuming it is called by a decoder. Though nothing has been obviously
> broken by this until now, this may change in the future.
> 
> To avoid potential future issues, introduce a simple encode-specific
> wrapper around avcodec_default_get_buffer2() and enforce its use in
> encoders.
> ---
>   libavcodec/decode.c      |  2 ++
>   libavcodec/encode.c      | 34 ++++++++++++++++++++++++++++++++++
>   libavcodec/encode.h      |  5 +++++
>   libavcodec/mpegpicture.c | 16 +++++++++-------
>   libavcodec/roqvideoenc.c |  4 ++--
>   libavcodec/snow.c        |  8 ++++++--
>   libavcodec/svq1enc.c     |  4 ++--
>   7 files changed, 60 insertions(+), 13 deletions(-)
> 
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index fffad5f700..3733e6d4b8 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -1405,6 +1405,8 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
>       int override_dimensions = 1;
>       int ret;
>   
> +    av_assert0(av_codec_is_decoder(avctx->codec));
> +
>       if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
>           if ((unsigned)avctx->width > INT_MAX - STRIDE_ALIGN ||
>               (ret = av_image_check_size2(FFALIGN(avctx->width, STRIDE_ALIGN), avctx->height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx)) < 0 || avctx->pix_fmt<0) {
> diff --git a/libavcodec/encode.c b/libavcodec/encode.c
> index 837ffaa40d..ec8d06d068 100644
> --- a/libavcodec/encode.c
> +++ b/libavcodec/encode.c
> @@ -572,3 +572,37 @@ FF_ENABLE_DEPRECATION_WARNINGS
>   
>       return 0;
>   }
> +
> +int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame)
> +{
> +    int ret;
> +
> +    switch (avctx->codec->type) {
> +    case AVMEDIA_TYPE_VIDEO:
> +        frame->format = avctx->pix_fmt;
> +        if (frame->width <= 0 || frame->height <= 0) {
> +            frame->width  = FFMAX(avctx->width,  avctx->coded_width);
> +            frame->height = FFMAX(avctx->height, avctx->coded_height);
> +        }
> +
> +        break;
> +    case AVMEDIA_TYPE_AUDIO:
> +        frame->sample_rate = avctx->sample_rate;
> +        frame->format      = avctx->sample_fmt;
> +        if (!frame->ch_layout.nb_channels) {
> +            int ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);

Unnecessarily shadowing ret.

> +            if (ret < 0)
> +                return ret;
> +        }
> +        break;
> +    }
> +
> +    ret = avcodec_default_get_buffer2(avctx, frame, 0);
> +    if (ret < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
> +        av_frame_unref(frame);
> +        return ret;
> +    }
> +
> +    return 0;
> +}
> diff --git a/libavcodec/encode.h b/libavcodec/encode.h
> index 97b3acf9df..b2536bf0f3 100644
> --- a/libavcodec/encode.h
> +++ b/libavcodec/encode.h
> @@ -44,6 +44,11 @@ int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame);
>    */
>   int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags);
>   
> +/**
> + * Allocate buffers for a frame. Encoder equivalent to ff_get_buffer().
> + */
> +int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame);
> +
>   /**
>    * Check AVPacket size and allocate data.
>    *
> diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c
> index 681ccc2b82..aaa1df0bd8 100644
> --- a/libavcodec/mpegpicture.c
> +++ b/libavcodec/mpegpicture.c
> @@ -26,6 +26,7 @@
>   #include "libavutil/imgutils.h"
>   
>   #include "avcodec.h"
> +#include "encode.h"
>   #include "motion_est.h"
>   #include "mpegpicture.h"
>   #include "mpegutils.h"
> @@ -123,14 +124,15 @@ static int alloc_frame_buffer(AVCodecContext *avctx,  Picture *pic,
>       int r, ret;
>   
>       pic->tf.f = pic->f;
> -    if (avctx->codec_id != AV_CODEC_ID_WMV3IMAGE &&
> -        avctx->codec_id != AV_CODEC_ID_VC1IMAGE  &&
> -        avctx->codec_id != AV_CODEC_ID_MSS2) {
> -        if (edges_needed) {
> -            pic->f->width  = avctx->width  + 2 * EDGE_WIDTH;
> -            pic->f->height = avctx->height + 2 * EDGE_WIDTH;
> -        }
>   
> +    if (edges_needed) {
> +        pic->f->width  = avctx->width  + 2 * EDGE_WIDTH;
> +        pic->f->height = avctx->height + 2 * EDGE_WIDTH;
> +
> +        r = ff_encode_alloc_frame(avctx, pic->f);
> +    } else if (avctx->codec_id != AV_CODEC_ID_WMV3IMAGE &&
> +               avctx->codec_id != AV_CODEC_ID_VC1IMAGE  &&
> +               avctx->codec_id != AV_CODEC_ID_MSS2) {
>           r = ff_thread_get_ext_buffer(avctx, &pic->tf,
>                                        pic->reference ? AV_GET_BUFFER_FLAG_REF : 0);
>       } else {
> diff --git a/libavcodec/roqvideoenc.c b/libavcodec/roqvideoenc.c
> index ef7861088d..95db514140 100644
> --- a/libavcodec/roqvideoenc.c
> +++ b/libavcodec/roqvideoenc.c
> @@ -1081,8 +1081,8 @@ static int roq_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
>       if (enc->first_frame) {
>           /* Alloc memory for the reconstruction data (we must know the stride
>            for that) */
> -        if ((ret = ff_get_buffer(avctx, roq->current_frame, 0)) < 0 ||
> -            (ret = ff_get_buffer(avctx, roq->last_frame,    0)) < 0)
> +        if ((ret = ff_encode_alloc_frame(avctx, roq->current_frame)) < 0 ||
> +            (ret = ff_encode_alloc_frame(avctx, roq->last_frame   )) < 0)
>               return ret;
>   
>           /* Before the first video frame, write a "video info" chunk */
> diff --git a/libavcodec/snow.c b/libavcodec/snow.c
> index 1224b95491..bc0d9a8983 100644
> --- a/libavcodec/snow.c
> +++ b/libavcodec/snow.c
> @@ -23,6 +23,7 @@
>   #include "libavutil/opt.h"
>   #include "libavutil/thread.h"
>   #include "avcodec.h"
> +#include "encode.h"
>   #include "me_cmp.h"
>   #include "snow_dwt.h"
>   #include "internal.h"
> @@ -76,8 +77,11 @@ int ff_snow_get_buffer(SnowContext *s, AVFrame *frame)
>       if (edges_needed) {
>           frame->width  += 2 * EDGE_WIDTH;
>           frame->height += 2 * EDGE_WIDTH;
> -    }
> -    if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
> +
> +        ret = ff_encode_alloc_frame(s->avctx, frame);
> +    } else
> +        ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF);
> +    if (ret < 0)
>           return ret;
>       if (edges_needed) {
>           for (i = 0; frame->data[i]; i++) {
> diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c
> index 706bc2e42e..cb0d0308fc 100644
> --- a/libavcodec/svq1enc.c
> +++ b/libavcodec/svq1enc.c
> @@ -595,12 +595,12 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
>       }
>   
>       if (!s->current_picture->data[0]) {
> -        if ((ret = ff_get_buffer(avctx, s->current_picture, 0)) < 0) {
> +        if ((ret = ff_encode_alloc_frame(avctx, s->current_picture)) < 0) {
>               return ret;
>           }
>       }
>       if (!s->last_picture->data[0]) {
> -        ret = ff_get_buffer(avctx, s->last_picture, 0);
> +        ret = ff_encode_alloc_frame(avctx, s->last_picture);
>           if (ret < 0)
>               return ret;
>       }
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".