Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
audio/owntone: Circumvent ffmpeg 6 ALAC encoding problem
- Loading branch information
Dirk Meyer
authored and
Dirk Meyer
committed
Aug 19, 2023
1 parent
fd670f7
commit c87a8f6
Showing
2 changed files
with
44 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
From 941fab9023f0af19f178771effd2a73865e849ba Mon Sep 17 00:00:00 2001 | ||
From: ejurgensen <espenjurgensen@gmail.com> | ||
Date: Thu, 17 Aug 2023 23:09:41 +0200 | ||
Subject: [PATCH] [xcode] Circumvent ffmpeg 6 ALAC encoding problem | ||
|
||
The default ffmpeg ALAC encoder, "alac", requires fixed frames of size 4096, | ||
but the Airplay 2 implementation feeds it with frames of size 352. Before | ||
ffmpeg 6 this worked, but not any more. Seems a frame size check has been | ||
added. | ||
|
||
This commit doesn't fix this, but circumvents the ffmpeg error by modifying the | ||
frame size that ffmpeg checks. | ||
|
||
Fixes issue #1640 | ||
|
||
--- src/transcode.c.orig 2022-01-29 16:41:27 UTC | ||
+++ src/transcode.c | ||
@@ -42,6 +42,8 @@ | ||
#include "misc.h" | ||
#include "transcode.h" | ||
|
||
+#define USE_ALAC_FRAME_SIZE_HACK (LIBAVCODEC_VERSION_MAJOR > 59) || ((LIBAVCODEC_VERSION_MAJOR == 59) && (LIBAVCODEC_VERSION_MINOR > 31)) | ||
+ | ||
// Interval between ICY metadata checks for streams, in seconds | ||
#define METADATA_ICY_INTERVAL 5 | ||
// Maximum number of streams in a file that we will accept | ||
@@ -506,6 +508,16 @@ stream_add(struct encode_ctx *ctx, struct stream_ctx * | ||
avcodec_free_context(&s->codec); | ||
return -1; | ||
} | ||
+ | ||
+ // airplay.c "misuses" the ffmpeg alac encoder in that it pushes frames with | ||
+ // 352 samples even though the encoder wants 4096 (and doesn't have variable | ||
+ // frame capability). This worked with no issues until ffmpeg 6, where it | ||
+ // seems a frame size check was added. The below circumvents the check, but is | ||
+ // dirty because we shouldn't be writing to this data element. | ||
+#if USE_ALAC_FRAME_SIZE_HACK | ||
+ if (codec_id == AV_CODEC_ID_ALAC) | ||
+ s->codec->frame_size = 352; | ||
+#endif | ||
// Copy the codec parameters we just set to the stream, so the muxer knows them | ||
ret = avcodec_parameters_from_context(s->stream->codecpar, s->codec); |