Lines Matching defs:am
61 void ff_audio_mix_set_func(AudioMix *am, enum AVSampleFormat fmt,
66 if (fmt == am->fmt && coeff_type == am->coeff_type &&
67 ( in_channels == am->in_matrix_channels || in_channels == 0) &&
68 (out_channels == am->out_matrix_channels || out_channels == 0)) {
70 am->mix = mix_func;
71 am->func_descr = descr;
72 am->ptr_align = ptr_align;
73 am->samples_align = samples_align;
75 am->mix_generic = mix_func;
76 am->func_descr_generic = descr;
78 am->has_optimized_func = 1;
93 av_log(am->avr, AV_LOG_DEBUG, "audio_mix: found function: [fmt=%s] "
285 static av_cold int mix_function_init(AudioMix *am)
287 am->func_descr = am->func_descr_generic = "n/a";
288 am->mix = am->mix_generic = NULL;
291 if (!am->in_matrix_channels || !am->out_matrix_channels)
296 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
299 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
302 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q15,
305 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q8,
310 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
313 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
316 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q8,
319 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
322 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
325 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
329 ff_audio_mix_init_x86(am);
331 if (!am->mix) {
332 av_log(am->avr, AV_LOG_ERROR, "audio_mix: NO FUNCTION FOUND: [fmt=%s] "
333 "[c=%s] [%d to %d]\n", av_get_sample_fmt_name(am->fmt),
334 coeff_type_names[am->coeff_type], am->in_channels,
335 am->out_channels);
343 AudioMix *am;
346 am = av_mallocz(sizeof(*am));
347 if (!am)
349 am->avr = avr;
359 am->fmt = avr->internal_sample_fmt;
360 am->coeff_type = avr->mix_coeff_type;
361 am->in_layout = avr->in_channel_layout;
362 am->out_layout = avr->out_channel_layout;
363 am->in_channels = avr->in_channels;
364 am->out_channels = avr->out_channels;
368 ret = ff_audio_mix_set_matrix(am, avr->mix_matrix, avr->in_channels);
392 ret = ff_audio_mix_set_matrix(am, matrix_dbl, avr->in_channels);
402 return am;
405 av_free(am);
411 AudioMix *am;
415 am = *am_p;
417 if (am->matrix) {
418 av_free(am->matrix[0]);
419 am->matrix = NULL;
421 memset(am->matrix_q8, 0, sizeof(am->matrix_q8 ));
422 memset(am->matrix_q15, 0, sizeof(am->matrix_q15));
423 memset(am->matrix_flt, 0, sizeof(am->matrix_flt));
428 int ff_audio_mix(AudioMix *am, AudioData *src)
436 if (am->has_optimized_func) {
437 int aligned_len = FFALIGN(len, am->samples_align);
438 if (!(src->ptr_align % am->ptr_align) &&
444 av_log(am->avr, AV_LOG_TRACE, "audio_mix: %d samples - %d to %d channels (%s)\n",
445 src->nb_samples, am->in_channels, am->out_channels,
446 use_generic ? am->func_descr_generic : am->func_descr);
448 if (am->in_matrix_channels && am->out_matrix_channels) {
452 if (am->out_matrix_channels < am->out_channels ||
453 am->in_matrix_channels < am->in_channels) {
454 for (i = 0, j = 0; i < FFMAX(am->in_channels, am->out_channels); i++) {
455 if (am->input_skip[i] || am->output_skip[i] || am->output_zero[i])
465 am->mix_generic(data, am->matrix, len, am->out_matrix_channels,
466 am->in_matrix_channels);
468 am->mix(data, am->matrix, len, am->out_matrix_channels,
469 am->in_matrix_channels);
472 if (am->out_matrix_channels < am->out_channels) {
473 for (i = 0; i < am->out_channels; i++)
474 if (am->output_zero[i])
475 av_samples_set_silence(&src->data[i], 0, len, 1, am->fmt);
478 ff_audio_data_set_channels(src, am->out_channels);
483 int ff_audio_mix_get_matrix(AudioMix *am, double *matrix, int stride)
487 if ( am->in_channels <= 0 || am->in_channels > AVRESAMPLE_MAX_CHANNELS ||
488 am->out_channels <= 0 || am->out_channels > AVRESAMPLE_MAX_CHANNELS) {
489 av_log(am->avr, AV_LOG_ERROR, "Invalid channel counts\n");
494 if (!am->matrix_ ## suffix[0]) { \
495 av_log(am->avr, AV_LOG_ERROR, "matrix is not set\n"); \
498 for (o = 0, o0 = 0; o < am->out_channels; o++) { \
499 for (i = 0, i0 = 0; i < am->in_channels; i++) { \
500 if (am->input_skip[i] || am->output_zero[o]) \
503 matrix[o * stride + i] = am->matrix_ ## suffix[o0][i0] * \
505 if (!am->input_skip[i]) \
508 if (!am->output_zero[o]) \
512 switch (am->coeff_type) {
523 av_log(am->avr, AV_LOG_ERROR, "Invalid mix coeff type\n");
530 static void reduce_matrix(AudioMix *am, const double *matrix, int stride)
534 memset(am->output_zero, 0, sizeof(am->output_zero));
535 memset(am->input_skip, 0, sizeof(am->input_skip));
536 memset(am->output_skip, 0, sizeof(am->output_skip));
539 for (o = 0; o < am->out_channels; o++) {
543 for (i = 0; i < am->in_channels; i++) {
551 if (o < am->in_channels) {
552 for (i = 0; i < am->out_channels; i++) {
560 am->output_zero[o] = 1;
561 am->out_matrix_channels--;
562 if (o < am->in_channels)
563 am->in_matrix_channels--;
566 if (am->out_matrix_channels == 0 || am->in_matrix_channels == 0) {
567 am->out_matrix_channels = 0;
568 am->in_matrix_channels = 0;
574 for (i = 0; i < FFMIN(am->in_channels, am->out_channels); i++) {
577 for (o = 0; o < am->out_channels; o++) {
587 for (i0 = 0; i0 < am->in_channels; i0++) {
596 am->input_skip[i] = 1;
597 am->in_matrix_channels--;
601 for (; i < am->in_channels; i++) {
604 for (o = 0; o < am->out_channels; o++) {
611 am->input_skip[i] = 1;
612 am->in_matrix_channels--;
615 if (am->in_matrix_channels == 0) {
616 am->out_matrix_channels = 0;
622 for (o = 0; o < FFMIN(am->in_channels, am->out_channels); o++) {
626 for (i = 0; i < am->in_channels; i++) {
636 for (o0 = 0; o0 < am->out_channels; o0++) {
643 am->output_skip[o] = 1;
644 am->out_matrix_channels--;
647 if (am->out_matrix_channels == 0) {
648 am->in_matrix_channels = 0;
653 int ff_audio_mix_set_matrix(AudioMix *am, const double *matrix, int stride)
659 if ( am->in_channels <= 0 || am->in_channels > AVRESAMPLE_MAX_CHANNELS ||
660 am->out_channels <= 0 || am->out_channels > AVRESAMPLE_MAX_CHANNELS) {
661 av_log(am->avr, AV_LOG_ERROR, "Invalid channel counts\n");
665 if (am->matrix) {
666 av_free(am->matrix[0]);
667 am->matrix = NULL;
670 am->in_matrix_channels = am->in_channels;
671 am->out_matrix_channels = am->out_channels;
673 reduce_matrix(am, matrix, stride);
676 am->matrix_## type[0] = av_mallocz(am->out_matrix_channels * \
677 am->in_matrix_channels * \
678 sizeof(*am->matrix_## type[0])); \
679 if (!am->matrix_## type[0]) \
681 for (o = 0, o0 = 0; o < am->out_channels; o++) { \
682 if (am->output_zero[o] || am->output_skip[o]) \
685 am->matrix_## type[o0] = am->matrix_## type[o0 - 1] + \
686 am->in_matrix_channels; \
687 for (i = 0, i0 = 0; i < am->in_channels; i++) { \
689 if (am->input_skip[i] || am->output_zero[i]) \
692 am->matrix_## type[o0][i0] = expr; \
697 am->matrix = (void **)am->matrix_## type;
699 if (am->in_matrix_channels && am->out_matrix_channels) {
700 switch (am->coeff_type) {
711 av_log(am->avr, AV_LOG_ERROR, "Invalid mix coeff type\n");
716 ret = mix_function_init(am);
721 am->in_channels, am->in_layout);
723 am->out_channels, am->out_layout);
724 av_log(am->avr, AV_LOG_DEBUG, "audio_mix: %s to %s\n",
726 av_log(am->avr, AV_LOG_DEBUG, "matrix size: %d x %d\n",
727 am->in_matrix_channels, am->out_matrix_channels);
728 for (o = 0; o < am->out_channels; o++) {
729 for (i = 0; i < am->in_channels; i++) {
730 if (am->output_zero[o])
731 av_log(am->avr, AV_LOG_DEBUG, " (ZERO)");
732 else if (am->input_skip[i] || am->output_zero[i] || am->output_skip[o])
733 av_log(am->avr, AV_LOG_DEBUG, " (SKIP)");
735 av_log(am->avr, AV_LOG_DEBUG, " %0.3f ",
736 matrix[o * am->in_channels + i]);
738 av_log(am->avr, AV_LOG_DEBUG, "\n");