Go to the documentation of this file.
94 for (
i = 0;
i < 10;
i++)
114 float tmp_lspf,
smooth, erasure_coeff;
115 const float *predictors;
125 for (
i = 0;
i < 10;
i++) {
141 for (
i = 0;
i < 10;
i++) {
143 lspf[
i] = (
i + 1) * (1 - erasure_coeff) / 11 +
144 erasure_coeff * predictors[
i];
151 for (
i = 1;
i < 10;
i++)
155 for (
i = 9;
i > 0;
i--)
164 for (
i = 0;
i < 5;
i++) {
171 if (lspf[9] <= .70 || lspf[9] >= .97)
173 for (
i = 3;
i < 10;
i++)
174 if (fabs(lspf[
i] - lspf[
i - 2]) < .08)
177 if (lspf[9] <= .66 || lspf[9] >= .985)
179 for (
i = 4;
i < 10;
i++)
180 if (fabs(lspf[
i] - lspf[
i - 4]) < .0931)
197 int i, subframes_count, g1[16];
202 case RATE_FULL: subframes_count = 16;
break;
203 case RATE_HALF: subframes_count = 4;
break;
204 default: subframes_count = 5;
206 for (
i = 0;
i < subframes_count;
i++) {
209 g1[
i] += av_clip((g1[
i - 1] + g1[
i - 2] + g1[
i - 3]) / 3 - 6, 0, 32);
227 gain[6] = 0.4 * gain[3] + 0.6 * gain[4];
229 gain[4] = 0.8 * gain[2] + 0.2 * gain[3];
230 gain[3] = 0.2 * gain[1] + 0.8 * gain[2];
232 gain[1] = 0.6 * gain[0] + 0.4 * gain[1];
245 case 2 : g1[0] -= 1;
break;
246 case 3 : g1[0] -= 2;
break;
255 for (
i = 1;
i <= subframes_count;
i++)
275 int i,
diff, prev_diff = 0;
277 for (
i = 1;
i < 5;
i++) {
278 diff = cbgain[
i] - cbgain[
i-1];
313 uint16_t cbseed, cindex;
314 float *
rnd, tmp_gain, fir_filter_value;
318 for (
i = 0;
i < 16;
i++) {
321 for (j = 0; j < 10; j++)
322 *cdn_vector++ = tmp_gain *
327 for (
i = 0;
i < 4;
i++) {
330 for (j = 0; j < 40; j++)
331 *cdn_vector++ = tmp_gain *
336 cbseed = (0x0003 & q->
frame.
lspv[4]) << 14 |
342 for (
i = 0;
i < 8;
i++) {
344 for (k = 0; k < 20; k++) {
345 cbseed = 521 * cbseed + 259;
346 *
rnd = (int16_t) cbseed;
349 fir_filter_value = 0.0;
350 for (j = 0; j < 10; j++)
355 *cdn_vector++ = tmp_gain * fir_filter_value;
364 for (
i = 0;
i < 8;
i++) {
366 for (j = 0; j < 20; j++) {
367 cbseed = 521 * cbseed + 259;
368 *cdn_vector++ = tmp_gain * (int16_t) cbseed;
374 for (
i = 0;
i < 4;
i++) {
376 for (j = 0; j < 40; j++)
377 *cdn_vector++ = tmp_gain *
382 memset(cdn_vector, 0, 160 *
sizeof(
float));
400 for (
i = 0;
i < 160;
i += 40) {
424 const float gain[4],
const uint8_t *lag,
428 float *v_lag, *v_out;
431 v_out = memory + 143;
433 for (
i = 0;
i < 4;
i++) {
435 v_lag = memory + 143 + 40 *
i - lag[
i];
436 for (v_len = v_in + 40; v_in < v_len; v_in++) {
438 for (j = 0, *v_out = 0.0; j < 4; j++)
440 (v_lag[j - 4] + v_lag[3 - j]);
444 *v_out = *v_in + gain[
i] * *v_out;
450 memcpy(v_out, v_in, 40 *
sizeof(
float));
456 memmove(memory, memory + 160, 143 *
sizeof(
float));
470 const float *v_synthesis_filtered, *v_pre_filtered;
477 for (
i = 0;
i < 4;
i++) {
483 float max_pitch_gain;
489 max_pitch_gain = 0.0;
492 max_pitch_gain = 1.0;
494 for (
i = 0;
i < 4;
i++)
506 for (
i = 0;
i < 4;
i++)
510 v_synthesis_filtered,
517 cdn_vector + 17, 143 *
sizeof(
float));
536 static void lspf2lpc(
const float *lspf,
float *lpc)
542 for (
i = 0;
i < 10;
i++)
543 lsp[
i] = cos(
M_PI * lspf[
i]);
547 for (
i = 0;
i < 10;
i++) {
548 lpc[
i] *= bandwidth_expansion_coeff;
565 float *lpc,
const int subframe_num)
567 float interpolated_lspf[10];
571 weight = 0.25 * (subframe_num + 1);
624 "Claimed bitrate and buffer size mismatch.\n");
630 "Buffer is too small for the claimed bitrate.\n");
636 "Bitrate byte missing, guessing bitrate from packet size.\n");
656 static const float pow_0_775[10] = {
657 0.775000, 0.600625, 0.465484, 0.360750, 0.279582,
658 0.216676, 0.167924, 0.130141, 0.100859, 0.078166
660 0.625000, 0.390625, 0.244141, 0.152588, 0.095367,
661 0.059605, 0.037253, 0.023283, 0.014552, 0.009095
663 float lpc_s[10], lpc_p[10], pole_out[170], zero_out[160];
666 for (n = 0; n < 10; n++) {
667 lpc_s[n] = lpc[n] * pow_0_625[n];
668 lpc_p[n] = lpc[n] * pow_0_775[n];
687 int *got_frame_ptr,
AVPacket *avpkt)
690 int buf_size = avpkt->
size;
695 float quantized_lspf[10], lpc[10];
700 frame->nb_samples = 160;
703 outbuffer = (
float *)
frame->data[0];
727 for (; bitmaps < bitmaps_end; bitmaps++)
742 for (
i = 0;
i < 4;
i++) {
773 for (
i = 0;
i < 4;
i++) {
776 outbuffer +
i * 40, 40, 10);
#define AV_LOG_WARNING
Something somehow does not look correct.
static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain)
If the received packet is Rate 1/4 a further sanity check is made of the codebook gain.
uint64_t channel_layout
Audio channel layout.
static const qcelp_vector *const qcelp_lspvq[5]
#define AV_CH_LAYOUT_MONO
static const QCELPBitmap *const qcelp_unpacking_bitmaps_per_rate[5]
Bitmapping data position for each packet type in the QCELPContext.
uint8_t cindex[16]
codebook index for each codebook subframe
static const int16_t qcelp_rate_full_codebook[128]
Circular codebook for rate 1 frames in x*100 form.
#define QCELP_LSP_OCTAVE_PREDICTOR
Predictor coefficient for the conversion of LSP codes to LSP frequencies for 1/8 and I_F_Q.
static av_cold int qcelp_decode_init(AVCodecContext *avctx)
Initialize the speech codec according to the specification.
This structure describes decoded (raw) audio or video data.
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new samples
float postfilter_synth_mem[10]
uint8_t lspv[10]
line spectral pair frequencies (LSP) for RATE_OCTAVE, line spectral pair frequencies grouped into fiv...
void ff_celp_lp_synthesis_filterf(float *out, const float *filter_coeffs, const float *in, int buffer_length, int filter_length)
LP synthesis filter.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define QCELP_SQRT1887
sqrt(1.887) is the maximum of the pseudorandom white sequence used to generate the scaled codebook ve...
uint8_t index
index into the QCELPContext structure
uint8_t plag[4]
pitch lag for each pitch subframe
void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, int size, float alpha, float *gain_mem)
Adaptive gain control (as used in AMR postfiltering)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const float * do_pitchfilter(float memory[303], const float v_in[160], const float gain[4], const uint8_t *lag, const uint8_t pfrac[4])
Apply filter in pitch-subframe steps.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define QCELP_LSP_SPREAD_FACTOR
This spread factor is used, for bitrate 1/8 and I_F_Q, to force LSP frequencies to be at least 80 Hz ...
static qcelp_packet_rate buf_size2bitrate(const int buf_size)
static const uint16_t qcelp_unpacking_bitmaps_lengths[5]
static const int8_t qcelp_rate_half_codebook[128]
Circular codebook for rate 1/2 frames in x*2 form.
static const float qcelp_hammsinc_table[4]
Pre-calculated table for hammsinc function.
@ I_F_Q
insufficient frame quality
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static int qcelp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
float rnd_fir_filter_mem[180]
static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
uint8_t cbsign[16]
sign of the codebook gain for each codebook subframe
float predictor_lspf[10]
LSP predictor for RATE_OCTAVE and I_F_Q.
uint8_t warned_buf_mismatch_bitrate
static void lspf2lpc(const float *lspf, float *lpc)
Reconstruct LPC coefficients from the line spectral pair frequencies and perform bandwidth expansion.
static int weight(int i, int blen, int offset)
static void warn_insufficient_frame_quality(AVCodecContext *avctx, const char *message)
uint8_t pgain[4]
pitch gain for each pitch subframe
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
qcelp_packet_rate bitrate
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
enum AVSampleFormat sample_fmt
audio sample format
uint8_t bitlen
number of bits to read
static void interpolate_lpc(QCELPContext *q, const float *curr_lspf, float *lpc, const int subframe_num)
Interpolate LSP frequencies and compute LPC coefficients for a given bitrate & pitch subframe.
QCELP unpacked data frame.
void ff_tilt_compensation(float *mem, float tilt, float *samples, int size)
Apply tilt compensation filter, 1 - tilt * z-1.
int channels
number of audio channels
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define i(width, name, range_min, range_max)
static void apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in)
Apply generic gain control.
uint8_t bitpos
position of the lowest bit in the value's byte
uint8_t octave_count
count the consecutive RATE_OCTAVE frames
static int decode_lspf(QCELPContext *q, float *lspf)
Decode the 10 quantized LSP frequencies from the LSPV/LSP transmission codes of any bitrate and check...
static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_size, const uint8_t **buf)
Determine the bitrate from the frame size and/or the first byte of the frame.
void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b, float weight_coeff_a, float weight_coeff_b, int length)
float implementation of weighted sum of two vectors.
static const float qcelp_g12ga[61]
Table for computing Ga (decoded linear codebook gain magnitude)
const char * name
Name of the codec implementation.
float pitch_pre_filter_mem[303]
static float smooth(DeshakeOpenCLContext *deshake_ctx, float *gauss_kernel, int length, float max_val, AVFifoBuffer *values)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
void ff_celp_lp_zero_synthesis_filterf(float *out, const float *filter_coeffs, const float *in, int buffer_length, int filter_length)
LP zero synthesis filter.
static void compute_svector(QCELPContext *q, const float *gain, float *cdn_vector)
Compute the scaled codebook vector Cdn From INDEX and GAIN for all rates.
float postfilter_tilt_mem
main external API structure.
static void decode_gain_and_index(QCELPContext *q, float *gain)
Convert codebook transmission codes to GAIN and INDEX.
#define QCELP_BANDWIDTH_EXPANSION_COEFF
Initial coefficient to perform bandwidth expansion on LPC.
float avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len)
Return the scalar product of two vectors.
int frame_number
Frame counter, set by libavcodec.
#define avpriv_request_sample(...)
QCELPFrame frame
unpacked data frame
#define QCELP_RATE_HALF_CODEBOOK_RATIO
static av_always_inline int diff(const uint32_t a, const uint32_t b)
This structure stores compressed data.
void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, float sum_of_squares, const int n)
Set the sum of squares of a signal by scaling.
uint8_t reserved
reserved bits only present in bitrate 1, 1/4 and 1/8 packets
void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order)
Reconstruct LPC coefficients from the line spectral pair frequencies.
static const double qcelp_rnd_fir_coefs[11]
Table for impulse response of BPF used to filter the white excitation for bitrate 1/4 synthesis.
uint8_t pfrac[4]
fractional pitch lag for each pitch subframe
uint8_t cbgain[16]
unsigned codebook gain for each codebook subframe
#define QCELP_RATE_FULL_CODEBOOK_RATIO
static void postfilter(QCELPContext *q, float *samples, float *lpc)
float pitch_synthesis_filter_mem[303]