Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PR] enable 96kHz support for libopus 1.6 (PR #21425)
@ 2026-01-09 22:16 hnsteyding via ffmpeg-devel
  0 siblings, 0 replies; only message in thread
From: hnsteyding via ffmpeg-devel @ 2026-01-09 22:16 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: hnsteyding

PR #21425 opened by hnsteyding
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21425
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21425.patch

Opus 1.6 now supports 96kHz samplerate:
https://www.opus-codec.org/release/stable/2025/12/15/libopus-1_6.html

I've created some PRs in HandBrake project (https://github.com/HandBrake/HandBrake):
https://github.com/HandBrake/HandBrake/pull/7508
https://github.com/HandBrake/HandBrake/pull/7561


>From 9c38a5432818cab9b78c273792436cc2b47abaf8 Mon Sep 17 00:00:00 2001
From: hnsteyding <steyding@yahoo.de>
Date: Fri, 9 Jan 2026 22:00:09 +0000
Subject: [PATCH 1/3] libavcodec: enable 96kHz support for libopus 1.6

---
 libavcodec/libopusdec.c | 2 +-
 libavcodec/libopusenc.c | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c
index c602499b7c..a16eb4ec76 100644
--- a/libavcodec/libopusdec.c
+++ b/libavcodec/libopusdec.c
@@ -62,7 +62,7 @@ static av_cold int libopus_decode_init(AVCodecContext *avc)
         channels = 2;
     }
 
-    avc->sample_rate    = 48000;
+    avc->sample_rate    = 96000;
     avc->sample_fmt     = avc->request_sample_fmt == AV_SAMPLE_FMT_FLT ?
                           AV_SAMPLE_FMT_FLT : AV_SAMPLE_FMT_S16;
     av_channel_layout_uninit(&avc->ch_layout);
diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
index 131886c8ea..0fbfb38982 100644
--- a/libavcodec/libopusenc.c
+++ b/libavcodec/libopusenc.c
@@ -97,7 +97,7 @@ static void libopus_write_header(AVCodecContext *avctx, int stream_count,
     bytestream_put_buffer(&p, "OpusHead", 8);
     bytestream_put_byte(&p, 1); /* Version */
     bytestream_put_byte(&p, channels);
-    bytestream_put_le16(&p, avctx->initial_padding * 48000 / avctx->sample_rate); /* Lookahead samples at 48kHz */
+    bytestream_put_le16(&p, avctx->initial_padding * 96000 / avctx->sample_rate); /* Lookahead samples at 96kHz */
     bytestream_put_le32(&p, avctx->sample_rate); /* Original sample rate */
     bytestream_put_le16(&p, 0); /* Gain of 0dB is recommended. */
 
@@ -267,7 +267,7 @@ static av_cold int libopus_encode_init(AVCodecContext *avctx)
     int coupled_stream_count, header_size, frame_size;
     int mapping_family;
 
-    frame_size = opus->opts.frame_duration * 48000 / 1000;
+    frame_size = opus->opts.frame_duration * 96000 / 1000;
     switch (frame_size) {
     case 120:
     case 240:
@@ -289,7 +289,7 @@ static av_cold int libopus_encode_init(AVCodecContext *avctx)
     case 5760:
 #endif
         opus->opts.packet_size =
-        avctx->frame_size      = frame_size * avctx->sample_rate / 48000;
+        avctx->frame_size      = frame_size * avctx->sample_rate / 96000;
         break;
     default:
         av_log(avctx, AV_LOG_ERROR, "Invalid frame duration: %g.\n"
@@ -577,7 +577,7 @@ static const FFCodecDefault libopus_defaults[] = {
 };
 
 static const int libopus_sample_rates[] = {
-    48000, 24000, 16000, 12000, 8000, 0,
+    96000, 48000, 24000, 16000, 12000, 8000, 0,
 };
 
 const FFCodec ff_libopus_encoder = {
-- 
2.49.1


>From 0cd5b35459f770d7780cfd37335594dc605cfa22 Mon Sep 17 00:00:00 2001
From: hnsteyding <steyding@yahoo.de>
Date: Fri, 9 Jan 2026 22:01:14 +0000
Subject: [PATCH 2/3] libavcodec/opus: enable 96kHz support for libopus 1.6

---
 libavcodec/opus/dec.c    | 2 +-
 libavcodec/opus/enc.c    | 4 ++--
 libavcodec/opus/parser.c | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/libavcodec/opus/dec.c b/libavcodec/opus/dec.c
index 29c490ae37..58df2c7d4a 100644
--- a/libavcodec/opus/dec.c
+++ b/libavcodec/opus/dec.c
@@ -684,7 +684,7 @@ static av_cold int opus_decode_init(AVCodecContext *avctx)
     int ret;
 
     avctx->sample_fmt  = AV_SAMPLE_FMT_FLTP;
-    avctx->sample_rate = 48000;
+    avctx->sample_rate = 96000;
 
     c->fdsp = avpriv_float_dsp_alloc(0);
     if (!c->fdsp)
diff --git a/libavcodec/opus/enc.c b/libavcodec/opus/enc.c
index 8d20b6c192..b171f99a98 100644
--- a/libavcodec/opus/enc.c
+++ b/libavcodec/opus/enc.c
@@ -649,7 +649,7 @@ static av_cold int opus_encode_init(AVCodecContext *avctx)
 
     if (!avctx->bit_rate) {
         int coupled = ff_opus_default_coupled_streams[s->channels - 1];
-        avctx->bit_rate = coupled*(96000) + (s->channels - coupled*2)*(48000);
+        avctx->bit_rate = coupled*(96000) + (s->channels - coupled*2)*(96000);
     } else if (avctx->bit_rate < 6000 || avctx->bit_rate > 255000 * s->channels) {
         int64_t clipped_rate = av_clip(avctx->bit_rate, 6000, 255000 * s->channels);
         av_log(avctx, AV_LOG_ERROR, "Unsupported bitrate %"PRId64" kbps, clipping to %"PRId64" kbps\n",
@@ -746,7 +746,7 @@ const FFCodec ff_opus_encoder = {
     FF_CODEC_ENCODE_CB(opus_encode_frame),
     .close          = opus_encode_end,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
-    CODEC_SAMPLERATES(48000),
+    CODEC_SAMPLERATES(96000),
     CODEC_CH_LAYOUTS(AV_CHANNEL_LAYOUT_MONO, AV_CHANNEL_LAYOUT_STEREO),
     CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_FLTP),
 };
diff --git a/libavcodec/opus/parser.c b/libavcodec/opus/parser.c
index bab0e50412..c16de65494 100644
--- a/libavcodec/opus/parser.c
+++ b/libavcodec/opus/parser.c
@@ -175,7 +175,7 @@ static int opus_parse(AVCodecParserContext *ctx, AVCodecContext *avctx,
     ParseContext *pc    = &s->pc;
     int next, header_len = 0;
 
-    avctx->sample_rate = 48000;
+    avctx->sample_rate = 96000;
 
     if (avctx->extradata && !s->extradata_parsed) {
         if (ff_opus_parse_extradata(avctx, &s->ctx) < 0) {
-- 
2.49.1


>From a016696be12c8fffa80cf46d12439399f97cfe64 Mon Sep 17 00:00:00 2001
From: hnsteyding <steyding@yahoo.de>
Date: Fri, 9 Jan 2026 22:03:06 +0000
Subject: [PATCH 3/3] libavformat: enable 96kHz support for libopus 1.6

---
 libavformat/oggenc.c       | 2 +-
 libavformat/oggparseopus.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c
index 9a548a8d29..9f44869180 100644
--- a/libavformat/oggenc.c
+++ b/libavformat/oggenc.c
@@ -492,7 +492,7 @@ static int ogg_init(AVFormatContext *s)
         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
             if (st->codecpar->codec_id == AV_CODEC_ID_OPUS)
                 /* Opus requires a fixed 48kHz clock */
-                avpriv_set_pts_info(st, 64, 1, 48000);
+                avpriv_set_pts_info(st, 64, 1, 96000);
             else
                 avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
         }
diff --git a/libavformat/oggparseopus.c b/libavformat/oggparseopus.c
index ae4ff22c53..abf45b0f2b 100644
--- a/libavformat/oggparseopus.c
+++ b/libavformat/oggparseopus.c
@@ -71,10 +71,10 @@ static int parse_opus_header(AVFormatContext *avf, AVStream *st, struct ogg_stre
 
     memcpy(st->codecpar->extradata, packet, os->psize);
 
-    st->codecpar->sample_rate = 48000;
+    st->codecpar->sample_rate = 96000;
     st->codecpar->seek_preroll = av_rescale(OPUS_SEEK_PREROLL_MS,
                                             st->codecpar->sample_rate, 1000);
-    avpriv_set_pts_info(st, 64, 1, 48000);
+    avpriv_set_pts_info(st, 64, 1, 96000);
 
     priv->need_comments = 1;
 
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-01-09 22:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-09 22:16 [FFmpeg-devel] [PR] enable 96kHz support for libopus 1.6 (PR #21425) hnsteyding via ffmpeg-devel

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git