diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-05-31 23:55:33 +0200 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2012-06-07 22:28:32 +0200 |
commit | e8e492b30273f72eaf0029ef6acae09c1e7a8c66 (patch) | |
tree | 7f2ff932917d460639a2b467938b41cbe47f20e5 /libavfilter | |
parent | e45a92dc88498473e7392d4bea3efcc8a74089f8 (diff) | |
download | ffmpeg-e8e492b30273f72eaf0029ef6acae09c1e7a8c66.tar.gz |
af_amerge: move nb_in_ch into the in structure.
With that change, there is only one array for the inputs,
it will make easier to implement a variable number of inputs.
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/af_amerge.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c index 971f7bc3ac..394067e5ca 100644 --- a/libavfilter/af_amerge.c +++ b/libavfilter/af_amerge.c @@ -30,11 +30,11 @@ #include "internal.h" typedef struct { - int nb_in_ch[2]; /**< number of channels for each input */ int route[SWR_CH_MAX]; /**< channels routing, see copy_samples */ int bps; struct amerge_input { struct FFBufQueue queue; + int nb_ch; /**< number of channels for the input */ int nb_samples; int pos; } in[2]; @@ -70,23 +70,23 @@ static int query_formats(AVFilterContext *ctx) av_get_channel_layout_string(buf, sizeof(buf), 0, inlayout[i]); av_log(ctx, AV_LOG_INFO, "Using \"%s\" for input %d\n", buf, i + 1); } - am->nb_in_ch[i] = av_get_channel_layout_nb_channels(inlayout[i]); + am->in[i].nb_ch = av_get_channel_layout_nb_channels(inlayout[i]); } - if (am->nb_in_ch[0] + am->nb_in_ch[1] > SWR_CH_MAX) { + if (am->in[0].nb_ch + am->in[1].nb_ch > SWR_CH_MAX) { av_log(ctx, AV_LOG_ERROR, "Too many channels (max %d)\n", SWR_CH_MAX); return AVERROR(EINVAL); } if (inlayout[0] & inlayout[1]) { av_log(ctx, AV_LOG_WARNING, "Inputs overlap: output layout will be meaningless\n"); - for (i = 0; i < am->nb_in_ch[0] + am->nb_in_ch[1]; i++) + for (i = 0; i < am->in[0].nb_ch + am->in[1].nb_ch; i++) am->route[i] = i; - outlayout = av_get_default_channel_layout(am->nb_in_ch[0] + - am->nb_in_ch[1]); + outlayout = av_get_default_channel_layout(am->in[0].nb_ch + + am->in[1].nb_ch); if (!outlayout) - outlayout = ((int64_t)1 << (am->nb_in_ch[0] + am->nb_in_ch[1])) - 1; + outlayout = ((int64_t)1 << (am->in[0].nb_ch + am->in[1].nb_ch)) - 1; } else { - int *route[2] = { am->route, am->route + am->nb_in_ch[0] }; + int *route[2] = { am->route, am->route + am->in[0].nb_ch }; int c, out_ch_number = 0; outlayout = inlayout[0] | inlayout[1]; @@ -151,11 +151,11 @@ static int request_frame(AVFilterLink *outlink) /** * Copy samples from two input streams to one output stream. - * @param nb_in_ch number of channels in each input stream + * @param in inputs; used only for the nb_ch field; * @param route routing values; * input channel i goes to output channel route[i]; - * i < nb_in_ch[0] are the channels from the first output; - * i >= nb_in_ch[0] are the channels from the second output + * i < in[0].nb_ch are the channels from the first output; + * i >= in[0].nb_ch are the channels from the second output * @param ins pointer to the samples of each inputs, in packed format; * will be left at the end of the copied samples * @param outs pointer to the samples of the output, in packet format; @@ -164,7 +164,7 @@ static int request_frame(AVFilterLink *outlink) * @param ns number of samples to copy * @param bps bytes per sample */ -static inline void copy_samples(int nb_in_ch[2], int *route, uint8_t *ins[2], +static inline void copy_samples(struct amerge_input in[2], int *route, uint8_t *ins[2], uint8_t **outs, int ns, int bps) { int *route_cur; @@ -173,12 +173,12 @@ static inline void copy_samples(int nb_in_ch[2], int *route, uint8_t *ins[2], while (ns--) { route_cur = route; for (i = 0; i < 2; i++) { - for (c = 0; c < nb_in_ch[i]; c++) { + for (c = 0; c < in[i].nb_ch; c++) { memcpy((*outs) + bps * *(route_cur++), ins[i], bps); ins[i] += bps; } } - *outs += (nb_in_ch[0] + nb_in_ch[1]) * bps; + *outs += (in[0].nb_ch + in[1].nb_ch) * bps; } } @@ -204,7 +204,7 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples) for (i = 0; i < 2; i++) { inbuf[i] = ff_bufqueue_peek(&am->in[i].queue, 0); ins[i] = inbuf[i]->data[0] + - am->in[i].pos * am->nb_in_ch[i] * am->bps; + am->in[i].pos * am->in[i].nb_ch * am->bps; } outbuf->pts = inbuf[0]->pts == AV_NOPTS_VALUE ? AV_NOPTS_VALUE : inbuf[0]->pts + @@ -224,16 +224,16 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples) +~13% overall (including two common decoders) */ switch (am->bps) { case 1: - copy_samples(am->nb_in_ch, am->route, ins, &outs, ns, 1); + copy_samples(am->in, am->route, ins, &outs, ns, 1); break; case 2: - copy_samples(am->nb_in_ch, am->route, ins, &outs, ns, 2); + copy_samples(am->in, am->route, ins, &outs, ns, 2); break; case 4: - copy_samples(am->nb_in_ch, am->route, ins, &outs, ns, 4); + copy_samples(am->in, am->route, ins, &outs, ns, 4); break; default: - copy_samples(am->nb_in_ch, am->route, ins, &outs, ns, am->bps); + copy_samples(am->in, am->route, ins, &outs, ns, am->bps); break; } |