2 * audio encoder psychoacoustic model
3 * Copyright (C) 2008 Konstantin Shishkov
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "iirfilter.h"
26 extern const FFPsyModel ff_aac_psy_model
;
28 av_cold
int ff_psy_init(FFPsyContext
*ctx
, AVCodecContext
*avctx
,
30 const uint8_t **bands
, const int* num_bands
)
33 ctx
->psy_bands
= av_mallocz(sizeof(FFPsyBand
) * PSY_MAX_BANDS
* avctx
->channels
);
34 ctx
->bands
= av_malloc (sizeof(ctx
->bands
[0]) * num_lens
);
35 ctx
->num_bands
= av_malloc (sizeof(ctx
->num_bands
[0]) * num_lens
);
36 memcpy(ctx
->bands
, bands
, sizeof(ctx
->bands
[0]) * num_lens
);
37 memcpy(ctx
->num_bands
, num_bands
, sizeof(ctx
->num_bands
[0]) * num_lens
);
38 switch (ctx
->avctx
->codec_id
) {
40 ctx
->model
= &ff_aac_psy_model
;
44 return ctx
->model
->init(ctx
);
48 FFPsyWindowInfo
ff_psy_suggest_window(FFPsyContext
*ctx
,
49 const int16_t *audio
, const int16_t *la
,
50 int channel
, int prev_type
)
52 return ctx
->model
->window(ctx
, audio
, la
, channel
, prev_type
);
55 void ff_psy_set_band_info(FFPsyContext
*ctx
, int channel
,
56 const float *coeffs
, FFPsyWindowInfo
*wi
)
58 ctx
->model
->analyze(ctx
, channel
, coeffs
, wi
);
61 av_cold
void ff_psy_end(FFPsyContext
*ctx
)
65 av_freep(&ctx
->bands
);
66 av_freep(&ctx
->num_bands
);
67 av_freep(&ctx
->psy_bands
);
70 typedef struct FFPsyPreprocessContext
{
71 AVCodecContext
*avctx
;
73 struct FFIIRFilterCoeffs
*fcoeffs
;
74 struct FFIIRFilterState
**fstate
;
75 }FFPsyPreprocessContext
;
79 av_cold
struct FFPsyPreprocessContext
* ff_psy_preprocess_init(AVCodecContext
*avctx
)
81 FFPsyPreprocessContext
*ctx
;
84 ctx
= av_mallocz(sizeof(FFPsyPreprocessContext
));
87 if (avctx
->flags
& CODEC_FLAG_QSCALE
)
88 cutoff_coeff
= 1.0f
/ av_clip(1 + avctx
->global_quality
/ FF_QUALITY_SCALE
, 1, 8);
90 cutoff_coeff
= avctx
->bit_rate
/ (4.0f
* avctx
->sample_rate
* avctx
->channels
);
92 ctx
->fcoeffs
= ff_iir_filter_init_coeffs(FF_FILTER_TYPE_BUTTERWORTH
, FF_FILTER_MODE_LOWPASS
,
93 FILT_ORDER
, cutoff_coeff
, 0.0, 0.0);
95 ctx
->fstate
= av_mallocz(sizeof(ctx
->fstate
[0]) * avctx
->channels
);
96 for (i
= 0; i
< avctx
->channels
; i
++)
97 ctx
->fstate
[i
] = ff_iir_filter_init_state(FILT_ORDER
);
102 void ff_psy_preprocess(struct FFPsyPreprocessContext
*ctx
,
103 const int16_t *audio
, int16_t *dest
,
104 int tag
, int channels
)
108 for (ch
= 0; ch
< channels
; ch
++)
109 ff_iir_filter(ctx
->fcoeffs
, ctx
->fstate
[tag
+ch
], ctx
->avctx
->frame_size
,
110 audio
+ ch
, ctx
->avctx
->channels
,
111 dest
+ ch
, ctx
->avctx
->channels
);
113 for (ch
= 0; ch
< channels
; ch
++)
114 for (i
= 0; i
< ctx
->avctx
->frame_size
; i
++)
115 dest
[i
*ctx
->avctx
->channels
+ ch
] = audio
[i
*ctx
->avctx
->channels
+ ch
];
119 av_cold
void ff_psy_preprocess_end(struct FFPsyPreprocessContext
*ctx
)
122 ff_iir_filter_free_coeffs(ctx
->fcoeffs
);
124 for (i
= 0; i
< ctx
->avctx
->channels
; i
++)
125 ff_iir_filter_free_state(ctx
->fstate
[i
]);
126 av_freep(&ctx
->fstate
);