Lines Matching refs:channel_layout

31 #include "channel_layout.h"
253 int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels)
260 *channel_layout = layout;
267 *channel_layout = 0;
276 int nb_channels, uint64_t channel_layout)
281 nb_channels = av_get_channel_layout_nb_channels(channel_layout);
285 channel_layout == channel_layout_map[i].layout.u.mask) {
291 if (channel_layout) {
295 if ((channel_layout & (UINT64_C(1) << i))) {
310 int nb_channels, uint64_t channel_layout)
315 av_bprint_channel_layout(&bp, nb_channels, channel_layout);
318 int av_get_channel_layout_nb_channels(uint64_t channel_layout)
320 return av_popcount64(channel_layout);
331 int av_get_channel_layout_channel_index(uint64_t channel_layout,
334 if (!(channel_layout & channel) ||
337 channel_layout &= channel - 1;
338 return av_get_channel_layout_nb_channels(channel_layout);
363 uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index)
367 if (av_get_channel_layout_nb_channels(channel_layout) <= index)
371 if ((1ULL << i) & channel_layout && !index--)
389 int av_channel_layout_from_mask(AVChannelLayout *channel_layout,
395 channel_layout->order = AV_CHANNEL_ORDER_NATIVE;
396 channel_layout->nb_channels = av_popcount64(mask);
397 channel_layout->u.mask = mask;
402 int av_channel_layout_from_string(AVChannelLayout *channel_layout,
415 *channel_layout = channel_layout_map[i].layout;
432 channel_layout->order = AV_CHANNEL_ORDER_AMBISONIC;
433 channel_layout->nb_channels = (order + 1) * (order + 1);
439 if (extra.nb_channels >= INT_MAX - channel_layout->nb_channels) {
445 channel_layout->u.mask = extra.u.mask;
447 channel_layout->order = AV_CHANNEL_ORDER_CUSTOM;
448 channel_layout->u.map =
449 av_calloc(channel_layout->nb_channels + extra.nb_channels,
450 sizeof(*channel_layout->u.map));
451 if (!channel_layout->u.map) {
456 for (i = 0; i < channel_layout->nb_channels; i++)
457 channel_layout->u.map[i].id = AV_CHAN_AMBISONIC_BASE + i;
464 channel_layout->u.map[channel_layout->nb_channels + i].id = ch;
467 av_strlcpy(channel_layout->u.map[channel_layout->nb_channels + i].name,
469 sizeof(channel_layout->u.map[channel_layout->nb_channels + i].name));
472 channel_layout->nb_channels += extra.nb_channels;
542 av_channel_layout_from_mask(channel_layout, mask);
555 channel_layout->u.map = av_calloc(channels, sizeof(*channel_layout->u.map));
556 if (!channel_layout->u.map) {
561 channel_layout->order = AV_CHANNEL_ORDER_CUSTOM;
562 channel_layout->nb_channels = channels;
569 av_freep(&channel_layout->u.map);
577 channel_layout->u.map[idx].id = i;
579 av_strlcpy(channel_layout->u.map[idx].name, chname, sizeof(channel_layout->u.map[idx].name));
586 channel_layout->u.map[idx].id = strtol(p, NULL, 0);
588 av_strlcpy(channel_layout->u.map[idx].name, chname, sizeof(channel_layout->u.map[idx].name));
605 av_channel_layout_from_mask(channel_layout, mask);
614 av_channel_layout_default(channel_layout, channels);
615 if (channel_layout->order == AV_CHANNEL_ORDER_NATIVE)
622 channel_layout->order = AV_CHANNEL_ORDER_UNSPEC;
623 channel_layout->nb_channels = channels;
630 void av_channel_layout_uninit(AVChannelLayout *channel_layout)
632 if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM)
633 av_freep(&channel_layout->u.map);
634 memset(channel_layout, 0, sizeof(*channel_layout));
655 static int ambisonic_order(const AVChannelLayout *channel_layout)
660 if (channel_layout->order == AV_CHANNEL_ORDER_AMBISONIC)
661 highest_ambi = channel_layout->nb_channels - av_popcount64(channel_layout->u.mask) - 1;
663 const AVChannelCustom *map = channel_layout->u.map;
664 av_assert0(channel_layout->order == AV_CHANNEL_ORDER_CUSTOM);
666 for (i = 0; i < channel_layout->nb_channels; i++) {
698 static int try_describe_ambisonic(AVBPrint *bp, const AVChannelLayout *channel_layout)
701 int order = ambisonic_order(channel_layout);
709 if (nb_ambi_channels < channel_layout->nb_channels) {
712 if (channel_layout->order == AV_CHANNEL_ORDER_AMBISONIC) {
714 extra.nb_channels = av_popcount64(channel_layout->u.mask);
715 extra.u.mask = channel_layout->u.mask;
718 extra.nb_channels = channel_layout->nb_channels - nb_ambi_channels;
719 extra.u.map = channel_layout->u.map + nb_ambi_channels;
730 int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout,
735 switch (channel_layout->order) {
738 if (channel_layout->u.mask == channel_layout_map[i].layout.u.mask) {
744 if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM) {
745 int res = try_describe_ambisonic(bp, channel_layout);
749 if (channel_layout->nb_channels)
750 av_bprintf(bp, "%d channels (", channel_layout->nb_channels);
751 for (i = 0; i < channel_layout->nb_channels; i++) {
752 enum AVChannel ch = av_channel_layout_channel_from_index(channel_layout, i);
757 if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM &&
758 channel_layout->u.map[i].name[0])
759 av_bprintf(bp, "@%s", channel_layout->u.map[i].name);
761 if (channel_layout->nb_channels) {
767 av_bprintf(bp, "%d channels", channel_layout->nb_channels);
770 return try_describe_ambisonic(bp, channel_layout);
776 int av_channel_layout_describe(const AVChannelLayout *channel_layout,
786 ret = av_channel_layout_describe_bprint(channel_layout, &bp);
794 av_channel_layout_channel_from_index(const AVChannelLayout *channel_layout,
799 if (idx >= channel_layout->nb_channels)
802 switch (channel_layout->order) {
804 return channel_layout->u.map[idx].id;
806 int ambi_channels = channel_layout->nb_channels - av_popcount64(channel_layout->u.mask);
814 if ((1ULL << i) & channel_layout->u.mask && !idx--)
823 av_channel_layout_channel_from_string(const AVChannelLayout *channel_layout,
826 int index = av_channel_layout_index_from_string(channel_layout, str);
831 return av_channel_layout_channel_from_index(channel_layout, index);
834 int av_channel_layout_index_from_channel(const AVChannelLayout *channel_layout,
842 switch (channel_layout->order) {
844 for (i = 0; i < channel_layout->nb_channels; i++)
845 if (channel_layout->u.map[i].id == channel)
850 uint64_t mask = channel_layout->u.mask;
851 int ambi_channels = channel_layout->nb_channels - av_popcount64(mask);
852 if (channel_layout->order == AV_CHANNEL_ORDER_AMBISONIC &&
868 int av_channel_layout_index_from_string(const AVChannelLayout *channel_layout,
874 switch (channel_layout->order) {
887 for (int i = 0; chname && i < channel_layout->nb_channels; i++) {
888 if (!strcmp(chname, channel_layout->u.map[i].name) &&
889 (ch == AV_CHAN_NONE || ch == channel_layout->u.map[i].id))
898 return av_channel_layout_index_from_channel(channel_layout, ch);
904 int av_channel_layout_check(const AVChannelLayout *channel_layout)
906 if (channel_layout->nb_channels <= 0)
909 switch (channel_layout->order) {
911 return av_popcount64(channel_layout->u.mask) == channel_layout->nb_channels;
913 if (!channel_layout->u.map)
915 for (int i = 0; i < channel_layout->nb_channels; i++) {
916 if (channel_layout->u.map[i].id == AV_CHAN_NONE)
922 return av_popcount64(channel_layout->u.mask) < channel_layout->nb_channels;
986 uint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout,
992 switch (channel_layout->order) {
995 return channel_layout->u.mask & mask;
998 if (mask & (1ULL << i) && av_channel_layout_index_from_channel(channel_layout, i) >= 0)