PR #23193 opened by Marvin Scholz (ePirat)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23193
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23193.patch

libcelt, which it depends on, was not updated in a very long time and is
considered deprecated, as Opus exists which has a CELT mode. Therefore
remove standalone CELT decoding support.

It was already broken since b8604a976128ffbd316653cdec11ba487f1025bb,
11 years ago, and no one noticed and complained.


>From 23a37a3ce0c0e8cac27b54d54b876eeb00e23e86 Mon Sep 17 00:00:00 2001
From: Marvin Scholz <[email protected]>
Date: Thu, 21 May 2026 19:22:54 +0200
Subject: [PATCH] avcodec: remove CELT decoder

libcelt, which it depends on, was not updated in a very long time and is
considered deprecated, as Opus exists which has a CELT mode. Therefore
remove standalone CELT decoding support.

It was already broken since b8604a976128ffbd316653cdec11ba487f1025bb,
11 years ago, and no one noticed and complained.
---
 Changelog                 |   1 +
 configure                 |   6 --
 doc/decoders.texi         |   8 ---
 doc/general_contents.texi |   2 -
 libavcodec/Makefile       |   1 -
 libavcodec/allcodecs.c    |   1 -
 libavcodec/libcelt_dec.c  | 142 --------------------------------------
 7 files changed, 1 insertion(+), 160 deletions(-)
 delete mode 100644 libavcodec/libcelt_dec.c

diff --git a/Changelog b/Changelog
index 6df9bed4aa..cca53d0d7c 100644
--- a/Changelog
+++ b/Changelog
@@ -14,6 +14,7 @@ version <next>:
 - APV Vulkan hwaccel
 - Animated WebP decoder
 - Animated WebP demuxer
