[FFmpeg-devel] [PATCH] avcodec/libopusenc: allow encoding channel mapping 2
Felicia Lim
flim at google.com
Thu Aug 9 01:41:21 EEST 2018
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
>>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-avcodec-libopusenc-Fix-warning-when-encoding-ambison.patch
Type: text/x-patch
Size: 2031 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180808/d0dbdeed/attachment.bin>
More information about the ffmpeg-devel
mailing list