[FFmpeg-devel] [PATCH] avcodec/libopusenc: allow encoding channel mapping 2

Felicia Lim flim at google.com
Tue Nov 27 12:13:54 EET 2018


Friendly ping. Please let me know if there are any changes I should make to
this patch?

Thanks!
Felicia



On Thu, Aug 9, 2018 at 6:41 AM Felicia Lim <flim at google.com> wrote:

> I've attached the patch with the updated description, please let me know
> if I should make any other changes.
>
> Thanks,
> Felicia
>
>
> On Mon, Jul 30, 2018 at 10:50 AM Felicia Lim <flim at google.com> wrote:
>
>> On Sat, Jul 28, 2018 at 10:46 AM Rostislav Pehlivanov <
>> atomnuker at gmail.com> wrote:
>>
>>> On 27 July 2018 at 20:44, Felicia Lim <flim-at-google.com at ffmpeg.org>
>>> wrote:
>>>
>>> > ---
>>> >  libavcodec/libopusenc.c | 22 ++++++++++++++++++++++
>>> >  1 file changed, 22 insertions(+)
>>> >
>>> > diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
>>> > index 4ae81b0bb2..6b450ec317 100644
>>> > --- a/libavcodec/libopusenc.c
>>> > +++ b/libavcodec/libopusenc.c
>>> > @@ -27,6 +27,7 @@
>>> >  #include "bytestream.h"
>>> >  #include "internal.h"
>>> >  #include "libopus.h"
>>> > +#include "mathops.h"
>>> >  #include "vorbis.h"
>>> >  #include "audio_frame_queue.h"
>>> >
>>> > @@ -200,6 +201,21 @@ static int
>>> libopus_check_vorbis_layout(AVCodecContext
>>> > *avctx, int mapping_family
>>> >      return 0;
>>> >  }
>>> >
>>> > +static int libopus_check_ambisonics_channels(AVCodecContext *avctx) {
>>> > +    int channels = avctx->channels;
>>> > +    int ambisonic_order = ff_sqrt(channels) - 1;
>>> > +    if (channels != ((ambisonic_order + 1) * (ambisonic_order + 1)) &&
>>> > +        channels != ((ambisonic_order + 1) * (ambisonic_order + 1) +
>>> 2)) {
>>> > +        av_log(avctx, AV_LOG_ERROR,
>>> > +               "Ambisonics coding is only specified for channel
>>> counts"
>>> > +               " which can be written as (n + 1)^2 or (n + 1)^2 + 2"
>>> > +               " for nonnegative integer n\n");
>>> > +        return AVERROR_INVALIDDATA;
>>> > +    }
>>> > +
>>> > +    return 0;
>>> > +}
>>> > +
>>> >  static int libopus_validate_layout_and_get_channel_map(
>>> >          AVCodecContext *avctx,
>>> >          int mapping_family,
>>> > @@ -231,6 +247,12 @@ static int libopus_validate_layout_and_
>>> > get_channel_map(
>>> >              channel_map =
>>> ff_vorbis_channel_layout_offsets[avctx->channels
>>> > - 1];
>>> >          }
>>> >          break;
>>> > +    case 2:
>>> > +        ret = libopus_check_max_channels(avctx, 227);
>>> > +        if (ret == 0) {
>>> > +            ret = libopus_check_ambisonics_channels(avctx);
>>> > +        }
>>> >
>>>
>>> No brackets needed, also if (ret) looks better imo.
>>>
>>
>> Thanks for reviewing. Would this change would break with the style
>> elsewhere in this function? I'm happy to change if you still think I should
>> do it.
>>
>> I also just realized the patch description should be "Remove warning when
>> trying to encode channel mapping 2": it already encodes even without this
>> patch. Will send an update after the above comment is resolved.
>>
>>
>>> Does libopus understand channel mapping 2 as ambisonics? What about the
>>> libopus_generic_encoder_() API? Doesn't that need to be used to encode
>>> ambisonics, like the patch by Drew did?
>>>
>>
>> Yes, libopus also understands channel mapping 2 as ambisonics by default
>> now.
>>
>> Ch map 2 uses the normal opus_multistream_encode(), so no further changes
>> are needed. On the other hand, ch map 3 uses the new
>> opus_projection_encode(), hence Drew's introduction of
>> libopus_generic_encoder_() to handle the switch as needed.
>>
>>
>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>


More information about the ffmpeg-devel mailing list