From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 80DCC4BCD8 for ; Wed, 22 Jan 2025 02:55:00 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 376E668B860; Wed, 22 Jan 2025 04:54:30 +0200 (EET) Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6A3AB68B7CB for ; Wed, 22 Jan 2025 04:54:23 +0200 (EET) Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-21661be2c2dso114929855ad.1 for ; Tue, 21 Jan 2025 18:54:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1737514461; x=1738119261; darn=ffmpeg.org; 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=hqPj5+DRX+jrGqAoLT1RIDpggUEBOlWOMrfyuHExZaY=; b=XoLZv9YHD6dMBp3LaExJ/o+MYGELLi5kceVWtflHZyBFkFONqB6w6D2n2KJQZTBxMq 9TtI5gq6gC+Nm8qlxFOtiXO89g69qd527uNTErepeXQ7tf24zO7piDJcwUAu2SrlzeNj YBF8r+1k9B5VOKNhlg0PD0kqE5/MgkkZelkcGTVuYnx4CBxd07grmtaOFgUGBsvRKxoV 87S3xYHiEiEf8ELacnm+0HMLCM4DMnmvlbZ3nmDDD4rUefobzBLNeBWv6uG+7iISFg7w zpHURAx8AZB78FzfMKT66BMkpfS3amv0pcnOPUIoTaGz1Y9e2S2C69zGYQeiYrkTQC++ U8JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737514461; x=1738119261; 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=hqPj5+DRX+jrGqAoLT1RIDpggUEBOlWOMrfyuHExZaY=; b=TLQHvZT7F5JkEMxBPxxG1mU75oFD94ADe2QFu2rf8Key6ZZ5zcUVykQ0+OvMZ5/5ky cRJBothTwZi88X6a0SqLIvgEwBS27aSX3iyKTRJo+og53iq3EdJiSi715EIwzeTQDGEo gufNORezzbhv/5x8i4jnNS+/8xIKVehOA+lJ8LbfuVZXz/7M/1sJzXIqDW0TUNYxAsyI yBWdHF06zCtkjedEQfFtoTEEp1R85fwckIAOcFc0kEvuYE9/q8ttOXJd1Nwhnqg9qC0o v3UJ8kikMMFPnvwJihp/8YK/HERsEntChrOBaqXa645kHYlX6vMTWc5a4dOR2Biv8Ixw KimQ== X-Gm-Message-State: AOJu0Yx49dKBQvqjk6Cs8+EC1Nx3egmHec7CMz8jCqLbyIzHFoSropkl EaSNz9PT1E5TYIkitV7Srplzz0p52fq7F8NRaSge+c52x4cKntvQuSIu7g== X-Gm-Gg: ASbGncvsgDWuN6cor3UI2e0C+Ae9tkZnv8JMJAmPW0XqM7y1S23U31CkRBlp1sIBrms a0RBs9CaYaAaZx8LT8aOewJw5HPjqtZq2r/2+rItp2V0ZCbFCK0QwH7Kz3IFx52SpsVBauXlX0y fi7nmW5oquDyT7d2k0fP5XZUSLNmaWP10nncwgitrXq4ezlHQ+OcWms+nDbIFDrL7mcskf17eY6 WVHGf0ctGorqIaSnB2sgWewtG5OAiLWx+RC4/r97oQsLuJhB6ccc1STM/fM3YG0y/O0UVVJC8aH JaKpph/87g== X-Google-Smtp-Source: AGHT+IHMvhoiK7KXNotP2p9+BMMylg0ks7y7XR/R5rNkCIyF2TnFzNOR7niLRm33O/MHdzisfi39OA== X-Received: by 2002:a17:902:f393:b0:215:a2e2:53ff with SMTP id d9443c01a7336-21c352d6cbbmr236807665ad.11.1737514460863; Tue, 21 Jan 2025 18:54:20 -0800 (PST) Received: from localhost.localdomain ([2800:2121:b040:c:5b7:a27f:554b:498a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-21c2d3efb4csm84817225ad.201.2025.01.21.18.54.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2025 18:54:20 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Jan 2025 23:54:00 -0300 Message-ID: <20250122025403.14457-4-jamrial@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250122025403.14457-1-jamrial@gmail.com> References: <20250122025403.14457-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/7] avcodec/encode: add support for param change frame side data 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: With this, callers can signal supported encoders to reinitialize using certain parameters, which should allow for more graceful (but potentially more limited in scope) reinitialization than closing and reopening the encoder, or even simply on-the-fly changes of trivial values that would not require any kind or flushing or reinitialization by the encoder. Signed-off-by: James Almer --- libavcodec/codec_internal.h | 2 ++ libavcodec/encode.c | 69 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/libavcodec/codec_internal.h b/libavcodec/codec_internal.h index 5b2db74590..e38402d2f5 100644 --- a/libavcodec/codec_internal.h +++ b/libavcodec/codec_internal.h @@ -243,6 +243,8 @@ typedef struct FFCodec { */ void (*flush)(struct AVCodecContext *); + int (*reconf)(struct AVCodecContext *); + /** * Decoding only, a comma-separated list of bitstream filters to apply to * packets before decoding. diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 3baf5b8103..187b4015f1 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -31,6 +31,7 @@ #include "avcodec.h" #include "avcodec_internal.h" +#include "bytestream.h" #include "codec_desc.h" #include "codec_internal.h" #include "encode.h" @@ -59,6 +60,69 @@ static EncodeContext *encode_ctx(AVCodecInternal *avci) return (EncodeContext*)avci; } +static int apply_param_change(AVCodecContext *avctx, const AVFrame *frame) +{ + int ret = AVERROR_BUG; + const AVFrameSideData *sd; + GetByteContext gbc; + uint32_t flags; + + sd = av_frame_get_side_data(frame, AV_FRAME_DATA_PARAM_CHANGE); + if (!sd) + return 0; + + if (!(avctx->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE)) { + av_log(avctx, AV_LOG_ERROR, "This encoder does not support parameter " + "changes, but PARAM_CHANGE side data was sent to it.\n"); + ret = AVERROR(EINVAL); + goto fail2; + } + + if (sd->size < 4) + goto fail; + + bytestream2_init(&gbc, sd->data, sd->size); + flags = bytestream2_get_le32(&gbc); + + if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) { + if (frame->sample_rate <= 0 || frame->sample_rate > INT_MAX) { + av_log(avctx, AV_LOG_ERROR, "Invalid sample rate"); + ret = AVERROR_INVALIDDATA; + goto fail2; + } + avctx->sample_rate = frame->sample_rate; + } + if (flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) { + av_image_check_size2(frame->width, frame->height, avctx->max_pixels, avctx->pix_fmt, 0, avctx); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid dimensions"); + goto fail2; + } + avctx->width = frame->width; + avctx->height = frame->height; + } + + if (flags) { + ret = 0; + if (ffcodec(avctx->codec)->reconf) + ret = ffcodec(avctx->codec)->reconf(avctx); + if (ret < 0) + goto fail2; + } + + return 0; +fail: + av_log(avctx, AV_LOG_ERROR, "PARAM_CHANGE side data too small.\n"); + ret = AVERROR_INVALIDDATA; +fail2: + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Error applying parameter changes.\n"); + if (avctx->err_recognition & AV_EF_EXPLODE) + return ret; + } + return 0; +} + int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size) { if (size < 0 || size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) { @@ -205,6 +269,7 @@ int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame) { AVCodecInternal *avci = avctx->internal; + int ret; if (avci->draining) return AVERROR_EOF; @@ -229,6 +294,10 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif + ret = apply_param_change(avctx, frame); + if (ret < 0) + return ret; + return 0; } -- 2.48.1 _______________________________________________ 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".