This patch contains the following commits:
avplay: Support the new channel layout API
avconv: Support the new channel layout API
tools: Update to the new channel layout API
examples: Update to the new channel layout API
---
avtools/avconv.c | 30 +++++++-------------------
avtools/avconv.h | 8 +++----
avtools/avconv_filter.c | 44 ++++++++++++++++++++++++++++++--------
avtools/avconv_opt.c | 48 ++++++++++++++++++++++++------------------
avtools/avplay.c | 50 +++++++++++++++++++++++---------------------
avtools/cmdutils.c | 15 +++++++++++--
avtools/cmdutils.h | 8 -------
doc/examples/decode_audio.c | 2 +-
doc/examples/encode_audio.c | 36 ++++++++++++++++++-------------
doc/examples/filter_audio.c | 11 +++++-----
doc/examples/output.c | 30 ++++++++++++++++++--------
doc/examples/transcode_aac.c | 29 +++++++++++++++----------
tools/graph2dot.c | 7 +++----
tools/ismindex.c | 2 +-
tools/sidxindex.c | 2 +-
15 files changed, 185 insertions(+), 137 deletions(-)
diff --git a/avtools/avconv.c b/avtools/avconv.c
index a1427e0cb4..904ea82de8 100644
--- a/avtools/avconv.c
+++ b/avtools/avconv.c
@@ -163,7 +163,7 @@ static void avconv_cleanup(int ret)
for (j = 0; j < fg->nb_outputs; j++) {
av_freep(&fg->outputs[j]->name);
av_freep(&fg->outputs[j]->formats);
- av_freep(&fg->outputs[j]->channel_layouts);
+ av_freep(&fg->outputs[j]->ch_layouts);
av_freep(&fg->outputs[j]->sample_rates);
av_freep(&fg->outputs[j]);
}
@@ -1209,7 +1209,8 @@ static int ifilter_send_frame(InputFilter *ifilter,
AVFrame *frame)
switch (ifilter->ist->st->codecpar->codec_type) {
case AVMEDIA_TYPE_AUDIO:
need_reinit |= ifilter->sample_rate != frame->sample_rate ||
- ifilter->channel_layout != frame->ch_layout.u.mask;
+ av_channel_layout_compare(&ifilter->ch_layout,
+ &frame->ch_layout);
break;
case AVMEDIA_TYPE_VIDEO:
need_reinit |= ifilter->width != frame->width ||
@@ -1322,24 +1323,6 @@ static int decode(AVCodecContext *avctx, AVFrame *frame,
int *got_frame, AVPacke
return 0;
}
-int guess_input_channel_layout(InputStream *ist)
-{
- AVCodecContext *dec = ist->dec_ctx;
-
- if (!dec->channel_layout) {
- char layout_name[256];
-
- dec->channel_layout = av_get_default_channel_layout(dec->channels);
- if (!dec->channel_layout)
- return 0;
- av_get_channel_layout_string(layout_name, sizeof(layout_name),
- dec->channels, dec->channel_layout);
- av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
- "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
- }
- return 1;
-}
-
static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output,
int *decode_failed)
{
@@ -1982,6 +1965,7 @@ static int init_output_stream_encode(OutputStream *ost)
InputStream *ist = get_input_stream(ost);
AVCodecContext *enc_ctx = ost->enc_ctx;
AVCodecContext *dec_ctx = NULL;
+ int ret;
set_encoder_id(output_files[ost->file_index], ost);
@@ -1998,8 +1982,10 @@ static int init_output_stream_encode(OutputStream *ost)
case AVMEDIA_TYPE_AUDIO:
enc_ctx->sample_fmt = ost->filter->filter->inputs[0]->format;
enc_ctx->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
- enc_ctx->channel_layout =
ost->filter->filter->inputs[0]->ch_layout.u.mask;
- enc_ctx->channels =
av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
+ ret = av_channel_layout_copy(&enc_ctx->ch_layout,
+
&ost->filter->filter->inputs[0]->ch_layout);
+ if (ret < 0)
+ return ret;
enc_ctx->time_base = (AVRational){ 1, enc_ctx->sample_rate };
break;
case AVMEDIA_TYPE_VIDEO:
diff --git a/avtools/avconv.h b/avtools/avconv.h
index 4c699333a5..2d3a77ba65 100644
--- a/avtools/avconv.h
+++ b/avtools/avconv.h
@@ -220,7 +220,7 @@ typedef struct InputFilter {
AVRational sample_aspect_ratio;
int sample_rate;
- uint64_t channel_layout;
+ AVChannelLayout ch_layout;
AVBufferRef *hw_frames_ctx;
@@ -242,11 +242,11 @@ typedef struct OutputFilter {
AVRational frame_rate;
int format;
int sample_rate;
- uint64_t channel_layout;
+ AVChannelLayout ch_layout;
// those are only set if no format is specified and the encoder gives us
multiple options
int *formats;
- uint64_t *channel_layouts;
+ AVChannelLayout *ch_layouts;
int *sample_rates;
} OutputFilter;
@@ -499,8 +499,6 @@ void opt_output_file(void *optctx, const char *filename);
void assert_avoptions(AVDictionary *m);
-int guess_input_channel_layout(InputStream *ist);
-
int configure_filtergraph(FilterGraph *fg);
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter,
AVFilterInOut *out);
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist);
diff --git a/avtools/avconv_filter.c b/avtools/avconv_filter.c
index 7df64c647a..30e95a23a5 100644
--- a/avtools/avconv_filter.c
+++ b/avtools/avconv_filter.c
@@ -73,8 +73,30 @@ DEF_CHOOSE_FORMAT(sample_fmts, enum AVSampleFormat, format,
formats,
DEF_CHOOSE_FORMAT(sample_rates, int, sample_rate, sample_rates, 0,
GET_SAMPLE_RATE_NAME)
-DEF_CHOOSE_FORMAT(channel_layouts, uint64_t, channel_layout, channel_layouts,
0,
- GET_CH_LAYOUT_NAME)
+static char *choose_channel_layouts(OutputFilter *ofilter)
+{
+ if (av_channel_layout_check(&ofilter->ch_layout)) {
+ return av_channel_layout_describe(&ofilter->ch_layout);
+ } else if (ofilter->ch_layouts) {
+ const AVChannelLayout *p;
+ AVIOContext *s = NULL;
+ uint8_t *ret;
+ int len;
+
+ if (avio_open_dyn_buf(&s) < 0)
+ exit(1);
+
+ for (p = ofilter->ch_layouts; av_channel_layout_check(p); p++) {
+ char *chlstr = av_channel_layout_describe(p);
+ avio_printf(s, "%s|", chlstr);
+ av_free(chlstr);
+ }
+ len = avio_close_dyn_buf(s, &ret);
+ ret[len - 1] = 0;
+ return ret;
+ } else
+ return NULL;
+}
int init_simple_filtergraph(InputStream *ist, OutputStream *ost)
{
@@ -391,7 +413,6 @@ static int configure_output_audio_filter(FilterGraph *fg,
OutputFilter *ofilter,
{
OutputStream *ost = ofilter->ost;
OutputFile *of = output_files[ost->file_index];
- AVCodecContext *codec = ost->enc_ctx;
AVFilterContext *last_filter = out->filter_ctx;
int pad_idx = out->pad_idx;
char *sample_fmts, *sample_rates, *channel_layouts;
@@ -406,9 +427,6 @@ static int configure_output_audio_filter(FilterGraph *fg,
OutputFilter *ofilter,
if (ret < 0)
return ret;
- if (codec->channels && !codec->channel_layout)
- codec->channel_layout = av_get_default_channel_layout(codec->channels);
-
sample_fmts = choose_sample_fmts(ofilter);
sample_rates = choose_sample_rates(ofilter);
channel_layouts = choose_channel_layouts(ofilter);
@@ -591,7 +609,9 @@ static int configure_input_audio_filter(FilterGraph *fg,
InputFilter *ifilter,
par->time_base = (AVRational){ 1, ifilter->sample_rate };
par->sample_rate = ifilter->sample_rate;
par->format = ifilter->format;
- av_channel_layout_from_mask(&par->ch_layout, ifilter->channel_layout);
+ ret = av_channel_layout_copy(&par->ch_layout, &ifilter->ch_layout);
+ if (ret < 0)
+ return ret;
ret = av_buffersrc_parameters_set(ifilter->filter, par);
av_freep(&par);
@@ -758,7 +778,9 @@ int configure_filtergraph(FilterGraph *fg)
ofilter->height = link->h;
ofilter->sample_rate = link->sample_rate;
- ofilter->channel_layout = link->ch_layout.u.mask;
+ ret = av_channel_layout_copy(&ofilter->ch_layout, &link->ch_layout);
+ if (ret < 0)
+ return ret;
}
for (i = 0; i < fg->nb_inputs; i++) {
@@ -789,6 +811,8 @@ fail:
int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)
{
+ int ret;
+
av_buffer_unref(&ifilter->hw_frames_ctx);
ifilter->format = frame->format;
@@ -798,7 +822,9 @@ int ifilter_parameters_from_frame(InputFilter *ifilter,
const AVFrame *frame)
ifilter->sample_aspect_ratio = frame->sample_aspect_ratio;
ifilter->sample_rate = frame->sample_rate;
- ifilter->channel_layout = frame->ch_layout.u.mask;
+ ret = av_channel_layout_copy(&ifilter->ch_layout, &frame->ch_layout);
+ if (ret < 0)
+ return ret;
if (frame->hw_frames_ctx) {
ifilter->hw_frames_ctx = av_buffer_ref(frame->hw_frames_ctx);
diff --git a/avtools/avconv_opt.c b/avtools/avconv_opt.c
index 9076b74e38..27373fe1f8 100644
--- a/avtools/avconv_opt.c
+++ b/avtools/avconv_opt.c
@@ -662,8 +662,6 @@ static void add_input_streams(OptionsContext *o,
AVFormatContext *ic)
break;
case AVMEDIA_TYPE_AUDIO:
- guess_input_channel_layout(ist);
- break;
case AVMEDIA_TYPE_DATA:
case AVMEDIA_TYPE_SUBTITLE:
case AVMEDIA_TYPE_ATTACHMENT:
@@ -1414,7 +1412,17 @@ static OutputStream *new_audio_stream(OptionsContext *o,
AVFormatContext *oc)
if (!ost->stream_copy) {
char *sample_fmt = NULL;
- MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
+ {
+ int i, ret;
+ for (i = 0; i < o->nb_audio_channels; i++) {
+ char *spec = o->audio_channels[i].specifier;
+ if ((ret = check_stream_specifier(oc, st, spec)) > 0)
+ av_channel_layout_default(&audio_enc->ch_layout,
+ o->audio_channels[i].u.i);
+ else if (ret < 0)
+ exit_program(1);
+ }
+ }
MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
if (sample_fmt &&
@@ -1930,17 +1938,18 @@ loop_end:
memcpy(f->sample_rates, ost->enc->supported_samplerates,
(count + 1) * sizeof(*f->sample_rates));
}
- if (ost->enc_ctx->channels) {
- f->channel_layout =
av_get_default_channel_layout(ost->enc_ctx->channels);
- } else if (ost->enc->channel_layouts) {
+ if (av_channel_layout_check(&ost->enc_ctx->ch_layout)) {
+ av_channel_layout_copy(&f->ch_layout,
&ost->enc_ctx->ch_layout);
+ } else if (ost->enc->ch_layouts) {
count = 0;
- while (ost->enc->channel_layouts[count])
+ while
(av_channel_layout_check(&ost->enc->ch_layouts[count]))
count++;
- f->channel_layouts = av_mallocz_array(count + 1,
sizeof(*f->channel_layouts));
- if (!f->channel_layouts)
+ f->ch_layouts = av_mallocz_array(count + 1,
sizeof(*f->ch_layouts));
+ if (!f->ch_layouts)
exit_program(1);
- memcpy(f->channel_layouts, ost->enc->channel_layouts,
- (count + 1) * sizeof(*f->channel_layouts));
+ // TODO use av_channel_layout_copy?
+ memcpy(f->ch_layouts, ost->enc->ch_layouts,
+ (count + 1) * sizeof(*f->ch_layouts));
}
break;
}
@@ -2300,22 +2309,21 @@ static int opt_channel_layout(void *optctx, const char
*opt, const char *arg)
char layout_str[32];
char *stream_str;
char *ac_str;
- int ret, channels, ac_str_size;
- uint64_t layout;
+ int ret, ac_str_size;
+ AVChannelLayout ch_layout = {0};
- layout = av_get_channel_layout(arg);
- if (!layout) {
+ ret = av_channel_layout_from_string(&ch_layout, arg);
+ if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
- return AVERROR(EINVAL);
+ return ret;
}
- snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
- ret = opt_default(NULL, opt, layout_str);
+ snprintf(layout_str, sizeof(layout_str), "%s", arg);
+ ret = opt_default(NULL, "ch_layout", layout_str);
if (ret < 0)
return ret;
/* set 'ac' option based on channel layout */
- channels = av_get_channel_layout_nb_channels(layout);
- snprintf(layout_str, sizeof(layout_str), "%d", channels);
+ snprintf(layout_str, sizeof(layout_str), "%d", ch_layout.nb_channels);
stream_str = strchr(opt, ':');
ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
ac_str = av_mallocz(ac_str_size);
diff --git a/avtools/avplay.c b/avtools/avplay.c
index 544c5dd4a1..183890d798 100644
--- a/avtools/avplay.c
+++ b/avtools/avplay.c
@@ -160,11 +160,10 @@ typedef struct PlayerState {
AVPacket audio_pkt_temp;
AVPacket audio_pkt;
enum AVSampleFormat sdl_sample_fmt;
- uint64_t sdl_channel_layout;
- int sdl_channels;
+ AVChannelLayout sdl_ch_layout;
int sdl_sample_rate;
enum AVSampleFormat resample_sample_fmt;
- uint64_t resample_channel_layout;
+ AVChannelLayout resample_ch_layout;
int resample_sample_rate;
AVAudioResampleContext *avr;
AVFrame *frame;
@@ -721,7 +720,7 @@ static void video_audio_display(PlayerState *s)
nb_freq = 1 << (rdft_bits - 1);
/* compute display index : center on currently output samples */
- channels = s->sdl_channels;
+ channels = s->sdl_ch_layout.nb_channels;
nb_display_channels = channels;
if (!s->paused) {
int data_used = s->show_audio == 1 ? s->width : (2 * nb_freq);
@@ -930,7 +929,7 @@ static double get_audio_clock(PlayerState *is)
hw_buf_size = audio_write_get_buf_size(is);
bytes_per_sec = 0;
if (is->audio_st) {
- bytes_per_sec = is->sdl_sample_rate * is->sdl_channels *
+ bytes_per_sec = is->sdl_sample_rate * is->sdl_ch_layout.nb_channels *
av_get_bytes_per_sample(is->sdl_sample_fmt);
}
if (bytes_per_sec)
@@ -1725,7 +1724,7 @@ static int synchronize_audio(PlayerState *is, short
*samples,
int n, samples_size;
double ref_clock;
- n = is->sdl_channels * av_get_bytes_per_sample(is->sdl_sample_fmt);
+ n = is->sdl_ch_layout.nb_channels *
av_get_bytes_per_sample(is->sdl_sample_fmt);
samples_size = samples_size1;
/* if not master, then we try to remove or add samples to correct the
clock */
@@ -1832,16 +1831,18 @@ static int audio_decode_frame(PlayerState *is, double
*pts_ptr)
flush_complete = 1;
continue;
}
- data_size = av_samples_get_buffer_size(NULL, dec->channels,
+ data_size = av_samples_get_buffer_size(NULL,
dec->ch_layout.nb_channels,
is->frame->nb_samples,
is->frame->format, 1);
audio_resample = is->frame->format != is->sdl_sample_fmt
||
- is->frame->ch_layout.u.mask !=
is->sdl_channel_layout ||
+ av_channel_layout_compare(&is->frame->ch_layout,
+ &is->sdl_ch_layout) ||
is->frame->sample_rate != is->sdl_sample_rate;
resample_changed = is->frame->format !=
is->resample_sample_fmt ||
- is->frame->ch_layout.u.mask !=
is->resample_channel_layout ||
+ av_channel_layout_compare(&is->frame->ch_layout,
+
&is->resample_ch_layout) ||
is->frame->sample_rate !=
is->resample_sample_rate;
if ((!is->avr && audio_resample) || resample_changed) {
@@ -1856,10 +1857,10 @@ static int audio_decode_frame(PlayerState *is, double
*pts_ptr)
}
}
if (audio_resample) {
- av_opt_set_int(is->avr, "in_channel_layout",
is->frame->channel_layout, 0);
+ av_opt_set_channel_layout(is->avr, "in_ch_layout",
&is->frame->ch_layout, 0);
av_opt_set_int(is->avr, "in_sample_fmt",
is->frame->format, 0);
av_opt_set_int(is->avr, "in_sample_rate",
is->frame->sample_rate, 0);
- av_opt_set_int(is->avr, "out_channel_layout",
is->sdl_channel_layout, 0);
+ av_opt_set_channel_layout(is->avr, "out_ch_layout",
&is->sdl_ch_layout, 0);
av_opt_set_int(is->avr, "out_sample_fmt",
is->sdl_sample_fmt, 0);
av_opt_set_int(is->avr, "out_sample_rate",
is->sdl_sample_rate, 0);
@@ -1869,7 +1870,9 @@ static int audio_decode_frame(PlayerState *is, double
*pts_ptr)
}
}
is->resample_sample_fmt = is->frame->format;
- is->resample_channel_layout = is->frame->channel_layout;
+ ret = av_channel_layout_copy(&is->resample_ch_layout,
&is->frame->ch_layout);
+ if (ret < 0)
+ break;
is->resample_sample_rate = is->frame->sample_rate;
}
@@ -1880,7 +1883,7 @@ static int audio_decode_frame(PlayerState *is, double
*pts_ptr)
int nb_samples = is->frame->nb_samples;
out_size = av_samples_get_buffer_size(&out_linesize,
- is->sdl_channels,
+
is->sdl_ch_layout.nb_channels,
nb_samples,
is->sdl_sample_fmt, 0);
tmp_out = av_realloc(is->audio_buf1, out_size);
@@ -1899,7 +1902,7 @@ static int audio_decode_frame(PlayerState *is, double
*pts_ptr)
break;
}
is->audio_buf = is->audio_buf1;
- data_size = out_samples * osize * is->sdl_channels;
+ data_size = out_samples * osize *
is->sdl_ch_layout.nb_channels;
} else {
is->audio_buf = is->frame->data[0];
}
@@ -1907,7 +1910,7 @@ static int audio_decode_frame(PlayerState *is, double
*pts_ptr)
/* if no pts, then compute it */
pts = is->audio_clock;
*pts_ptr = pts;
- n = is->sdl_channels * av_get_bytes_per_sample(is->sdl_sample_fmt);
+ n = is->sdl_ch_layout.nb_channels *
av_get_bytes_per_sample(is->sdl_sample_fmt);
is->audio_clock += (double)data_size /
(double)(n * is->sdl_sample_rate);
#ifdef DEBUG
@@ -2085,22 +2088,19 @@ static int stream_component_open(PlayerState *is, int
stream_index)
if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
is->sdl_sample_rate = avctx->sample_rate;
- if (!avctx->channel_layout)
- avctx->channel_layout =
av_get_default_channel_layout(avctx->channels);
- if (!avctx->channel_layout) {
+ if (!av_channel_layout_check(&avctx->ch_layout)) {
fprintf(stderr, "unable to guess channel layout\n");
ret = AVERROR_INVALIDDATA;
goto fail;
}
- if (avctx->channels == 1)
- is->sdl_channel_layout = AV_CH_LAYOUT_MONO;
+ if (avctx->ch_layout.nb_channels == 1)
+ is->sdl_ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO;
else
- is->sdl_channel_layout = AV_CH_LAYOUT_STEREO;
- is->sdl_channels =
av_get_channel_layout_nb_channels(is->sdl_channel_layout);
+ is->sdl_ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.freq = is->sdl_sample_rate;
- wanted_spec.channels = is->sdl_channels;
+ wanted_spec.channels = is->sdl_ch_layout.nb_channels;
wanted_spec.silence = 0;
wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
wanted_spec.callback = sdl_audio_callback;
@@ -2113,7 +2113,9 @@ static int stream_component_open(PlayerState *is, int
stream_index)
is->audio_hw_buf_size = spec.size;
is->sdl_sample_fmt = AV_SAMPLE_FMT_S16;
is->resample_sample_fmt = is->sdl_sample_fmt;
- is->resample_channel_layout = avctx->channel_layout;
+ ret = av_channel_layout_copy(&is->resample_ch_layout,
&avctx->ch_layout);
+ if (ret < 0)
+ goto fail;
is->resample_sample_rate = avctx->sample_rate;
}
diff --git a/avtools/cmdutils.c b/avtools/cmdutils.c
index 9d6a2b9f2b..238045f6b7 100644
--- a/avtools/cmdutils.c
+++ b/avtools/cmdutils.c
@@ -1038,8 +1038,19 @@ static void print_codec(const AVCodec *c)
GET_SAMPLE_RATE_NAME);
PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample
formats",
AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME);
- PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts",
- 0, GET_CH_LAYOUT_DESC);
+
+ if (c->ch_layouts) {
+ const AVChannelLayout *p = c->ch_layouts;
+
+ printf(" Supported channel layouts:");
+ while (!av_channel_layout_check(p)) {
+ char *chlstr = av_channel_layout_describe(p);
+ printf(" %s", chlstr);
+ av_free(chlstr);
+ p++;
+ }
+ printf("\n");
+ }
if (c->priv_class) {
show_help_children(c->priv_class,
diff --git a/avtools/cmdutils.h b/avtools/cmdutils.h
index cc78ac5911..2389435a79 100644
--- a/avtools/cmdutils.h
+++ b/avtools/cmdutils.h
@@ -555,12 +555,4 @@ const char *media_type_string(enum AVMediaType media_type);
char name[16];\
snprintf(name, sizeof(name), "%d", rate);
-#define GET_CH_LAYOUT_NAME(ch_layout)\
- char name[16];\
- snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
-
-#define GET_CH_LAYOUT_DESC(ch_layout)\
- char name[128];\
- av_get_channel_layout_string(name, sizeof(name), 0, ch_layout);
-
#endif /* LIBAV_CMDUTILS_H */
diff --git a/doc/examples/decode_audio.c b/doc/examples/decode_audio.c
index d952b4923b..ec933ea11c 100644
--- a/doc/examples/decode_audio.c
+++ b/doc/examples/decode_audio.c
@@ -63,7 +63,7 @@ static void decode(AVCodecContext *dec_ctx, AVPacket *pkt,
AVFrame *frame,
/* the stream parameters may change at any time, check that they are
* what we expect */
- if (av_get_channel_layout_nb_channels(frame->channel_layout) != 2 ||
+ if (frame->ch_layout.nb_channels != 2 ||
frame->format != AV_SAMPLE_FMT_S16P) {
fprintf(stderr, "Unsupported frame parameters\n");
exit(1);
diff --git a/doc/examples/encode_audio.c b/doc/examples/encode_audio.c
index a32fcc9004..b941fb5352 100644
--- a/doc/examples/encode_audio.c
+++ b/doc/examples/encode_audio.c
@@ -67,26 +67,27 @@ static int select_sample_rate(const AVCodec *codec)
}
/* select layout with the highest channel count */
-static int select_channel_layout(const AVCodec *codec)
+static int select_channel_layout(AVCodecContext *ctx, const AVCodec *codec)
{
- const uint64_t *p;
- uint64_t best_ch_layout = 0;
- int best_nb_channels = 0;
+ const AVChannelLayout *p;
+ int ret, best_nb_channels = 0;
- if (!codec->channel_layouts)
+ if (!codec->ch_layouts)
return AV_CH_LAYOUT_STEREO;
- p = codec->channel_layouts;
- while (*p) {
- int nb_channels = av_get_channel_layout_nb_channels(*p);
+ p = codec->ch_layouts;
+ while (av_channel_layout_check(p)) {
+ int nb_channels = (*p).nb_channels;
if (nb_channels > best_nb_channels) {
- best_ch_layout = *p;
best_nb_channels = nb_channels;
+ ret = av_channel_layout_copy(&ctx->ch_layout, p);
+ if (ret < 0)
+ return ret;
}
p++;
}
- return best_ch_layout;
+ return 0;
}
static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt,
@@ -160,8 +161,11 @@ int main(int argc, char **argv)
/* select other audio parameters supported by the encoder */
c->sample_rate = select_sample_rate(codec);
- c->channel_layout = select_channel_layout(codec);
- c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
+ ret = select_channel_layout(c, codec);
+ if (ret < 0) {
+ fprintf(stderr, "failed to select best channel layout\n");
+ exit(1);
+ }
/* open it */
if (avcodec_open2(c, codec, NULL) < 0) {
@@ -191,7 +195,11 @@ int main(int argc, char **argv)
frame->nb_samples = c->frame_size;
frame->format = c->sample_fmt;
- frame->channel_layout = c->channel_layout;
+ ret = av_channel_layout_copy(&frame->ch_layout, &c->ch_layout);
+ if (ret < 0) {
+ fprintf(stderr, "could not copy channel layout in audio frame\n");
+ exit(1);
+ }
/* allocate the data buffers */
ret = av_frame_get_buffer(frame, 0);
@@ -214,7 +222,7 @@ int main(int argc, char **argv)
for (j = 0; j < c->frame_size; j++) {
samples[2*j] = (int)(sin(t) * 10000);
- for (k = 1; k < c->channels; k++)
+ for (k = 1; k < c->ch_layout.nb_channels; k++)
samples[2*j + k] = samples[2*j];
t += tincr;
}
diff --git a/doc/examples/filter_audio.c b/doc/examples/filter_audio.c
index 458004355f..cfd6470984 100644
--- a/doc/examples/filter_audio.c
+++ b/doc/examples/filter_audio.c
@@ -55,7 +55,7 @@
#define INPUT_SAMPLERATE 48000
#define INPUT_FORMAT AV_SAMPLE_FMT_FLTP
-#define INPUT_CHANNEL_LAYOUT AV_CH_LAYOUT_5POINT0
+#define INPUT_CHANNEL_LAYOUT (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0
#define VOLUME_VAL 0.90
@@ -74,7 +74,7 @@ static int init_filter_graph(AVFilterGraph **graph,
AVFilterContext **src,
AVDictionary *options_dict = NULL;
uint8_t options_str[1024];
- uint8_t ch_layout[64];
+ AVChannelLayout ch_layout = INPUT_CHANNEL_LAYOUT;
int err;
@@ -100,8 +100,7 @@ static int init_filter_graph(AVFilterGraph **graph,
AVFilterContext **src,
}
/* Set the filter options through the AVOptions API. */
- av_get_channel_layout_string(ch_layout, sizeof(ch_layout), 0,
INPUT_CHANNEL_LAYOUT);
- av_opt_set (abuffer_ctx, "channel_layout", ch_layout,
AV_OPT_SEARCH_CHILDREN);
+ av_opt_set_channel_layout(abuffer_ctx, "ch_layout", &ch_layout,
AV_OPT_SEARCH_CHILDREN);
av_opt_set (abuffer_ctx, "sample_fmt",
av_get_sample_fmt_name(INPUT_FORMAT), AV_OPT_SEARCH_CHILDREN);
av_opt_set_q (abuffer_ctx, "time_base", (AVRational){ 1,
INPUT_SAMPLERATE }, AV_OPT_SEARCH_CHILDREN);
av_opt_set_int(abuffer_ctx, "sample_rate", INPUT_SAMPLERATE,
AV_OPT_SEARCH_CHILDREN);
@@ -215,7 +214,7 @@ static int init_filter_graph(AVFilterGraph **graph,
AVFilterContext **src,
static int process_output(struct AVMD5 *md5, AVFrame *frame)
{
int planar = av_sample_fmt_is_planar(frame->format);
- int channels = av_get_channel_layout_nb_channels(frame->channel_layout);
+ int channels = frame->ch_layout.nb_channels;
int planes = planar ? channels : 1;
int bps = av_get_bytes_per_sample(frame->format);
int plane_size = bps * frame->nb_samples * (planar ? 1 : channels);
@@ -248,7 +247,7 @@ static int get_input(AVFrame *frame, int frame_num)
/* Set up the frame properties and allocate the buffer for the data. */
frame->sample_rate = INPUT_SAMPLERATE;
frame->format = INPUT_FORMAT;
- frame->channel_layout = INPUT_CHANNEL_LAYOUT;
+ frame->ch_layout = INPUT_CHANNEL_LAYOUT;
frame->nb_samples = FRAME_SIZE;
frame->pts = frame_num * FRAME_SIZE;
diff --git a/doc/examples/output.c b/doc/examples/output.c
index 59e7b95d17..85ac37170b 100644
--- a/doc/examples/output.c
+++ b/doc/examples/output.c
@@ -77,6 +77,8 @@ static void add_audio_stream(OutputStream *ost,
AVFormatContext *oc,
{
AVCodecContext *c;
AVCodec *codec;
+ AVChannelLayout ch_layout;
+ static AVChannelLayout stereo = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
int ret;
/* find the audio encoder */
@@ -99,12 +101,17 @@ static void add_audio_stream(OutputStream *ost,
AVFormatContext *oc,
}
ost->enc = c;
+ ch_layout = codec->ch_layouts ? codec->ch_layouts[0] : stereo;
+
/* put sample parameters */
c->sample_fmt = codec->sample_fmts ? codec->sample_fmts[0]
: AV_SAMPLE_FMT_S16;
c->sample_rate = codec->supported_samplerates ?
codec->supported_samplerates[0] : 44100;
- c->channel_layout = codec->channel_layouts ?
codec->channel_layouts[0] : AV_CH_LAYOUT_STEREO;
- c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
c->bit_rate = 64000;
+ ret = av_channel_layout_copy(&c->ch_layout, &ch_layout);
+ if (ret < 0) {
+ fprintf(stderr, "Could not copy channel layout\n");
+ exit(1);
+ }
ost->st->time_base = (AVRational){ 1, c->sample_rate };
@@ -125,10 +132,10 @@ static void add_audio_stream(OutputStream *ost,
AVFormatContext *oc,
av_opt_set_int(ost->avr, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
av_opt_set_int(ost->avr, "in_sample_rate", 44100, 0);
- av_opt_set_int(ost->avr, "in_channel_layout", AV_CH_LAYOUT_STEREO, 0);
+ av_opt_set_channel_layout(ost->avr, "in_ch_layout", &stereo, 0);
av_opt_set_int(ost->avr, "out_sample_fmt", c->sample_fmt, 0);
av_opt_set_int(ost->avr, "out_sample_rate", c->sample_rate, 0);
- av_opt_set_int(ost->avr, "out_channel_layout", c->channel_layout, 0);
+ av_opt_set_channel_layout(ost->avr, "out_ch_layout", &c->ch_layout, 0);
ret = avresample_open(ost->avr);
if (ret < 0) {
@@ -138,7 +145,7 @@ static void add_audio_stream(OutputStream *ost,
AVFormatContext *oc,
}
static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt,
- uint64_t channel_layout,
+ AVChannelLayout *ch_layout,
int sample_rate, int nb_samples)
{
AVFrame *frame = av_frame_alloc();
@@ -150,9 +157,13 @@ static AVFrame *alloc_audio_frame(enum AVSampleFormat
sample_fmt,
}
frame->format = sample_fmt;
- frame->channel_layout = channel_layout;
frame->sample_rate = sample_rate;
frame->nb_samples = nb_samples;
+ ret = av_channel_layout_copy(&frame->ch_layout, ch_layout);
+ if (ret < 0) {
+ fprintf(stderr, "Error copying a channel layout in an audio frame\n");
+ exit(1);
+ }
if (nb_samples) {
ret = av_frame_get_buffer(frame, 0);
@@ -169,6 +180,7 @@ static void open_audio(AVFormatContext *oc, OutputStream
*ost)
{
AVCodecContext *c;
int nb_samples, ret;
+ static AVChannelLayout stereo = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
c = ost->enc;
@@ -189,9 +201,9 @@ static void open_audio(AVFormatContext *oc, OutputStream
*ost)
else
nb_samples = c->frame_size;
- ost->frame = alloc_audio_frame(c->sample_fmt, c->channel_layout,
+ ost->frame = alloc_audio_frame(c->sample_fmt, &c->ch_layout,
c->sample_rate, nb_samples);
- ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, AV_CH_LAYOUT_STEREO,
+ ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, &stereo,
44100, nb_samples);
/* copy the stream parameters to the muxer */
@@ -218,7 +230,7 @@ static AVFrame *get_audio_frame(OutputStream *ost)
for (j = 0; j < frame->nb_samples; j++) {
v = (int)(sin(ost->t) * 10000);
- for (i = 0; i < ost->enc->channels; i++)
+ for (i = 0; i < ost->enc->ch_layout.nb_channels; i++)
*q++ = v;
ost->t += ost->tincr;
ost->tincr += ost->tincr2;
diff --git a/doc/examples/transcode_aac.c b/doc/examples/transcode_aac.c
index 44d5af6b04..5ee4056c8e 100644
--- a/doc/examples/transcode_aac.c
+++ b/doc/examples/transcode_aac.c
@@ -207,8 +207,7 @@ static int open_output_file(const char *filename,
/* Set the basic encoder parameters.
* The input file's sample rate is used to avoid a sample rate conversion.
*/
- avctx->channels = OUTPUT_CHANNELS;
- avctx->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
+ av_channel_layout_default(&avctx->ch_layout, OUTPUT_CHANNELS);
avctx->sample_rate = input_codec_context->sample_rate;
avctx->sample_fmt = output_codec->sample_fmts[0];
avctx->bit_rate = OUTPUT_BIT_RATE;
@@ -293,7 +292,8 @@ static int init_resampler(AVCodecContext
*input_codec_context,
/* Only initialize the resampler if it is necessary, i.e.,
* if and only if the sample formats differ. */
if (input_codec_context->sample_fmt != output_codec_context->sample_fmt ||
- input_codec_context->channels != output_codec_context->channels) {
+ av_channel_layout_compare(&input_codec_context->ch_layout,
+ &output_codec_context->ch_layout)) {
int error;
/* Create a resampler context for the conversion. */
@@ -307,10 +307,10 @@ static int init_resampler(AVCodecContext
*input_codec_context,
* are assumed for simplicity (they are sometimes not detected
* properly by the demuxer and/or decoder).
*/
- av_opt_set_int(*resample_context, "in_channel_layout",
-
av_get_default_channel_layout(input_codec_context->channels), 0);
- av_opt_set_int(*resample_context, "out_channel_layout",
-
av_get_default_channel_layout(output_codec_context->channels), 0);
+ av_opt_set_channel_layout(*resample_context, "in_ch_layout",
+ &input_codec_context->ch_layout, 0);
+ av_opt_set_channel_layout(*resample_context, "out_ch_layout",
+ &output_codec_context->ch_layout, 0);
av_opt_set_int(*resample_context, "in_sample_rate",
input_codec_context->sample_rate, 0);
av_opt_set_int(*resample_context, "out_sample_rate",
@@ -340,7 +340,7 @@ static int init_fifo(AVAudioFifo **fifo, AVCodecContext
*output_codec_context)
{
/* Create the FIFO buffer based on the specified output sample format. */
if (!(*fifo = av_audio_fifo_alloc(output_codec_context->sample_fmt,
- output_codec_context->channels, 1))) {
+
output_codec_context->ch_layout.nb_channels, 1))) {
fprintf(stderr, "Could not allocate FIFO\n");
return AVERROR(ENOMEM);
}
@@ -440,7 +440,7 @@ static int init_converted_samples(uint8_t
***converted_input_samples,
* Each pointer will later point to the audio samples of the corresponding
* channels (although it may be NULL for interleaved formats).
*/
- if (!(*converted_input_samples = calloc(output_codec_context->channels,
+ if (!(*converted_input_samples =
calloc(output_codec_context->ch_layout.nb_channels,
sizeof(**converted_input_samples)))) {
fprintf(stderr, "Could not allocate converted input sample
pointers\n");
return AVERROR(ENOMEM);
@@ -449,7 +449,7 @@ static int init_converted_samples(uint8_t
***converted_input_samples,
/* Allocate memory for the samples of all channels in one consecutive
* block for convenience. */
if ((error = av_samples_alloc(*converted_input_samples, NULL,
- output_codec_context->channels,
+ output_codec_context->ch_layout.nb_channels,
frame_size,
output_codec_context->sample_fmt, 0)) < 0) {
fprintf(stderr,
@@ -630,9 +630,16 @@ static int init_output_frame(AVFrame **frame,
* Default channel layouts based on the number of channels
* are assumed for simplicity. */
(*frame)->nb_samples = frame_size;
- (*frame)->channel_layout = output_codec_context->channel_layout;
(*frame)->format = output_codec_context->sample_fmt;
(*frame)->sample_rate = output_codec_context->sample_rate;
+ error = av_channel_layout_copy(&(*frame)->ch_layout,
+ &output_codec_context->ch_layout);
+ if (error < 0) {
+ fprintf(stderr, "Could not copy channel layout (error '%s')\n",
+ get_error_text(error));
+ av_frame_free(frame);
+ return error;
+ }
/* Allocate the samples of the created frame. This call will make
* sure that the audio frame can hold as many samples as specified. */
diff --git a/tools/graph2dot.c b/tools/graph2dot.c
index fbf8902146..9a48208a6c 100644
--- a/tools/graph2dot.c
+++ b/tools/graph2dot.c
@@ -86,13 +86,12 @@ static void print_digraph(FILE *outfile, AVFilterGraph
*graph)
desc->name, link->w, link->h, link->time_base.num,
link->time_base.den);
} else if (link->type == AVMEDIA_TYPE_AUDIO) {
- char buf[255];
- av_get_channel_layout_string(buf, sizeof(buf), -1,
- link->channel_layout);
+ char *chlstr =
av_channel_layout_describe(&link->ch_layout);
fprintf(outfile,
" [ label= \"fmt:%s sr:%d cl:%s\" ]",
av_get_sample_fmt_name(link->format),
- link->sample_rate, buf);
+ link->sample_rate, chlstr);
+ av_free(chlstr);
}
fprintf(outfile, ";\n");
}
diff --git a/tools/ismindex.c b/tools/ismindex.c
index 3d7e082b6d..5127e3a3cd 100644
--- a/tools/ismindex.c
+++ b/tools/ismindex.c
@@ -571,7 +571,7 @@ static int handle_file(struct Tracks *tracks, const char
*file, int split,
if (tracks->audio_track < 0)
tracks->audio_track = tracks->nb_tracks;
tracks->nb_audio_tracks++;
- track->channels = st->codecpar->channels;
+ track->channels = st->codecpar->ch_layout.nb_channels;
track->sample_rate = st->codecpar->sample_rate;
if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
track->fourcc = "AACL";
diff --git a/tools/sidxindex.c b/tools/sidxindex.c
index e740a94b98..4724321e30 100644
--- a/tools/sidxindex.c
+++ b/tools/sidxindex.c
@@ -191,7 +191,7 @@ static int handle_file(struct Tracks *tracks, const char
*file)
track->timescale,
AV_ROUND_UP));
if (track->is_audio) {
- track->channels = st->codecpar->channels;
+ track->channels = st->codecpar->ch_layout.nb_channels;
track->sample_rate = st->codecpar->sample_rate;
}
if (track->is_video) {
--
2.13.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel