Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* Re: [FFmpeg-devel] [PATCH v2] libavcodec/mpegaudio_parser.c: differentiate MPEG audio dual mono
       [not found] ` <20241213063024.442272-1-scott.the.elm@gmail.com>
@ 2025-02-21  5:05   ` Scott Theisen
  0 siblings, 0 replies; only message in thread
From: Scott Theisen @ 2025-02-21  5:05 UTC (permalink / raw)
  To: ffmpeg-devel

On 12/13/24 01:30, Scott Theisen wrote:
> From: ulmus-scott <scott.the.elm@gmail.com>
>
> Defined in ISO/IEC 11172-3 and ISO/IEC 13818-3 as:
> dual channel mode [audio]: A mode, where two audio channels with independent
> programme contents (e.g. bilingual) are encoded within one bitstream. The
> coding process is the same as for the stereo mode.
>
> There is currently no way to signal that an audio channel is monophonic, i.e.
> that channel comprises the entirety of an audio signal, so two front center
> channels were chosen since AV_CH_LAYOUT_MONO is represented as a single
> front center channel.
> ---
>   libavcodec/audiotoolboxdec.c    |  4 ++--
>   libavcodec/mpegaudio_parser.c   | 19 ++++++++++++++++---
>   libavcodec/mpegaudiodecheader.c |  4 +++-
>   libavcodec/mpegaudiodecheader.h |  2 +-
>   tests/ref/fate/pva-demux        |  2 +-
>   5 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
> index 08203c5310..667d0f9ad0 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..6711163d03 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,20 @@ 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) {
> +                            // two independent monophonic audio channels in one bitstream
> +                            int ret = av_channel_layout_custom_init(&avctx->ch_layout, 2);
> +                            if (ret != 0) {
> +                                // parsers can't return error codes
> +                                avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
> +                                avctx->ch_layout.nb_channels = 2;
> +                            } else {
> +                                avctx->ch_layout.u.map[0].id = AV_CHAN_FRONT_CENTER;
> +                                avctx->ch_layout.u.map[1].id = AV_CHAN_FRONT_CENTER;
> +                            }
> +                        } else {
> +                            av_channel_layout_default(&avctx->ch_layout, channels);
> +                        }
>                           s1->duration      = frame_size;
>                           avctx->codec_id   = codec_id;
>                           if (s->no_bitrate || !avctx->bit_rate) {
> diff --git a/libavcodec/mpegaudiodecheader.c b/libavcodec/mpegaudiodecheader.c
> index ef63befbf4..5cbfdcb677 100644
> --- a/libavcodec/mpegaudiodecheader.c
> +++ b/libavcodec/mpegaudiodecheader.c
> @@ -117,7 +117,7 @@ int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
>       return 0;
>   }
>   
> -int ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, enum AVCodecID *codec_id)
> +int ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, enum AVCodecID *codec_id, int *dual_mono)
>   {
>       MPADecodeHeader s1, *s = &s1;
>   
> @@ -148,5 +148,7 @@ int ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *fr
>       *sample_rate = s->sample_rate;
>       *channels = s->nb_channels;
>       *bit_rate = s->bit_rate;
> +    *dual_mono = (s->mode == MPA_DUAL);
> +
>       return s->frame_size;
>   }
> diff --git a/libavcodec/mpegaudiodecheader.h b/libavcodec/mpegaudiodecheader.h
> index ed5d1f3b33..e599d287f7 100644
> --- a/libavcodec/mpegaudiodecheader.h
> +++ b/libavcodec/mpegaudiodecheader.h
> @@ -56,7 +56,7 @@ int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header);
>   /* useful helper to get MPEG audio stream info. Return -1 if error in
>      header, otherwise the coded frame size in bytes */
>   int ff_mpa_decode_header(uint32_t head, int *sample_rate,
> -                         int *channels, int *frame_size, int *bitrate, enum AVCodecID *codec_id);
> +                         int *channels, int *frame_size, int *bitrate, enum AVCodecID *codec_id, int *dual_mono);
>   
>   /* fast header check for resync */
>   static inline int ff_mpa_check_header(uint32_t header){
> diff --git a/tests/ref/fate/pva-demux b/tests/ref/fate/pva-demux
> index 5c0e1c1ea0..2749ea9f07 100644
> --- a/tests/ref/fate/pva-demux
> +++ b/tests/ref/fate/pva-demux
> @@ -7,7 +7,7 @@
>   #media_type 1: audio
>   #codec_id 1: mp2
>   #sample_rate 1: 48000
> -#channel_layout_name 1: stereo
> +#channel_layout_name 1: 2 channels (FC+FC)
>   1,          0,          0,     2160,      384, 0x071abcc8
>   1,       2160,       2160,     2160,      384, 0x31c9aee0
>   1,       4320,       4320,     2160,      384, 0xa50eaa94

Ping?  Rebased onto master cleanly.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

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

only message in thread, other threads:[~2025-02-21  5:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20241114043811.464328-1-scott.the.elm@gmail.com>
     [not found] ` <20241213063024.442272-1-scott.the.elm@gmail.com>
2025-02-21  5:05   ` [FFmpeg-devel] [PATCH v2] libavcodec/mpegaudio_parser.c: differentiate MPEG audio dual mono Scott Theisen

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