When attempting to upstream this MythTV change in September 2022,
it was recommended to
use AV_CHANNEL_ORDER_CUSTOM with two AV_CHAN_FRONT_CENTER
channels. See
https://patchwork.ffmpeg.org/project/ffmpeg/
patch/20220921192611.3241-1-scott.the....@gmail.com/
---
libavcodec/audiotoolboxdec.c | 4 ++--
libavcodec/mpegaudio_parser.c | 12 +++++++++---
libavcodec/mpegaudiodecheader.c | 4 +++-
libavcodec/mpegaudiodecheader.h | 2 +-
tests/ref/fate/pva-demux | 2 +-
5 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/
audiotoolboxdec.c
index 0f7ce8e4eb..d279d7bbc4 100644
--- a/libavcodec/audiotoolboxdec.c
+++ b/libavcodec/audiotoolboxdec.c
@@ -346,10 +346,10 @@ static av_cold int
ffat_create_decoder(AVCodecContext *avctx,
avctx->codec_id == AV_CODEC_ID_MP2 ||
avctx->codec_id == AV_CODEC_ID_MP3)) {
enum AVCodecID codec_id;
- int bit_rate;
+ int bit_rate, dual_mono;
if (ff_mpa_decode_header(AV_RB32(pkt->data), &avctx-
>sample_rate,
&in_format.mChannelsPerFrame, &avctx->frame_size,
- &bit_rate, &codec_id) < 0)
+ &bit_rate, &codec_id,
&dual_mono) < 0)
return AVERROR_INVALIDDATA;
avctx->bit_rate = bit_rate;
in_format.mSampleRate = avctx->sample_rate;
diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/
mpegaudio_parser.c
index d54366f10a..d1a4ee6434 100644
--- a/libavcodec/mpegaudio_parser.c
+++ b/libavcodec/mpegaudio_parser.c
@@ -65,12 +65,12 @@ static int
mpegaudio_parse(AVCodecParserContext *s1,
}
}else{
while(i<buf_size){
- int ret, sr, channels, bit_rate, frame_size;
+ int ret, sr, channels, bit_rate, frame_size,
dual_mono;
enum AVCodecID codec_id = avctx->codec_id;
state= (state<<8) + buf[i++];
- ret = ff_mpa_decode_header(state, &sr, &channels,
&frame_size, &bit_rate, &codec_id);
+ ret = ff_mpa_decode_header(state, &sr, &channels,
&frame_size, &bit_rate, &codec_id, &dual_mono);
if (ret < 4) {
if (i > 4)
s->header_count = -2;
@@ -85,7 +85,13 @@ static int mpegaudio_parse(AVCodecParserContext
*s1,
if (s->header_count > header_threshold) {
avctx->sample_rate= sr;
av_channel_layout_uninit(&avctx->ch_layout);
- av_channel_layout_default(&avctx- >ch_layout, channels);
+ if (dual_mono) {
+ av_channel_layout_custom_init(&avctx- >ch_layout, 2);
+ avctx->ch_layout.u.map[0].id = AV_CHAN_FRONT_CENTER;
+ avctx->ch_layout.u.map[1].id = AV_CHAN_FRONT_CENTER;