[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