[FFmpeg-devel] [PATCH] lavc: export flag for MPEG audio dual channel

Scott Theisen scott.the.elm at gmail.com
Thu Sep 22 04:04:16 EEST 2022


On 9/21/22 15:51, James Almer wrote:
> On 9/21/2022 4:44 PM, Rémi Denis-Courmont wrote:
>> Le keskiviikkona 21. syyskuuta 2022, 22.26.11 EEST Scott Theisen a 
>> écrit :
>>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>>> index 7db5d1b1c5..bcf3a845a8 100644
>>> --- a/libavcodec/avcodec.h
>>> +++ b/libavcodec/avcodec.h
>>> @@ -2076,6 +2076,17 @@ typedef struct AVCodecContext {
>>>        *             The decoder can then override during decoding 
>>> as needed.
>>> */
>>>       AVChannelLayout ch_layout;
>>> +
>>> +    /**
>>> +     * Audio only.  This flag is set when MPEG audio mode dual 
>>> channel has
>>> been detected. +     * This signals that the audio is two 
>>> independent mono
>>> channels. +     *
>>> +     * 0 normally, 1 if dual channel flag is set.
>>> +     *
>>> +     * - encoding: currently unused (functionally equivalent to 
>>> stereo,
>>> patch welcome) +     * - decoding: set by lavc
>>> +     */
>>> +    int mpeg_audio_mode_dual_channel;
>>>   } AVCodecContext;
>>
>> I agree that the dual mono flag should be exposed to the application 
>> somehow,
>> but isn't this a slient ABI break?
>
> It's not a break, but it's overkill for what's essentially a flag.

This is how MythTV customized FFmpeg (in 2006) for this and this way was 
probably the easiest.  It /is/ a flag, so maybe adding an int as a 
bitset instead of as a bool so other flags could be added if necessary?

>
> The proper way to do this would be to signal such a layout as an 
> actual channel layout, using a custom order one where both channels 
> are set as Front Center. But i don't know if until the old channel 
> layout API fields are gone we should have decoders setting something 
> only new API users will understand. Old API field users would look at 
> channels and see a 2, and channel_layout and see it's empty, but then 
> old and new API values would technically conflict, so I'd like to hear 
> some opinions.

I'm not very familiar with either channel layout API, but the audio is 
encoded identically to stereo other than the flag, so could we add 
another entry, e.g. AV_CHANNEL_ORDER_MONO, to the `enum AVChannelOrder` 
to signify that each channel is independent, but is otherwise identical 
to AV_CHANNEL_ORDER_NATIVE?

>
> An alternative could be signaling this using an 
> AVFormatContext.metadata entry called "dualmono", and ensuring the 
> channel layout is 2 channels of UNSPEC order.
>

AVFormatContext sounds like the wrong place, since there could, in 
theory, be multiple audio streams utilizing or not dual mono audio, 
which could also be switching back and forth between using dual mono and 
not.

Regards,

Scott


More information about the ffmpeg-devel mailing list