[FFmpeg-devel] Correct libvorbis.c behaviour with >2 channels

Justin Ruggles justin.ruggles
Thu Jun 3 00:08:55 CEST 2010


James Darnley wrote:

> On 2 June 2010 11:03, Robert Swain <robert.swain at gmail.com> wrote:
>> On 2 June 2010 09:19, Martin Storsj? <martin at martin.st> wrote:
>>> On Wed, 2 Jun 2010, Michael Niedermayer wrote:
>>>
>>>> On Fri, May 28, 2010 at 07:57:54PM +0200, James Darnley wrote:
>>>>> I fail hard at sending out correct patches.  New one, git format-patch
>>>>> From 1325bfbc5240cec90937f3d26f2663073050ccda Mon Sep 17 00:00:00 2001
>>>>> From: James Darnley <james.darnley at gmail.com>
>>>>> Date: Fri, 28 May 2010 14:36:53 +0200
>>>>> Subject: [PATCH 2/3] Fix libvorbis encoding with more than 2 channels
>>>>>
>>>>> ---
>>>>>  libavcodec/Makefile    |    2 +-
>>>>>  libavcodec/libvorbis.c |   12 +++++-------
>>>>>  2 files changed, 6 insertions(+), 8 deletions(-)
>>>> if the bug and fix are confirmed then this should be ok
>>> The actual bug with more than one channel is obviously fixed by this, but
>>> this also remaps the channels, and I'm not really sure if this is the
>>> correct way.
>>>
>>> Robert, Alex, or anyone else that are familiar with mapping of channels in
>>> these kinds of codecs - care to give a comment on this?
>> I don't think this is correct. What you're trying to do is map from
>> wave format extensible order to Vorbis order. The first few channel
>> layouts match, coincidentally. But, when you get to 5.1 and beyond
>> there are problems. For 5.1 the input wave format extensible order
>> will be:
>>
>> FL FR FC LFE RL RR
>>
>> If you use the ff_vorbis_channel_layout_offsets table as you are:
>>
>> { 0, 2, 1, 5, 3, 4, },
>>
>> which gives:
>>
>> FL FC FR RR LFE RL
>>
>> and what we actually want (Vorbis order for 5.1):
>>
>> FL FC FR RL RR LFE
>>
>> You don't need to re-apply the mapping but rather apply the inverse which is:
>>
>> { 0, 2, 1, 4, 5, 3, },
>>
>> This can be constructed from the decoder mapping table by noting the
>> position of a channel number in the _offsets array[1]. Or we could
>> just have a table for encoding.
>>
> 
> Where would you like me to put a new table with the correct input
> mapping?  Is vorbis_data.c, next to the existing _offset array okay?
> If the vorbis encoder ever supports more than 2 channels this would be
> a logical place to have it.
> 
> I didn't notice the incorrect mapping because I only have stereo headphones.


There are some patches on the issue tracker that might be useful.

https://roundup.ffmpeg.org/issue1325

This was only for 5.1 channels though.  The vorbis spec has been
modified since then to support up to 7.1 I think... or more?

-Justin





More information about the ffmpeg-devel mailing list