+- Remove CELT decoding support (doesn't affect Opus CELT)
 
 
 version 8.1:
diff --git a/configure b/configure
index 3ba8723856..4e42519edd 100755
--- a/configure
+++ b/configure
@@ -222,7 +222,6 @@ External library support:
   --enable-libbluray       enable BluRay reading using libbluray [no]
   --enable-libbs2b         enable bs2b DSP library [no]
   --enable-libcaca         enable textual display using libcaca [no]
-  --enable-libcelt         enable CELT decoding via libcelt [no]
   --enable-libcdio         enable audio CD grabbing with libcdio [no]
   --enable-libcodec2       enable codec2 en/decoding using libcodec2 [no]
   --enable-libdav1d        enable AV1 decoding via libdav1d [no]
@@ -2085,7 +2084,6 @@ EXTERNAL_LIBRARY_LIST="
     libbluray
     libbs2b
     libcaca
-    libcelt
     libcodec2
     libdav1d
     libdc1394
@@ -3825,7 +3823,6 @@ libaom_av1_encoder_deps="libaom"
 libaom_av1_encoder_select="extract_extradata_bsf dovi_rpuenc"
 libaribb24_decoder_deps="libaribb24"
 libaribcaption_decoder_deps="libaribcaption"
-libcelt_decoder_deps="libcelt"
 libcodec2_decoder_deps="libcodec2"
 libcodec2_encoder_deps="libcodec2"
 libdav1d_decoder_deps="libdav1d"
@@ -7322,9 +7319,6 @@ enabled libiec61883       && require libiec61883 
libiec61883/iec61883.h iec61883
 enabled libass            && require_pkg_config libass "libass >= 0.11.0" 
ass/ass.h ass_library_init
 enabled libbluray         && require_pkg_config libbluray libbluray 
libbluray/bluray.h bd_open
 enabled libbs2b           && require_pkg_config libbs2b libbs2b bs2b.h 
bs2b_open
-enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
-                             { check_lib libcelt celt/celt.h 
celt_decoder_create_custom -lcelt0 ||
-                               die "ERROR: libcelt must be installed and 
version must be >= 0.11.0."; }
 enabled libcaca           && require_pkg_config libcaca caca caca.h 
caca_create_canvas
 enabled libcodec2         && require libcodec2 codec2/codec2.h codec2_create 
-lcodec2
 enabled libdav1d          && require_pkg_config libdav1d "dav1d >= 1.0.0" 
"dav1d/dav1d.h" dav1d_version
diff --git a/doc/decoders.texi b/doc/decoders.texi
index 1db297f42f..c8177c15e7 100644
--- a/doc/decoders.texi
+++ b/doc/decoders.texi
@@ -307,14 +307,6 @@ This decoder generates wave patterns according to 
predefined sequences. Its
 use is purely internal and the format of the data it accepts is not publicly
 documented.
 
-@section libcelt
-
-libcelt decoder wrapper.
-
-libcelt allows libavcodec to decode the Xiph CELT ultra-low delay audio codec.
-Requires the presence of the libcelt headers and library during configuration.
-You need to explicitly configure the build with @code{--enable-libcelt}.
-
 @section libgsm
 
 libgsm decoder wrapper.
diff --git a/doc/general_contents.texi b/doc/general_contents.texi
index 47ac1989f2..5fed093642 100644
--- a/doc/general_contents.texi
+++ b/doc/general_contents.texi
@@ -1295,8 +1295,6 @@ following image formats are supported:
 @item Bink Audio             @tab     @tab  X
     @tab Used in Bink and Smacker files in many games.
 @item Bonk audio             @tab     @tab  X
-@item CELT                   @tab     @tab  E
-    @tab decoding supported through external library libcelt
 @item codec2                 @tab  E  @tab  E
     @tab en/decoding supported through external library libcodec2
 @item CRI HCA                @tab     @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 2312e7b040..c6b878207b 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1174,7 +1174,6 @@ OBJS-$(CONFIG_LIBAOM_AV1_DECODER)         += libaomdec.o 
libaom.o
 OBJS-$(CONFIG_LIBAOM_AV1_ENCODER)         += libaomenc.o libaom.o
 OBJS-$(CONFIG_LIBARIBB24_DECODER)         += libaribb24.o ass.o
 OBJS-$(CONFIG_LIBARIBCAPTION_DECODER)     += libaribcaption.o ass.o
-OBJS-$(CONFIG_LIBCELT_DECODER)            += libcelt_dec.o
 OBJS-$(CONFIG_LIBCODEC2_DECODER)          += libcodec2.o
 OBJS-$(CONFIG_LIBCODEC2_ENCODER)          += libcodec2.o
 OBJS-$(CONFIG_LIBDAV1D_DECODER)           += libdav1d.o av1_parse.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index e29a3a4020..0815d46f79 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -786,7 +786,6 @@ extern FFCodec ff_libaom_av1_encoder;
 /* preferred over libaribb24 */
 extern const FFCodec ff_libaribcaption_decoder;
 extern const FFCodec ff_libaribb24_decoder;
-extern const FFCodec ff_libcelt_decoder;
 extern const FFCodec ff_libcodec2_encoder;
 extern const FFCodec ff_libcodec2_decoder;
 extern const FFCodec ff_libdav1d_decoder;
diff --git a/libavcodec/libcelt_dec.c b/libavcodec/libcelt_dec.c
deleted file mode 100644
index fcd4fc7736..0000000000
--- a/libavcodec/libcelt_dec.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Xiph CELT decoder using libcelt
- * Copyright (c) 2011 Nicolas George
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <celt/celt.h>
-#include <celt/celt_header.h>
-#include "avcodec.h"
-#include "codec_internal.h"
-#include "decode.h"
-#include "libavutil/intreadwrite.h"
-
-struct libcelt_context {
-    CELTMode *mode;
-    CELTDecoder *dec;
-    int discard;
-};
-
-static int ff_celt_error_to_averror(int err)
-{
-    switch (err) {
-        case CELT_BAD_ARG:          return AVERROR(EINVAL);
-#ifdef CELT_BUFFER_TOO_SMALL
-        case CELT_BUFFER_TOO_SMALL: return AVERROR(ENOBUFS);
-#endif
-        case CELT_INTERNAL_ERROR:   return AVERROR(EFAULT);
-        case CELT_CORRUPTED_DATA:   return AVERROR_INVALIDDATA;
-        case CELT_UNIMPLEMENTED:    return AVERROR(ENOSYS);
-#ifdef ENOTRECOVERABLE
-        case CELT_INVALID_STATE:    return AVERROR(ENOTRECOVERABLE);
-#endif
-        case CELT_ALLOC_FAIL:       return AVERROR(ENOMEM);
-        default:                    return AVERROR(EINVAL);
-    }
-}
-
-static int ff_celt_bitstream_version_hack(CELTMode *mode)
-{
-    CELTHeader header = { .version_id = 0 };
-    celt_header_init(&header, mode, 960, 2);
-    return header.version_id;
-}
-
-static av_cold int libcelt_dec_init(AVCodecContext *c)
-{
-    struct libcelt_context *celt = c->priv_data;
-    int err;
-
-    if (!c->ch_layout.nb_channels || !c->frame_size ||
-        c->frame_size > INT_MAX / sizeof(int16_t) / c->ch_layout.nb_channels)
-        return AVERROR(EINVAL);
-    celt->mode = celt_mode_create(c->sample_rate, c->frame_size, &err);
-    if (!celt->mode)
-        return ff_celt_error_to_averror(err);
-    celt->dec = celt_decoder_create_custom(celt->mode, 
c->ch_layout.nb_channels, &err);
-    if (!celt->dec) {
-        celt_mode_destroy(celt->mode);
-        return ff_celt_error_to_averror(err);
-    }
-    if (c->extradata_size >= 4) {
-        celt->discard = AV_RL32(c->extradata);
-        if (celt->discard < 0 || celt->discard >= c->frame_size) {
-            av_log(c, AV_LOG_WARNING,
-                   "Invalid overlap (%d), ignored.\n", celt->discard);
-            celt->discard = 0;
-        }
-    }
-    if (c->extradata_size >= 8) {
-        unsigned version = AV_RL32(c->extradata + 4);
-        unsigned lib_version = ff_celt_bitstream_version_hack(celt->mode);
-        if (version != lib_version)
-            av_log(c, AV_LOG_WARNING,
-                   "CELT bitstream version 0x%x may be "
-                   "improperly decoded by libcelt for version 0x%x.\n",
-                   version, lib_version);
-    }
-    c->sample_fmt = AV_SAMPLE_FMT_S16;
-    return 0;
-}
-
-static av_cold int libcelt_dec_close(AVCodecContext *c)
-{
-    struct libcelt_context *celt = c->priv_data;
-
-    celt_decoder_destroy(celt->dec);
-    celt_mode_destroy(celt->mode);
-    return 0;
-}
-
-static int libcelt_dec_decode(AVCodecContext *c, AVFrame *frame,
-                              int *got_frame_ptr, AVPacket *pkt)
-{
-    struct libcelt_context *celt = c->priv_data;
-    int err;
-    int16_t *pcm;
-
-    frame->nb_samples = c->frame_size;
-    if ((err = ff_get_buffer(c, frame, 0)) < 0)
-        return err;
-    pcm = (int16_t *)frame->data[0];
-    err = celt_decode(celt->dec, pkt->data, pkt->size, pcm, c->frame_size);
-    if (err < 0)
-        return ff_celt_error_to_averror(err);
-    if (celt->discard) {
-        frame->nb_samples -= celt->discard;
-        memmove(pcm, pcm + celt->discard * c->ch_layout.nb_channels,
-                frame->nb_samples * c->ch_layout.nb_channels * 
sizeof(int16_t));
-        celt->discard = 0;
-    }
-    *got_frame_ptr = 1;
-    return pkt->size;
-}
-
-const FFCodec ff_libcelt_decoder = {
-    .p.name         = "libcelt",
-    CODEC_LONG_NAME("Xiph CELT decoder using libcelt"),
-    .p.type         = AVMEDIA_TYPE_AUDIO,
-    .p.id           = AV_CODEC_ID_CELT,
-    .p.capabilities = AV_CODEC_CAP_DR1,
-    .p.wrapper_name = "libcelt",
-    .caps_internal  = FF_CODEC_CAP_NOT_INIT_THREADSAFE,
-    .priv_data_size = sizeof(struct libcelt_context),
-    .init           = libcelt_dec_init,
-    .close          = libcelt_dec_close,
-    FF_CODEC_DECODE_CB(libcelt_dec_decode),
-};
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to