From patchwork Sun Jul 9 12:57:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 42557 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:6da1:b0:131:a7d0:bc6d with SMTP id gl33csp99579pzb; Sun, 9 Jul 2023 05:57:59 -0700 (PDT) X-Google-Smtp-Source: APBJJlH3F3mn0XMkH8p/XAkhtDwVfymrbMCrDstP8Y3zz1soxPZ3KSwi2icL1lhEhtEsPeg3wKOV X-Received: by 2002:a05:6402:3449:b0:51e:1837:d5be with SMTP id l9-20020a056402344900b0051e1837d5bemr9898682edc.24.1688907479299; Sun, 09 Jul 2023 05:57:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1688907479; cv=none; d=google.com; s=arc-20160816; b=GzNUQ2t+BFso6A31G/VB4byp8x4/RMVhd6r3Fkdh1x4kmdhrqIbgVIzwHo1NCm0Qj2 yc/nYpdFHWOS7oSXv8sK0wj0zYUfmB2JGvm0ZJsRGtXOdF142oYIR7RBF8iYrNGvAmPd yYmC1Jz+5WHruCDF+Z5c+f7qfpGv1MZUBzvkVotrBnaRDvvfnmGRCCnhANzM1ZAZcXpT p5vRIYXwa7NMiHXoc5pbrJBqBlNiZSv4jVmAC8itL1iJELMUappejTrDoo+weSXxW17/ EJDrX3fZ3HVsHHhAIk8uLyScKurQJNjJLNpxJ8zqq4Fj1icuXtbTH2WEZ0amcXYJsjoq g74Q== 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:message-id:date:to:from :delivered-to; bh=C00XUcszh/FJEOcjbBPnSXSjV8pDLjlwIu5Sscp3w2E=; fh=8ZF2QtiKOjBtyn9wuO2cMeZaLsE4aq02Bq77gGK61E8=; b=Hb+3O/r6QvVTGBOjdpmARsfFJICewyNWCZ1yDpE5oMy9jsmGVlBMMWKm9qnafNsNs0 yl/YNw6rhsEkrCDXURv5XQvzjh4RLabugHbYNtaK/lLyeDqZJyJcnnn1quMRZRa8cxgv SizZQnjW1PuGmx8D+17W+u+cilq5sC/kvkb+KMaMk5kcHa749pO/JXB2thaoftUs+lom 1wynGkP0gGrQmU4V05H5r0vpNIjPMCF1ecyhbqTz/s9MpikktNEUVeLpcmmHYFddMQDh ZwaiYaPKOUuh7QJyB42blGbBKw6jw8zLBai+XfET7qXx+HzIEaTHBJD0G4gMGnBzrJQr G7BQ== ARC-Authentication-Results: i=1; mx.google.com; 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 n10-20020a056402060a00b0051de453f1bcsi5983776edv.303.2023.07.09.05.57.58; Sun, 09 Jul 2023 05:57:59 -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; 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 BAB0368C628; Sun, 9 Jul 2023 15:57:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 590A468C44A for ; Sun, 9 Jul 2023 15:57:49 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 0910D2404EC for ; Sun, 9 Jul 2023 14:57:49 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id GzuyhfoaKtxX for ; Sun, 9 Jul 2023 14:57:48 +0200 (CEST) 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 mail0.khirnov.net (Postfix) with ESMTPS id 213CC2404EA for ; Sun, 9 Jul 2023 14:57:48 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id DA7B93A0153 for ; Sun, 9 Jul 2023 14:57:47 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jul 2023 14:57:46 +0200 Message-Id: <20230709125746.8054-1-anton@khirnov.net> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavc: deprecate AV_CODEC_FLAG_DROPCHANGED 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: xpccsjTsxO51 This decoding flag makes decoders drop all frames after a parameter change, but what exactly constitutes a parameter change is not well defined and will typically depend on the exact use case. This functionality then does not belong in libavcodec, but rather in user code --- doc/APIchanges | 3 +++ libavcodec/avcodec.c | 2 ++ libavcodec/avcodec.h | 7 ++++--- libavcodec/decode.c | 11 +++++++++-- libavcodec/internal.h | 2 ++ libavcodec/options_table.h | 2 ++ libavcodec/version_major.h | 1 + 7 files changed, 23 insertions(+), 5 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 0cda51fdee..6217502492 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09 API changes, most recent first: +2023-07-xx - xxxxxxxxxx - lavc 60 - avcodec.h + Deprecate AV_CODEC_FLAG_DROPCHANGED without replacement. + 2023-07-xx - xxxxxxxxxx - lavu 58.15.100 - video_hint.h Add AVVideoHint API. diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index 8ccc610227..340abe830e 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -456,7 +456,9 @@ av_cold int avcodec_close(AVCodecContext *avctx) av_bsf_free(&avci->bsf); +#if FF_API_DROPCHANGED av_channel_layout_uninit(&avci->initial_ch_layout); +#endif #if CONFIG_LCMS2 ff_icc_context_uninit(&avci->icc); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index d17bdc360d..fe41ecc3c9 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -226,11 +226,15 @@ typedef struct RcOverride{ * Use qpel MC. */ #define AV_CODEC_FLAG_QPEL (1 << 4) +#if FF_API_DROPCHANGED /** * Don't output frames whose parameters differ from first * decoded frame in stream. + * + * @deprecated callers should implement this functionality in their own code */ #define AV_CODEC_FLAG_DROPCHANGED (1 << 5) +#endif /** * Request the encoder to output reconstructed frames, i.e.\ frames that would * be produced by decoding the encoded bistream. These frames may be retrieved @@ -2713,9 +2717,6 @@ int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); * no more output frames * @retval AVERROR(EINVAL) codec not opened, or it is an encoder without the * @ref AV_CODEC_FLAG_RECON_FRAME flag enabled - * @retval AVERROR_INPUT_CHANGED current decoded frame has changed parameters with - * respect to first decoded frame. Applicable when flag - * AV_CODEC_FLAG_DROPCHANGED is set. * @retval "other negative error code" legitimate decoding errors */ int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 269633ce10..40eb7679ca 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -740,7 +740,7 @@ fail: int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame) { AVCodecInternal *avci = avctx->internal; - int ret, changed; + int ret; if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) return AVERROR(EINVAL); @@ -770,6 +770,7 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif +#if FF_API_DROPCHANGED if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) { if (avctx->frame_num == 1) { @@ -790,7 +791,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (avctx->frame_num > 1) { - changed = avci->initial_format != frame->format; + int changed = avci->initial_format != frame->format; switch(avctx->codec_type) { case AVMEDIA_TYPE_VIDEO: @@ -815,6 +816,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } } } +#endif return 0; fail: av_frame_unref(frame); @@ -1739,6 +1741,11 @@ int ff_decode_preinit(AVCodecContext *avctx) if (ret < 0) return ret; +#if FF_API_DROPCHANGED + if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) + av_log(avctx, AV_LOG_WARNING, "The dropchanged flag is deprecated.\n"); +#endif + return 0; } diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 868dd46b48..4dce9f6fbb 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -135,12 +135,14 @@ typedef struct AVCodecInternal { AVFrame *buffer_frame; int draining_done; +#if FF_API_DROPCHANGED /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */ int changed_frames_dropped; int initial_format; int initial_width, initial_height; int initial_sample_rate; AVChannelLayout initial_ch_layout; +#endif #if CONFIG_LCMS2 FFIccContext icc; /* used to read and write embedded ICC profiles */ diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index f1a9729c0d..d1244bfc1a 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -72,7 +72,9 @@ static const AVOption avcodec_options[] = { {"ilme", "interlaced motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_ME }, INT_MIN, INT_MAX, V|E, "flags"}, {"cgop", "closed GOP", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_CLOSED_GOP }, INT_MIN, INT_MAX, V|E, "flags"}, {"output_corrupt", "Output even potentially corrupted frames", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_OUTPUT_CORRUPT }, INT_MIN, INT_MAX, V|D, "flags"}, +#if FF_API_DROPCHANGED {"drop_changed", "Drop frames whose parameters differ from first decoded frame", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_DROPCHANGED }, INT_MIN, INT_MAX, A|V|D, "flags"}, +#endif {"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D|S, "flags2"}, {"fast", "allow non-spec-compliant speedup tricks", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_FAST }, INT_MIN, INT_MAX, V|E, "flags2"}, {"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, "flags2"}, diff --git a/libavcodec/version_major.h b/libavcodec/version_major.h index 2f5138d079..95c5aec0c5 100644 --- a/libavcodec/version_major.h +++ b/libavcodec/version_major.h @@ -48,6 +48,7 @@ #define FF_API_SLICE_OFFSET (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_SUBFRAMES (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_TICKS_PER_FRAME (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_DROPCHANGED (LIBAVCODEC_VERSION_MAJOR < 61) // reminder to remove CrystalHD decoders on next major bump #define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61)