[FFmpeg-soc] [soc]: r4096 - amr/amrnbfloatdec.c
kmalaussene
subversion at mplayerhq.hu
Thu Feb 19 20:52:03 CET 2009
Author: kmalaussene
Date: Thu Feb 19 20:52:02 2009
New Revision: 4096
Log:
Fix the choice of ir_filter for the phase dispersion,
based on the reference code.
Modified:
amr/amrnbfloatdec.c
Modified: amr/amrnbfloatdec.c
==============================================================================
--- amr/amrnbfloatdec.c Thu Feb 19 05:47:00 2009 (r4095)
+++ amr/amrnbfloatdec.c Thu Feb 19 20:52:02 2009 (r4096)
@@ -78,6 +78,7 @@ typedef struct AMRContext {
int diff_count; ///< the number of subframes for which diff has been above 0.65
uint8_t prev_ir_filter_strength; ///< previous impulse response filter strength; 0 - strong, 1 - medium, 2 - none
+ uint8_t ir_filter_onset; ///< flag for impulse response filter strength
float samples_in[LP_FILTER_ORDER + AMR_SUBFRAME_SIZE]; ///< floating point samples
@@ -692,47 +693,6 @@ static float fixed_gain_prediction(float
/// @{
/**
- * Comparison function for use with qsort.
- *
- * @param a first value for comparison
- * @param b second value for comparison
- * @return a-b : the result of the comparison
- */
-
-int qsort_compare(const void *a, const void *b)
-{
- float diff = *(const float *)a - *(const float *)b;
- if(diff > 0.0f)
- return 1;
- if(diff < 0.0f)
- return -1;
- return 0;
-}
-
-/**
- * Find the median of some float values.
- *
- * @param values pointer to the values of which to find the median
- * @param n number of values
- * @return the median value
- */
-
-static float medianf(float *values, int n)
-{
- float temp[9]; // largest n used for median calculation is 9
-
- memcpy(temp, values, n * sizeof(float));
-
- qsort(temp, n, sizeof(float), qsort_compare);
-
- if(n&1) {
- return temp[ n>>1 ];
- }else {
- return (temp[ (n>>1)-1 ] + temp[ n>>1 ])/2.0;
- }
-}
-
-/**
* Circularly convolve the fixed vector with a phase dispersion impulse response
* filter.
*
@@ -793,12 +753,28 @@ void do_phase_dispersion(AMRContext *p)
// detect 'onset'
if(p->fixed_gain[4] > 2.0*p->fixed_gain[3]) {
- ir_filter_strength = FFMIN(ir_filter_strength + 1, 2);
- }else if(ir_filter_strength == 0 && medianf(p->pitch_gain, 5) >= 0.6 &&
- ir_filter_strength > p->prev_ir_filter_strength + 1) {
- ir_filter_strength = p->prev_ir_filter_strength + 1;
+ p->ir_filter_onset = 2;
+ }else if(p->ir_filter_onset) {
+ p->ir_filter_onset--;
}
+ if(!p->ir_filter_onset) {
+ int i, count = 0;
+
+ for(i=0; i<5; i++)
+ if(p->pitch_gain[i] < 0.6)
+ count++;
+ if(count > 2)
+ ir_filter_strength = 0;
+
+ if(ir_filter_strength > p->prev_ir_filter_strength + 1)
+ ir_filter_strength--;
+ } else if(ir_filter_strength < 2) {
+ ir_filter_strength++;
+ }
+
+ //FIXME: disable filtering for very low level of fixed_gain
+
if(p->cur_frame_mode != MODE_74 && p->cur_frame_mode != MODE_102 &&
p->cur_frame_mode != MODE_122 && ir_filter_strength < 2) {
const float *ir_filter;
More information about the FFmpeg-soc
mailing list