On 09/11/2010 04:47 PM, Marcelo Galvão Póvoa wrote:
On 9 September 2010 16:11, Vitor Sessak<[email protected]>  wrote:
On 09/07/2010 02:05 AM, Marcelo Galvão Póvoa wrote:

On 6 September 2010 11:31, Vitor Sessak<[email protected]>    wrote:

On 09/06/2010 02:46 AM, Marcelo Galvăo Póvoa wrote:


[...]

Can celp_filters.c:ff_celp_circ_addf() simplify this?


I already gave some thought to that but I couldn't figure out how to
use ff_celp_circ_addf() there. I wrote the algorithm the simplest way
I could think of.

Try

        for (i = 0; i<  AMRWB_SFR_SIZE; i++)
            if (fixed_vector[i])
                ff_celp_circ_addf(buf, buf, coef, i, fixed_vector[i],
                                  AMRWB_SFR_SIZE);



That's right indeed, thanks!

/*
 * AMR wideband decoder
 * Copyright (c) 2010 Marcelo Galvao Povoa
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A particular PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "libavutil/lfg.h"

#include "avcodec.h"
#include "get_bits.h"
#include "lsp.h"
#include "celp_math.h"
#include "celp_filters.h"
#include "acelp_filters.h"
#include "acelp_vectors.h"
#include "acelp_pitch_delay.h"

#include "amrwbdata.h"

No need to include amr.h?


typedef struct {
    AMRWBFrame                             frame; ///< AMRWB parameters decoded 
from bitstream
    enum Mode                        fr_cur_mode; ///< mode index of current 
frame
    uint8_t                           fr_quality; ///< frame quality index (FQI)
    float                      isf_cur[LP_ORDER]; ///< working ISF vector from 
current frame
    float                   isf_q_past[LP_ORDER]; ///< quantized ISF vector of 
the previous frame
    float               isf_past_final[LP_ORDER]; ///< final processed ISF 
vector of the previous frame
    double                      isp[4][LP_ORDER]; ///< ISP vectors from current 
frame
    double               isp_sub4_past[LP_ORDER]; ///< ISP vector for the 4th 
subframe of the previous frame

    float                   lp_coef[4][LP_ORDER]; ///< Linear Prediction 
Coefficients from ISP vector

    uint8_t                       base_pitch_lag; ///< integer part of pitch 
lag for the next relative subframe
    uint8_t                        pitch_lag_int; ///< integer part of pitch 
lag of the previous subframe

    float excitation_buf[AMRWB_P_DELAY_MAX + LP_ORDER + 2 + AMRWB_SFR_SIZE]; 
///< current excitation and all necessary excitation history
    float                            *excitation; ///< points to current 
excitation in excitation_buf[]

    float           pitch_vector[AMRWB_SFR_SIZE]; ///< adaptive codebook 
(pitch) vector for current subframe
    float           fixed_vector[AMRWB_SFR_SIZE]; ///< algebraic codebook 
(fixed) vector for current subframe

    float                    prediction_error[4]; ///< quantified prediction 
errors {20log10(^gamma_gc)} for previous four subframes
    float                          pitch_gain[6]; ///< quantified pitch gains 
for the current and previous five subframes
    float                          fixed_gain[2]; ///< quantified fixed gains 
for the current and previous subframes

    float                              tilt_coef; ///< {beta_1} related to the 
voicing of the previous subframe

    float                 prev_sparse_fixed_gain; ///< previous fixed gain; used by 
anti-sparseness to determine "onset"
    uint8_t                    prev_ir_filter_nr; ///< previous impulse response filter 
"impNr": 0 - strong, 1 - medium, 2 - none
    float                           prev_tr_gain; ///< previous initial gain 
used by noise enhancer for threshold

    float samples_az[LP_ORDER + AMRWB_SFR_SIZE];         ///< low-band samples 
and memory from synthesis at 12.8kHz
    float samples_up[UPS_MEM_SIZE + AMRWB_SFR_SIZE];     ///< low-band samples 
and memory processed for upsampling
    float samples_hb[LP_ORDER_16k + AMRWB_SFR_SIZE_16k]; ///< high-band samples 
and memory from synthesis at 16kHz


    float          hpf_31_mem[4], hpf_400_mem[4]; ///< previous values in the 
high pass filters

I think now just two elements for the filter memory should be enough.

diff --git a/libavcodec/amrwbdata.h b/libavcodec/amrwbdata.h
new file mode 100644
index 0000000..6344763
--- /dev/null
+++ b/libavcodec/amrwbdata.h

/** [i][j] is the number of pulses present in track j at mode i */
static const int pulses_nb_per_mode_tr[][4] = {
    {1, 1, 0, 0}, {1, 1, 1, 1}, {2, 2, 2, 2},
    {3, 3, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4},
    {5, 5, 4, 4}, {6, 6, 6, 6}, {6, 6, 6, 6}
};

uint8_t?

And I have no further comments :D

-Vitor
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc

Reply via email to