[FFmpeg-devel] [PATCH] QCELP decoder
Kenan Gillet
kenan.gillet
Thu Nov 20 19:46:49 CET 2008
On Sat, Nov 15, 2008 at 3:10 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Fri, Nov 14, 2008 at 03:32:51PM -0800, Kenan Gillet wrote:
>> Hi,
>> On Fri, Nov 14, 2008 at 2:27 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
>> > On Fri, Nov 14, 2008 at 12:17:50PM -0800, Kenan Gillet wrote:
>> >>
>> >> On Nov 14, 2008, at 2:14 AM, Michael Niedermayer wrote:
>> > [...]
>> >> >
>> >> >
>> >> >> @@ -152,11 +537,140 @@
>> >> >> return -1;
>> >> >> }
>> >> >>
>> >> >> +/*
>> >> >> + * Determine the framerate from the frame size and/or the first
>> >> >> byte of the frame.
>> >> >> + *
>> >> >> + * @param avctx the AV codec context
>> >> >> + * @param buf_size length of the buffer
>> >> >> + * @param buf the bufffer
>> >> >> + *
>> >> >> + * @return the framerate on success, RATE_UNKNOWN otherwise.
>> >> >> + */
>> >> >> +static int determine_framerate(AVCodecContext *avctx,
>> >> >> + const int buf_size,
>> >> >> + uint8_t **buf) {
>> >> >> + qcelp_packet_rate framerate;
>> >> >> +
>> >> >> + if ((framerate = buf_size2framerate(buf_size)) >= 0) {
>> >> >> + if (framerate != **buf) {
>> >> >
>> >> > iam not sure but didnt you at some point reorder the enum?
>> >> > if so how can this code be correct before and afterwards?
>> >>
>> >>
>> >> I reorder the enum on the 09/07/2008, way before submitting my first
>> >> patch to
>> >> RATE_FULL = 0,
>> >> RATE_HALF = 1,
>> >> RATE_QUARTER= 2,
>> >> RATE_OCTAVE = 3,
>> >> I_F_Q, /*!< insufficient frame quality */
>> >> BLANK,
>> >> RATE_UNKNOWN
>> >> to
>> >> SILENCE = 0,
>> >> RATE_OCTAVE,
>> >> RATE_QUARTER,
>> >> RATE_HALF,
>> >> RATE_FULL,
>> >> I_F_Q, /*!< insufficient frame quality */
>> >> RATE_UNKNOWN
>> >> in order to reflect the rate byte in the QCELP frame.
>> >>
>> >> and I changed on the 10/27/2008 to
>> >> RATE_UNKNOWN = -2,
>> >> I_F_Q, /*!< insufficient frame quality */
>> >> SILENCE,
>> >> RATE_OCTAVE,
>> >> RATE_QUARTER,
>> >> RATE_HALF,
>> >> RATE_FULL
>> >> when you asked me to change the
>> >> switch (framerate)
>> >> case RATE_FULL:
>> >> case RATE_QUARTER:
>> >> case RATE_OCTAVE:
>> >> }
>> >> to (framerate >= RATE_QUARTER)
>> >
>> > that doesnt awnser
>> > how the changing enum interacts with
>> > if(framerate != [some byte from the bitstream])
>> >
>>
>> basically, the first byte of the frame corresponds to the rate in the enum.
>> the first byte can be
>> 0 => SILENCE
>> 1 => RATE_OCTAVE
>> 2 => RATE_QUARTER
>> 3 => RATE_HALF
>> 4 => RATE_FULL
>>
>> if it is not one of those, then we should have an I_F_Q.
>> The SoC code determined the framerate by looking at the bufsize
>> and then had a warning if the framerate byte (1st byte of the frame)
>> differed.
>> I suppose it was to handle frame which would not contain this first byte.
>> I have not seen any files with such a feature though, and neither
>> Reynaldo [1].
>>
>> We could simplify to just looking at the framerate and checking
>> that the buffer contains enough data for the corresponding rate.
>>
>> what do you think?
>>
>> Renaldo, any thought on this one?
>>
>>
>> >
>> > [...]
>> >
>> >> attached the round 11:
>> >
>> > OutOfMissingAttachmentJokesException
>> >
>>
>> lol
>>
>> it is very bizarre because the email in my sent box has the attachment,
>> but it is seems to have been scrapped out somewhere along the way :(
>> I'll be using the web interface of gmail from now on.
>>
>> hopefully the round 11 will be attached this time
> [...]
>> Index: libavcodec/qcelpdata.h
>> ===================================================================
>> --- libavcodec/qcelpdata.h (revision 15824)
>> +++ libavcodec/qcelpdata.h (working copy)
>> @@ -23,8 +23,54 @@
>> #define AVCODEC_QCELPDATA_H
>>
>> #include <stdint.h>
>> +#include <stddef.h>
>>
>> +#include "qcelp.h"
>> +#include "bitstream.h"
>> +
>
>> /**
>> + * @file qcelpdata.h
>> + *
>> + * QCELP unpacking tables and structures,
>> + * QCELP decoding tables and structures
>> + *
>> + * @author Reynaldo H. Verdejo Pinochet
>> + */
>> +
>> +typedef struct {
>> + GetBitContext gb;
>
>> + qcelp_packet_rate framerate;
>
> do the number of frames per second change or the bits per second?
> if later bitrate is the proper term IMO
changed to bitrate,
because only bits per second change.
>> +
>> +/// @defgroup qcelp_unpacked_data_frame QCELP unpacked data frame
>> +/// @{
>> + uint8_t cbsign[16];
>
>> + uint8_t cbgain[16];
>> + uint8_t cindex[16];
>> + uint8_t plag[4];
>> + uint8_t pfrac[4];
>> + uint8_t pgain[4];
>> + uint8_t lspv[10]; /*!< LSP for RATE_OCTAVE, LSPV for other rates */
>> + uint8_t reserved; /*!< on all but rate 1/2 packets */
>> +/// @}
>> +
>> + uint8_t erasure_count;
>> + uint8_t octave_count; /*!< count the consecutive RATE_OCTAVE frames */
>> + float prev_lspf[10];
>> + float predictor_lspf[10]; /*!< LSP predictor,
>> + only use for RATE_OCTAVE and I_F_Q */
>> + float pitch_synthesis_filter_mem[303];
>> + float pitch_pre_filter_mem[303];
>> + float rnd_fir_filter_mem[180];
>> + float formant_mem[170];
>> + float last_codebook_gain;
>> + int prev_g1[2];
>> + int prev_framerate;
>> + float prev_pitch_gain[4];
>> + uint8_t prev_pitch_lag[4];
>> + uint16_t first16bits;
>> +} QCELPContext;
>
> i somehow think this struct does not belong in qcelpdata.h
> but rather qcelpdec.c
>
I agree, but it is needed by the unpacking table.
should I just put the struct in qcelpdec.c and include qcelpdata.h after ?
or maybe make a specific struct for the unpacked data ?
any other suggestion are welcome :)
>
> [...]
>> @@ -406,7 +462,7 @@
>> 100.000/QCELP_SCALE, 112.250/QCELP_SCALE, 125.875/QCELP_SCALE, 141.250/QCELP_SCALE,
>> 158.500/QCELP_SCALE, 177.875/QCELP_SCALE, 199.500/QCELP_SCALE, 223.875/QCELP_SCALE,
>> 251.250/QCELP_SCALE, 281.875/QCELP_SCALE, 316.250/QCELP_SCALE, 354.875/QCELP_SCALE,
>> - 398.125/QCELP_SCALE, 446.625/QCELP_SCALE, 501.125/QCELP_SCALE, 563.375/QCELP_SCALE,
>> + 398.125/QCELP_SCALE, 446.625/QCELP_SCALE, 501.125/QCELP_SCALE, 562.375/QCELP_SCALE,
>> 631.000/QCELP_SCALE, 708.000/QCELP_SCALE, 794.375/QCELP_SCALE, 891.250/QCELP_SCALE,
>> 1000.000/QCELP_SCALE};
>>
>
> if this is a intended bugfix and has been from spec or ref then its ok of
> course
>
yes it is a bugfix.
>
>
>> @@ -483,4 +539,19 @@
>> -9.918777e-2, 3.749518e-2, 8.985137e-1
>> };
>>
>> +/**
>> + * This spread factor is used, for framerate 1/8,
>> + * to force the LSP frequencies to be at least 80 Hz apart.
>> + *
>> + * TIA/EIA/IS-733 2.4.3.3.2
>> + */
>> +#define QCELP_LSP_SPREAD_FACTOR 0.02
>
> this is also used in IFQ
fixed
>
>
>> +
>> +/**
>> + * predictor coefficient for the conversion of LSP codes to LSP frequencies
>> + * for RATE_OCTAVE and I_F_Q
>> + * TIA/EIA/IS-733 2.4.3.2.7-2
>> + */
>> +#define QCELP_LSP_OCTAVE_PREDICTOR 29.0/32
>
> inconsistant naming of 1/8 vs. RATE_OCTAVE
fixed
>
>
>
>> +
>> #endif /* AVCODEC_QCELPDATA_H */
>> Index: libavcodec/qcelpdec.c
>> ===================================================================
>> --- libavcodec/qcelpdec.c (revision 15824)
>> +++ libavcodec/qcelpdec.c (working copy)
>> @@ -69,6 +69,202 @@
>> }
>>
>> /**
>> + * Decodes the 10 quantized LSP frequencies from the LSPV/LSP
>> + * transmission codes of any framerate and checks for badly received packets.
>> + *
>> + * @param q the context
>> + * @param lspf line spectral pair frequencies
>> + *
>> + * @return 0 on success, -1 if the packet is badly received
>> + *
>> + * TIA/EIA/IS-733 2.4.3.2.6.2-2, 2.4.8.7.3
>> + */
>> +static int decode_lspf(QCELPContext *q,
>> + float *lspf) {
>> + int i;
>> + float tmp_lspf;
>> +
>> + if (q->framerate == RATE_OCTAVE ||
>> + q->framerate == I_F_Q) {
>> + float smooth;
>> + const float *predictors = (q->prev_framerate != RATE_OCTAVE &&
>> + q->prev_framerate != I_F_Q ? q->prev_lspf
>> + : q->predictor_lspf);
>> +
>> + if (q->framerate == RATE_OCTAVE) {
>> + q->octave_count++;
>> +
>> + for (i = 0; i < 10; i++) {
>
>> + lspf[i] = (i + 1) / 11.;
>> + q->predictor_lspf[i] =
>> + lspf[i] += (q->lspv[i] ? QCELP_LSP_SPREAD_FACTOR
>> + : -QCELP_LSP_SPREAD_FACTOR)
>> + + (predictors[i] - lspf[i]) * QCELP_LSP_OCTAVE_PREDICTOR;
>
> q->predictor_lspf[i] =
> lspf[i] = (q->lspv[i] ? QCELP_LSP_SPREAD_FACTOR : -QCELP_LSP_SPREAD_FACTOR)
> + predictors[i] * QCELP_LSP_OCTAVE_PREDICTOR
> + (i + 1) * ((1 - QCELP_LSP_OCTAVE_PREDICTOR)/11);
>
done
>
>> + }
>> + smooth = (q->octave_count < 10 ? .875 : 0.1);
>> + } else {
>> + float erasure_coeff;
>> +
>> + assert(q->framerate == I_F_Q);
>> +
>> + if (q->erasure_count > 1)
>> + erasure_coeff = (q->erasure_count < 4 ? 0.9 : 0.7);
>> + else
>> + erasure_coeff = 1.0;
>> +
>
>> + for (i = 0; i < 10; i++) {
>> + lspf[i] = (i + 1) / 11.;
>> + q->predictor_lspf[i] = (predictors[i] - lspf[i]) * erasure_coeff;
>> + lspf[i] += QCELP_LSP_OCTAVE_PREDICTOR * q->predictor_lspf[i];
>
> this code looks a little strange compared to the RATE_OCTAVE case
> i mean that predictor_lspf is a difference here while above it is a sum
>
fixed and simplified like above, the code should be more similar to
the RATE_OCTAVE case like:
for (i = 0; i < 10; i++) {
lspf[i] = (i + 1) / 11.;
q->predictor_lspf[i] =
lspf[i] += QCELP_LSP_OCTAVE_PREDICTOR * (predictors[i]
- lspf[i]) * erasure_coeff;
>
>> + }
>> + smooth = 0.125;
>> + }
>> +
>> + // Check the stability of the LSP frequencies.
>> + lspf[0] = FFMAX(lspf[0], QCELP_LSP_SPREAD_FACTOR);
>> + for (i = 1; i < 10; i++)
>> + lspf[i] = FFMAX(lspf[i], (lspf[i-1] + QCELP_LSP_SPREAD_FACTOR));
>> +
>> + lspf[9] = FFMIN(lspf[9], (1.0 - QCELP_LSP_SPREAD_FACTOR));
>> + for (i = 9; i > 0; i--)
>> + lspf[i-1] = FFMIN(lspf[i-1], (lspf[i] - QCELP_LSP_SPREAD_FACTOR));
>> +
>> + // Low-pass filter the LSP frequencies.
>> + weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0 - smooth, 10);
>> + } else {
>> + q->octave_count = 0;
>> +
>> + tmp_lspf = 0.;
>> + for (i = 0; i < 5 ; i++) {
>> + lspf[2*i+0] = tmp_lspf += qcelp_lspvq[i][q->lspv[i]][0] * 0.0001;
>> + lspf[2*i+1] = tmp_lspf += qcelp_lspvq[i][q->lspv[i]][1] * 0.0001;
>> + }
>> +
>
>> + // Check for badly received packets.
>> + if (q->framerate == RATE_QUARTER) {
>> + if (lspf[9] <= .70 || lspf[9] >= .97)
>> + return -1;
>> + for (i = 3; i < 10; i++)
>> + if (FFABS(lspf[i] - lspf[i-2]) < .08)
>> + return -1;
>
> fabs() might be faster than FFABS() which really is for integers
>
changed,
because fabs is faster
>
> [...]
>> + subframes_count = q->framerate == RATE_FULL ? 16
>> + : q->framerate == RATE_HALF ? 4
>> + : 5;
>
> something tells me a switch or if/else would be more readable
changed to switch
>
> [...]
>
>> + ga[0] = qcelp_g12ga[g1[0]];
>> + gain_memory = q->last_codebook_gain;
>> +
>> + q->last_codebook_gain =
>> + gain[i] = 0.5 * (gain_memory + ga[0]);
>
> the use of ga[0] as temporary seems unneeded
removed
>
>
> [...]
>> +static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain) {
>> + int i, prev_diff, diff;
>> +
>> + prev_diff = diff= cbgain[1] - cbgain[0];
>> + if (FFABS(diff) > 10)
>> + return -1;
>> + for (i = 2; i < 5; i++) {
>> + diff = cbgain[i] - cbgain[i-1];
>> + if (FFABS(diff) > 10)
>> + return -1;
>> + else if (FFABS(diff - prev_diff) > 12)
>> + return -1;
>> + prev_diff = diff;
>> + }
>> + return 0;
>> +}
>
> static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain) {
> int i, prev_diff=0;
>
> for (i = 1; i < 5; i++) {
> int diff = cbgain[i] - cbgain[i-1];
> if (FFABS(diff) > 10)
> return -1;
> else if (FFABS(diff - prev_diff) > 12)
> return -1;
> prev_diff = diff;
> }
> return 0;
> }
done
>
>
>
>> +
>> +/**
>> * Computes the scaled codebook vector Cdn From INDEX and GAIN
>> * for all rates.
>> *
>> @@ -242,6 +438,64 @@
>> }
>>
>
>> /**
>> + * Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
>> + * TIA/EIA/IS-733 2.4.5.2
>> + *
>> + * @param q the context
>> + * @param cdn_vector the scaled codebook vector
>> + */
>> +static void apply_pitch_filters(QCELPContext *q,
>> + float *cdn_vector) {
>> + int i;
>> + float gain[4];
>> + const float *v_synthesis_filtered, *v_pre_filtered;
>> +
>> + if (q->framerate >= RATE_HALF ||
>> + (q->framerate == I_F_Q && (q->prev_framerate >= RATE_HALF))) {
>> +
>> + if (q->framerate >= RATE_HALF) {
>> +
>> + // Compute gain & lag for the whole frame.
>> + for (i = 0; i < 4; i++) {
>
>> + gain[i] = q->plag[i] ? (q->pgain[i] + 1) / 4.0 : 0.0;
>
> *0.25 may be faster with some reterded compilers than /4.0
done
>
>
> [...]
>> +/*
>> + * Determine the framerate from the frame size and/or the first byte of the frame.
>> + *
>> + * @param avctx the AV codec context
>> + * @param buf_size length of the buffer
>> + * @param buf the bufffer
>> + *
>> + * @return the framerate on success,
>> + * I_F_Q if the framerate cannot be satisfactorily determined
>> + *
>> + * TIA/EIA/IS-733 2.4.8.7.1
>> + */
>> +static int determine_framerate(AVCodecContext *avctx,
>> + const int buf_size,
>> + uint8_t **buf) {
>> + qcelp_packet_rate framerate;
>> +
>> + if ((framerate = buf_size2framerate(buf_size)) >= 0) {
>
>> + if (framerate > **buf) {
>> + av_log(avctx, AV_LOG_WARNING, "Claimed framerate and buffer size mismatch.\n");
>> + framerate = **buf;
>
> iam not sure if this is a good idea
It is actually needed for 2 of the samples h263.mov and blue_earth.mov:
some of their frame have a buffer size leading to RATE_FULL
but actually contains RATE_HALF, RATE_QUARTER and RATE_OCTAVE.
I added a check **buf >=0 to make sure that *buf is a valid rate.
>
> [...]
>
>
>> static void warn_insufficient_frame_quality(AVCodecContext *avctx,
>> const char *message) {
>> av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n", avctx->frame_number, message);
>> }
>>
>> +static int qcelp_decode_frame(AVCodecContext *avctx,
>> + void *data,
>> + int *data_size,
>> + uint8_t *buf,
>> + const int buf_size) {
>> + QCELPContext *q = avctx->priv_data;
>> + float *outbuffer = data;
>> + int i;
>> + float quantized_lspf[10], lpc[10];
>> + float gain[16];
>> + float *formant_mem;
>> +
>> + if ((q->framerate = determine_framerate(avctx, buf_size, &buf)) == I_F_Q) {
>> + warn_insufficient_frame_quality(avctx, "Framerate cannot be determined.");
>> + goto erasure;
>> + }
>> +
>> + if (q->framerate == RATE_OCTAVE &&
>> + (q->first16bits = AV_RB16(buf)) == 0xFFFF) {
>> + warn_insufficient_frame_quality(avctx, "Framerate is 1/8 and first 16 bits are on.");
>> + goto erasure;
>> + }
>> +
>> + if (q->framerate > SILENCE) {
>> + const QCELPBitmap *bitmaps = qcelp_unpacking_bitmaps_per_rate[q->framerate];
>> + const QCELPBitmap *bitmaps_end = qcelp_unpacking_bitmaps_per_rate[q->framerate]
>> + + qcelp_bits_per_rate[q->framerate];
>> + uint8_t *unpacked_data = (uint8_t *)q;
>> +
>
>> + init_get_bits(&q->gb, buf, qcelp_bits_per_rate[q->framerate]);
>
> qcelp_bits_per_rate does not seem correct here nor does its name seem
> to match what it contains
yes changed back to buf_size.
what about changing qcelp_bits_per_rate to qcelp_unpacking_bitmaps_per_rate_len
because it really is the len of the unpacking bitmaps, or do you have
a better suggestion ?
>
>
> [...]
>> + for (i = 0; i < 160; i++)
>> + *outbuffer++ = av_clipf(*formant_mem++, QCELP_CLIP_LOWER_BOUND, QCELP_CLIP_UPPER_BOUND);
>
> are there artifacts or some loud trash without this cliping?
>
there are some distortion when listening to some of the samples like V6_text.mov
but it is more because it louder than anything else.
I looked at the ouput and the biggest out of bound value I could see
is 2.399457 for 1.
Playing with the QCELP_SCALE factor might help instead of the clipping.
>
> [...]
>> +/**
>> + * Computes the Pa or Qa coefficients needed for LSP to LPC conversion.
>> + * We only need to calculate the 6 first elements of the polynomial.
>> + *
>> + * @param lspf line spectral pair frequencies
>> + * @param v_poly polynomial input/output as a vector
>> + *
>> + * TIA/EIA/IS-733 2.4.3.3.5-1/2
>> + */
>> +static void lsp2poly(const float *lspf,
>> + float *v_poly) {
>> + float val, *v;
>> + int i;
>> +
>> + // optimization to simplify calculation in loop
>> + v_poly++;
>> +
>> + for (i = 0; i < 10; i += 2) {
>> + val = -2 * cos(M_PI * *lspf);
>> + lspf += 2;
>> + v = v_poly + FFMIN(4, i);
>> +
>> + if (i < 4) {
>> + v[2] = v[0];
>> + v[1] = v[0] * val + v[-1];
>> + }
>> + for ( ; v > v_poly; v--)
>> + v[0] = v[0]
>> + + v[-1] * val
>> + + v[-2];
>> + v[0] += v[-1] * val;
>> + }
>> +}
>> +
>> +/**
>> + * Reconstructs LPC coefficients from the line spectral pair frequencies
>> + * and performs bandwidth expansion.
>> + *
>> + * @param lspf line spectral pair frequencies
>> + * @param lpc linear predictive coding coefficients
>> + *
>> + * @note: bandwith_expansion_coeff could be precalculated into a table
>> + * but it seems to be slower on x86
>> + *
>> + * TIA/EIA/IS-733 2.4.3.3.5
>> + */
>> +void qcelp_lspf2lpc(const float *lspf,
>> + float *lpc) {
>> + float pa[6], qa[6];
>> + int i;
>> + float bandwith_expansion_coeff = -QCELP_BANDWITH_EXPANSION_COEFF;
>> +
>
>> + pa[0] = 0.5;
>> + pa[1] = 0.5;
>> + lsp2poly(lspf, pa);
>> +
>> + qa[0] = 0.5;
>> + qa[1] = -0.5;
>> + lsp2poly(lspf + 1, qa);
>
> it should be faster to deal with 0.5 + 0.5x / 0.5 - 0.5x after building
> the polynomials
done
>
> anyway, see ff_acelp_lsp2lpc
done, it is globally ~10% faster.
but it gives some significant difference in the WAV output.
I doule check, and it seems to come from the float rounding :(
here is the list of result of 'tiny_psnr old.wav new.wav'.
101.mov: audio mismatchs from previous build
stddev: 3.30 PSNR: 37.73 bytes: 250284/ 250284
V6_text.mov: audio mismatchs from previous build
stddev: 4.34 PSNR: 35.36 bytes: 11371244/ 11371244
blue_earth.mov: audio mismatchs from previous build
stddev: 3.24 PSNR: 37.89 bytes: 19681324/ 19681324
codeblue-interrupt01.mov: audio mismatchs from previous build
stddev: 4.70 PSNR: 34.67 bytes: 276524/ 276524
codeblue-interrupt06.mov: audio mismatchs from previous build
stddev: 3.21 PSNR: 37.98 bytes: 642924/ 642924
codeblue-plot08motor.mov: audio mismatchs from previous build
stddev: 3.25 PSNR: 37.88 bytes: 1534764/ 1534764
h263.mov: audio mismatchs from previous build
stddev: 3.44 PSNR: 37.37 bytes: 13511404/ 13511404
h263.trashed.mov: audio mismatchs from previous build
stddev: 3.44 PSNR: 37.37 bytes: 13511404/ 13511404
installfect_export.mov: audio mismatchs from previous build
stddev: 5.78 PSNR: 32.88 bytes: 10448044/ 10448044
oldepisode.mov: audio mismatchs from previous build
stddev: 7.63 PSNR: 30.46 bytes: 4588844/ 4588844
schlangenmannliten.mov: audio mismatchs from previous build
stddev: 2.48 PSNR: 40.23 bytes: 8820844/ 8820844
surge-1-16-B-Qclp.mov: audio mismatchs from previous build
stddev: 5.94 PSNR: 32.64 bytes: 1156524/ 1156524
vidoo_MP4_audio_Qcelp13k.k3g: audio mismatchs from previous build
stddev: 1.29 PSNR: 45.89 bytes: 743724/ 743724
8fe3b9dcd6d7e6db3375521c5c1b_Video_041606_002.3g2: audio mismatchs
from previous build
stddev: 3.68 PSNR: 36.80 bytes: 721004/ 721004
Test3gpp-mp4a.3g2: audio mismatchs from previous build
stddev: 1.21 PSNR: 46.40 bytes: 219244/ 219244
c8wwz2m0.3g2: audio mismatchs from previous build
stddev: 0.89 PSNR: 49.05 bytes: 241964/ 241964
qtaudio-qcelp-problem.3g2: audio mismatchs from previous build
stddev: 2.68 PSNR: 39.54 bytes: 208044/ 208044
test.3g2: audio same as previous build
tube.3g2: audio mismatchs from previous build
stddev: 0.01 PSNR: 83.09 bytes: 113004/ 113004
zg3dx2d6.3g2: audio mismatchs from previous build
stddev: 2.69 PSNR: 39.52 bytes: 486444/ 486444
thanks again for the review
patch round 12 attached
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: qcelp-round12-decoder.patch.txt
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081120/30f939e9/attachment.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: qcelp-round12-lsp.patch.txt
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081120/30f939e9/attachment-0001.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: qcelp-round12-doc-glue.patch.txt
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081120/30f939e9/attachment-0002.txt>
More information about the ffmpeg-devel
mailing list