#include <stdint.h>
+#include "libavutil/common.h"
#include "libavutil/libm.h"
#include "libavutil/samplefmt.h"
#include "avresample.h"
#define WIDE_RIGHT 32
#define SURROUND_DIRECT_LEFT 33
#define SURROUND_DIRECT_RIGHT 34
+#define LOW_FREQUENCY_2 35
#define SQRT3_2 1.22474487139158904909 /* sqrt(3/2) */
return 0;
}
-
-int avresample_get_matrix(AVAudioResampleContext *avr, double *matrix,
- int stride)
-{
- int in_channels, out_channels, i, o;
-
- in_channels = av_get_channel_layout_nb_channels(avr->in_channel_layout);
- out_channels = av_get_channel_layout_nb_channels(avr->out_channel_layout);
-
- if ( in_channels < 0 || in_channels > AVRESAMPLE_MAX_CHANNELS ||
- out_channels < 0 || out_channels > AVRESAMPLE_MAX_CHANNELS) {
- av_log(avr, AV_LOG_ERROR, "Invalid channel layouts\n");
- return AVERROR(EINVAL);
- }
-
- switch (avr->mix_coeff_type) {
- case AV_MIX_COEFF_TYPE_Q8:
- if (!avr->am->matrix_q8[0]) {
- av_log(avr, AV_LOG_ERROR, "matrix is not set\n");
- return AVERROR(EINVAL);
- }
- for (o = 0; o < out_channels; o++)
- for (i = 0; i < in_channels; i++)
- matrix[o * stride + i] = avr->am->matrix_q8[o][i] / 256.0;
- break;
- case AV_MIX_COEFF_TYPE_Q15:
- if (!avr->am->matrix_q15[0]) {
- av_log(avr, AV_LOG_ERROR, "matrix is not set\n");
- return AVERROR(EINVAL);
- }
- for (o = 0; o < out_channels; o++)
- for (i = 0; i < in_channels; i++)
- matrix[o * stride + i] = avr->am->matrix_q15[o][i] / 32768.0;
- break;
- case AV_MIX_COEFF_TYPE_FLT:
- if (!avr->am->matrix_flt[0]) {
- av_log(avr, AV_LOG_ERROR, "matrix is not set\n");
- return AVERROR(EINVAL);
- }
- for (o = 0; o < out_channels; o++)
- for (i = 0; i < in_channels; i++)
- matrix[o * stride + i] = avr->am->matrix_flt[o][i];
- break;
- default:
- av_log(avr, AV_LOG_ERROR, "Invalid mix coeff type\n");
- return AVERROR(EINVAL);
- }
- return 0;
-}
-
-int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix,
- int stride)
-{
- int in_channels, out_channels, i, o;
-
- in_channels = av_get_channel_layout_nb_channels(avr->in_channel_layout);
- out_channels = av_get_channel_layout_nb_channels(avr->out_channel_layout);
-
- if ( in_channels < 0 || in_channels > AVRESAMPLE_MAX_CHANNELS ||
- out_channels < 0 || out_channels > AVRESAMPLE_MAX_CHANNELS) {
- av_log(avr, AV_LOG_ERROR, "Invalid channel layouts\n");
- return AVERROR(EINVAL);
- }
-
- if (avr->am->matrix)
- av_freep(avr->am->matrix);
-
-#define CONVERT_MATRIX(type, expr) \
- avr->am->matrix_## type[0] = av_mallocz(out_channels * in_channels * \
- sizeof(*avr->am->matrix_## type[0])); \
- if (!avr->am->matrix_## type[0]) \
- return AVERROR(ENOMEM); \
- for (o = 0; o < out_channels; o++) { \
- if (o > 0) \
- avr->am->matrix_## type[o] = avr->am->matrix_## type[o - 1] + \
- in_channels; \
- for (i = 0; i < in_channels; i++) { \
- double v = matrix[o * stride + i]; \
- avr->am->matrix_## type[o][i] = expr; \
- } \
- } \
- avr->am->matrix = (void **)avr->am->matrix_## type;
-
- switch (avr->mix_coeff_type) {
- case AV_MIX_COEFF_TYPE_Q8:
- CONVERT_MATRIX(q8, av_clip_int16(lrint(256.0 * v)))
- break;
- case AV_MIX_COEFF_TYPE_Q15:
- CONVERT_MATRIX(q15, av_clipl_int32(llrint(32768.0 * v)))
- break;
- case AV_MIX_COEFF_TYPE_FLT:
- CONVERT_MATRIX(flt, v)
- break;
- default:
- av_log(avr, AV_LOG_ERROR, "Invalid mix coeff type\n");
- return AVERROR(EINVAL);
- }
-
- /* TODO: detect situations where we can just swap around pointers
- instead of doing matrix multiplications with 0.0 and 1.0 */
-
- return 0;
-}