FFmpeg
channel_layout.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * audio channel layout utility functions
24  */
25 
26 #include <stdint.h>
27 
28 #include "avstring.h"
29 #include "avutil.h"
30 #include "channel_layout.h"
31 #include "bprint.h"
32 #include "common.h"
33 
34 struct channel_name {
35  const char *name;
36  const char *description;
37 };
38 
39 static const struct channel_name channel_names[] = {
40  [0] = { "FL", "front left" },
41  [1] = { "FR", "front right" },
42  [2] = { "FC", "front center" },
43  [3] = { "LFE", "low frequency" },
44  [4] = { "BL", "back left" },
45  [5] = { "BR", "back right" },
46  [6] = { "FLC", "front left-of-center" },
47  [7] = { "FRC", "front right-of-center" },
48  [8] = { "BC", "back center" },
49  [9] = { "SL", "side left" },
50  [10] = { "SR", "side right" },
51  [11] = { "TC", "top center" },
52  [12] = { "TFL", "top front left" },
53  [13] = { "TFC", "top front center" },
54  [14] = { "TFR", "top front right" },
55  [15] = { "TBL", "top back left" },
56  [16] = { "TBC", "top back center" },
57  [17] = { "TBR", "top back right" },
58  [29] = { "DL", "downmix left" },
59  [30] = { "DR", "downmix right" },
60  [31] = { "WL", "wide left" },
61  [32] = { "WR", "wide right" },
62  [33] = { "SDL", "surround direct left" },
63  [34] = { "SDR", "surround direct right" },
64  [35] = { "LFE2", "low frequency 2" },
65 };
66 
67 static const char *get_channel_name(int channel_id)
68 {
69  if (channel_id < 0 || channel_id >= FF_ARRAY_ELEMS(channel_names))
70  return NULL;
71  return channel_names[channel_id].name;
72 }
73 
74 static const struct {
75  const char *name;
77  uint64_t layout;
78 } channel_layout_map[] = {
79  { "mono", 1, AV_CH_LAYOUT_MONO },
80  { "stereo", 2, AV_CH_LAYOUT_STEREO },
81  { "2.1", 3, AV_CH_LAYOUT_2POINT1 },
82  { "3.0", 3, AV_CH_LAYOUT_SURROUND },
83  { "3.0(back)", 3, AV_CH_LAYOUT_2_1 },
84  { "4.0", 4, AV_CH_LAYOUT_4POINT0 },
85  { "quad", 4, AV_CH_LAYOUT_QUAD },
86  { "quad(side)", 4, AV_CH_LAYOUT_2_2 },
87  { "3.1", 4, AV_CH_LAYOUT_3POINT1 },
88  { "5.0", 5, AV_CH_LAYOUT_5POINT0_BACK },
89  { "5.0(side)", 5, AV_CH_LAYOUT_5POINT0 },
90  { "4.1", 5, AV_CH_LAYOUT_4POINT1 },
91  { "5.1", 6, AV_CH_LAYOUT_5POINT1_BACK },
92  { "5.1(side)", 6, AV_CH_LAYOUT_5POINT1 },
93  { "6.0", 6, AV_CH_LAYOUT_6POINT0 },
94  { "6.0(front)", 6, AV_CH_LAYOUT_6POINT0_FRONT },
95  { "hexagonal", 6, AV_CH_LAYOUT_HEXAGONAL },
96  { "6.1", 7, AV_CH_LAYOUT_6POINT1 },
97  { "6.1(back)", 7, AV_CH_LAYOUT_6POINT1_BACK },
98  { "6.1(front)", 7, AV_CH_LAYOUT_6POINT1_FRONT },
99  { "7.0", 7, AV_CH_LAYOUT_7POINT0 },
100  { "7.0(front)", 7, AV_CH_LAYOUT_7POINT0_FRONT },
101  { "7.1", 8, AV_CH_LAYOUT_7POINT1 },
102  { "7.1(wide)", 8, AV_CH_LAYOUT_7POINT1_WIDE_BACK },
103  { "7.1(wide-side)", 8, AV_CH_LAYOUT_7POINT1_WIDE },
104  { "octagonal", 8, AV_CH_LAYOUT_OCTAGONAL },
105  { "hexadecagonal", 16, AV_CH_LAYOUT_HEXADECAGONAL },
106  { "downmix", 2, AV_CH_LAYOUT_STEREO_DOWNMIX, },
107 };
108 
109 static uint64_t get_channel_layout_single(const char *name, int name_len)
110 {
111  int i;
112  char *end;
113  int64_t layout;
114 
115  for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++) {
116  if (strlen(channel_layout_map[i].name) == name_len &&
117  !memcmp(channel_layout_map[i].name, name, name_len))
118  return channel_layout_map[i].layout;
119  }
120  for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++)
121  if (channel_names[i].name &&
122  strlen(channel_names[i].name) == name_len &&
123  !memcmp(channel_names[i].name, name, name_len))
124  return (int64_t)1 << i;
125 
126  errno = 0;
127  i = strtol(name, &end, 10);
128 
129  if (!errno && (end + 1 - name == name_len && *end == 'c'))
131 
132  errno = 0;
133  layout = strtoll(name, &end, 0);
134  if (!errno && end - name == name_len)
135  return FFMAX(layout, 0);
136  return 0;
137 }
138 
139 uint64_t av_get_channel_layout(const char *name)
140 {
141  const char *n, *e;
142  const char *name_end = name + strlen(name);
143  int64_t layout = 0, layout_single;
144 
145  for (n = name; n < name_end; n = e + 1) {
146  for (e = n; e < name_end && *e != '+' && *e != '|'; e++);
147  layout_single = get_channel_layout_single(n, e - n);
148  if (!layout_single)
149  return 0;
150  layout |= layout_single;
151  }
152  return layout;
153 }
154 
155 int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels)
156 {
157  int nb = 0;
158  char *end;
159  uint64_t layout = av_get_channel_layout(name);
160 
161  if (layout) {
162  *channel_layout = layout;
164  return 0;
165  }
166 
167  nb = strtol(name, &end, 10);
168  if (!errno && *end == 'C' && *(end + 1) == '\0' && nb > 0 && nb < 64) {
169  *channel_layout = 0;
170  *nb_channels = nb;
171  return 0;
172  }
173 
174  return AVERROR(EINVAL);
175 }
176 
177 void av_bprint_channel_layout(struct AVBPrint *bp,
178  int nb_channels, uint64_t channel_layout)
179 {
180  int i;
181 
182  if (nb_channels <= 0)
184 
185  for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
187  channel_layout == channel_layout_map[i].layout) {
188  av_bprintf(bp, "%s", channel_layout_map[i].name);
189  return;
190  }
191 
192  av_bprintf(bp, "%d channels", nb_channels);
193  if (channel_layout) {
194  int i, ch;
195  av_bprintf(bp, " (");
196  for (i = 0, ch = 0; i < 64; i++) {
197  if ((channel_layout & (UINT64_C(1) << i))) {
198  const char *name = get_channel_name(i);
199  if (name) {
200  if (ch > 0)
201  av_bprintf(bp, "+");
202  av_bprintf(bp, "%s", name);
203  }
204  ch++;
205  }
206  }
207  av_bprintf(bp, ")");
208  }
209 }
210 
211 void av_get_channel_layout_string(char *buf, int buf_size,
212  int nb_channels, uint64_t channel_layout)
213 {
214  AVBPrint bp;
215 
216  av_bprint_init_for_buffer(&bp, buf, buf_size);
217  av_bprint_channel_layout(&bp, nb_channels, channel_layout);
218 }
219 
220 int av_get_channel_layout_nb_channels(uint64_t channel_layout)
221 {
222  return av_popcount64(channel_layout);
223 }
224 
226  int i;
227  for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
229  return channel_layout_map[i].layout;
230  return 0;
231 }
232 
233 int av_get_channel_layout_channel_index(uint64_t channel_layout,
234  uint64_t channel)
235 {
236  if (!(channel_layout & channel) ||
238  return AVERROR(EINVAL);
239  channel_layout &= channel - 1;
240  return av_get_channel_layout_nb_channels(channel_layout);
241 }
242 
243 const char *av_get_channel_name(uint64_t channel)
244 {
245  int i;
247  return NULL;
248  for (i = 0; i < 64; i++)
249  if ((1ULL<<i) & channel)
250  return get_channel_name(i);
251  return NULL;
252 }
253 
254 const char *av_get_channel_description(uint64_t channel)
255 {
256  int i;
258  return NULL;
259  for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++)
260  if ((1ULL<<i) & channel)
261  return channel_names[i].description;
262  return NULL;
263 }
264 
265 uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index)
266 {
267  int i;
268 
269  if (av_get_channel_layout_nb_channels(channel_layout) <= index)
270  return 0;
271 
272  for (i = 0; i < 64; i++) {
273  if ((1ULL << i) & channel_layout && !index--)
274  return 1ULL << i;
275  }
276  return 0;
277 }
278 
280  const char **name)
281 {
283  return AVERROR_EOF;
284  if (layout) *layout = channel_layout_map[index].layout;
285  if (name) *name = channel_layout_map[index].name;
286  return 0;
287 }
AV_CH_LAYOUT_7POINT0
#define AV_CH_LAYOUT_7POINT0
Definition: channel_layout.h:105
AV_CH_LAYOUT_6POINT1
#define AV_CH_LAYOUT_6POINT1
Definition: channel_layout.h:102
AV_CH_LAYOUT_7POINT1_WIDE_BACK
#define AV_CH_LAYOUT_7POINT1_WIDE_BACK
Definition: channel_layout.h:109
AV_CH_LAYOUT_5POINT0_BACK
#define AV_CH_LAYOUT_5POINT0_BACK
Definition: channel_layout.h:97
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
n
int n
Definition: avisynth_c.h:760
AV_CH_LAYOUT_HEXADECAGONAL
#define AV_CH_LAYOUT_HEXADECAGONAL
Definition: channel_layout.h:111
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
ch
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
av_get_channel_layout_string
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
Definition: channel_layout.c:211
AV_CH_LAYOUT_HEXAGONAL
#define AV_CH_LAYOUT_HEXAGONAL
Definition: channel_layout.h:101
AV_CH_LAYOUT_6POINT0_FRONT
#define AV_CH_LAYOUT_6POINT0_FRONT
Definition: channel_layout.h:100
AV_CH_LAYOUT_6POINT1_FRONT
#define AV_CH_LAYOUT_6POINT1_FRONT
Definition: channel_layout.h:104
av_get_channel_layout
uint64_t av_get_channel_layout(const char *name)
Return a channel layout id that matches name, or 0 if no match is found.
Definition: channel_layout.c:139
channel_name
Definition: channel_layout.c:34
channel_name::description
const char * description
Definition: channel_layout.c:36
AV_CH_LAYOUT_6POINT0
#define AV_CH_LAYOUT_6POINT0
Definition: channel_layout.h:99
channel_name::name
const char * name
Definition: channel_layout.c:35
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:86
AV_CH_LAYOUT_QUAD
#define AV_CH_LAYOUT_QUAD
Definition: channel_layout.h:94
description
Tag description
Definition: snow.txt:206
buf
void * buf
Definition: avisynth_c.h:766
av_bprint_channel_layout
void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout)
Append a description of a channel layout to a bprint buffer.
Definition: channel_layout.c:177
AV_CH_LAYOUT_7POINT0_FRONT
#define AV_CH_LAYOUT_7POINT0_FRONT
Definition: channel_layout.h:106
AV_CH_LAYOUT_STEREO_DOWNMIX
#define AV_CH_LAYOUT_STEREO_DOWNMIX
Definition: channel_layout.h:112
av_get_channel_name
const char * av_get_channel_name(uint64_t channel)
Get the name of a given channel.
Definition: channel_layout.c:243
name
const char * name
Definition: channel_layout.c:75
AV_CH_LAYOUT_2_1
#define AV_CH_LAYOUT_2_1
Definition: channel_layout.h:88
NULL
#define NULL
Definition: coverity.c:32
AV_CH_LAYOUT_5POINT1
#define AV_CH_LAYOUT_5POINT1
Definition: channel_layout.h:96
channel_names
static const struct channel_name channel_names[]
Definition: channel_layout.c:39
av_get_standard_channel_layout
int av_get_standard_channel_layout(unsigned index, uint64_t *layout, const char **name)
Get the value and name of a standard channel layout.
Definition: channel_layout.c:279
index
int index
Definition: gxfenc.c:89
av_get_channel_layout_nb_channels
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
Definition: channel_layout.c:220
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
AV_CH_LAYOUT_5POINT1_BACK
#define AV_CH_LAYOUT_5POINT1_BACK
Definition: channel_layout.h:98
AV_CH_LAYOUT_3POINT1
#define AV_CH_LAYOUT_3POINT1
Definition: channel_layout.h:90
av_bprint_init_for_buffer
void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size)
Init a print buffer using a pre-existing buffer.
Definition: bprint.c:85
AV_CH_LAYOUT_OCTAGONAL
#define AV_CH_LAYOUT_OCTAGONAL
Definition: channel_layout.h:110
AV_CH_LAYOUT_5POINT0
#define AV_CH_LAYOUT_5POINT0
Definition: channel_layout.h:95
bprint.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
AV_CH_LAYOUT_2POINT1
#define AV_CH_LAYOUT_2POINT1
Definition: channel_layout.h:87
av_channel_layout_extract_channel
uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index)
Get the channel with the given index in channel_layout.
Definition: channel_layout.c:265
common.h
av_get_channel_layout_channel_index
int av_get_channel_layout_channel_index(uint64_t channel_layout, uint64_t channel)
Get the index of a channel in channel_layout.
Definition: channel_layout.c:233
AV_CH_LAYOUT_7POINT1
#define AV_CH_LAYOUT_7POINT1
Definition: channel_layout.h:107
AV_CH_LAYOUT_4POINT1
#define AV_CH_LAYOUT_4POINT1
Definition: channel_layout.h:92
AV_CH_LAYOUT_7POINT1_WIDE
#define AV_CH_LAYOUT_7POINT1_WIDE
Definition: channel_layout.h:108
AV_CH_LAYOUT_SURROUND
#define AV_CH_LAYOUT_SURROUND
Definition: channel_layout.h:89
channel_layout_map
static const struct @284 channel_layout_map[]
layout
uint64_t layout
Definition: channel_layout.c:77
get_channel_layout_single
static uint64_t get_channel_layout_single(const char *name, int name_len)
Definition: channel_layout.c:109
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:94
av_get_channel_description
const char * av_get_channel_description(uint64_t channel)
Get the description of a given channel.
Definition: channel_layout.c:254
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
channel_layout.h
av_get_extended_channel_layout
int av_get_extended_channel_layout(const char *name, uint64_t *channel_layout, int *nb_channels)
Return a channel layout and the number of channels based on the specified name.
Definition: channel_layout.c:155
get_channel_name
static const char * get_channel_name(int channel_id)
Definition: channel_layout.c:67
avutil.h
av_get_default_channel_layout
int64_t av_get_default_channel_layout(int nb_channels)
Return default channel layout for a given number of channels.
Definition: channel_layout.c:225
AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_4POINT0
Definition: channel_layout.h:91
AV_CH_LAYOUT_6POINT1_BACK
#define AV_CH_LAYOUT_6POINT1_BACK
Definition: channel_layout.h:103
avstring.h
AV_CH_LAYOUT_2_2
#define AV_CH_LAYOUT_2_2
Definition: channel_layout.h:93
channel
channel
Definition: ebur128.h:39
nb_channels
int nb_channels
Definition: channel_layout.c:76