49 #define OFFSET(x) offsetof(AMergeContext, x)
50 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
53 {
"inputs",
"specify the number of inputs",
OFFSET(nb_inputs),
78 int i, overlap = 0, nb_ch = 0;
84 "No channel layout for input %d\n", i + 1);
94 if (outlayout & inlayout[i])
96 outlayout |= inlayout[i];
105 "Input channel layouts overlap: "
106 "output layout will be determined by the number of distinct input channels\n");
107 for (i = 0; i < nb_ch; i++)
111 outlayout = ((int64_t)1 << nb_ch) - 1;
114 int c, out_ch_number = 0;
116 route[0] = am->
route;
118 route[i] = route[i - 1] + am->
in[i - 1].
nb_ch;
119 for (c = 0; c < 64; c++)
121 if ((inlayout[i] >> c) & 1)
122 *(route[i]++) = out_ch_number++;
148 "Inputs must have the same sample rate "
149 "%d for in%d vs %d\n",
160 av_bprintf(&bp,
"%sin%d:", i ?
" + " :
"", i);
199 static inline void copy_samples(
int nb_inputs,
struct amerge_input in[],
206 for (i = 0; i < nb_inputs; i++)
207 nb_ch += in[i].nb_ch;
210 for (i = 0; i < nb_inputs; i++) {
211 for (c = 0; c < in[i].nb_ch; c++) {
212 memcpy((*outs) + bps * *(route_cur++), ins[i], bps);
216 *outs += nb_ch *
bps;
230 for (input_number = 0; input_number < am->
nb_inputs; input_number++)
231 if (inlink == ctx->
inputs[input_number])
243 outs = outbuf->
data[0];
246 ins[i] = inbuf[i]->
data[0] +
254 ctx->outputs[0]->time_base);
257 outbuf->audio->channel_layout = outlink->channel_layout;
261 for (i = 0; i < am->nb_inputs; i++)
262 ns =
FFMIN(ns, inbuf[i]->audio->nb_samples - am->in[i].pos);
267 copy_samples(am->nb_inputs, am->in, am->route, ins, &outs, ns, 1);
270 copy_samples(am->nb_inputs, am->in, am->route, ins, &outs, ns, 2);
273 copy_samples(am->nb_inputs, am->in, am->route, ins, &outs, ns, 4);
276 copy_samples(am->nb_inputs, am->in, am->route, ins, &outs, ns, am->bps);
281 for (i = 0; i < am->nb_inputs; i++) {
282 am->in[i].nb_samples -= ns;
284 if (am->in[i].pos == inbuf[i]->audio->nb_samples) {
289 ins[i] = inbuf[i] ? inbuf[i]->data[0] :
NULL;
301 am->
class = &amerge_class;
339 "a single multi-channel stream."),
346 .priv_class = &amerge_class,