From: <dg...@us...> - 2006-06-17 20:44:00
|
Update of /cvsroot/xine/xine-lib/src/libfaad In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv26177/src/libfaad Modified Files: common.h output.c ps_dec.c sbr_dec.c specrec.c Log Message: Add patch for faad 5.1 support, sent by Darren Salt on mailing list. Index: common.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libfaad/common.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- common.h 30 Oct 2005 01:21:53 -0000 1.16 +++ common.h 17 Jun 2006 20:43:57 -0000 1.17 @@ -32,10 +32,12 @@ extern "C" { #endif -#ifdef HAVE_CONFIG_H -# include "../config.h" +#ifdef __CYGWIN__ +#define __STRICT_ANSI__ #endif +#include "../config.h" + #define INLINE __inline #if 0 //defined(_WIN32) && !defined(_WIN32_WCE) #define ALIGN __declspec(align(16)) @@ -61,7 +63,7 @@ /* Use if target platform has address generators with autoincrement */ //#define PREFER_POINTERS -#ifdef _WIN32_WCE +#if defined(_WIN32_WCE) || defined(__arm__) #define FIXED_POINT #endif @@ -117,6 +119,9 @@ # ifdef MAIN_DEC # undef MAIN_DEC # endif +# ifdef SBR_DEC +# undef SBR_DEC +# endif #endif // FIXED_POINT #ifdef DRM @@ -326,6 +331,8 @@ #else +#include <math.h> + #ifdef HAVE_LRINTF # define HAS_LRINTF # define _ISOC9X_SOURCE 1 @@ -334,8 +341,6 @@ # define __USE_ISOC99 1 #endif - #include <math.h> - #ifdef HAVE_SINF # define sin sinf #error Index: output.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libfaad/output.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- output.c 29 Oct 2005 23:57:07 -0000 1.7 +++ output.c 17 Jun 2006 20:43:57 -0000 1.8 @@ -463,7 +463,7 @@ } } -void* output_to_PCM(NeAACDecHandle hDecoder, +static void* output_to_PCM_orig(NeAACDecHandle hDecoder, real_t **input, void *sample_buffer, uint8_t channels, uint16_t frame_len, uint8_t format) { @@ -554,4 +554,56 @@ return sample_buffer; } +void *output_to_PCM(NeAACDecHandle hDecoder, + real_t **input, void *sample_buffer, uint8_t channels, + uint16_t frame_len, uint8_t format) +{ + int ch, i; + int16_t *short_sample_buffer; + real_t *ch0, *ch1, *ch2, *ch3, *ch4; + + if (format != FAAD_FMT_16BIT) + return output_to_PCM_orig(hDecoder, input, sample_buffer, channels, frame_len, format); + + short_sample_buffer = (int16_t *)sample_buffer; + ch0 = input[hDecoder->internal_channel[0]]; + ch1 = input[hDecoder->internal_channel[1]]; + ch2 = input[hDecoder->internal_channel[2]]; + ch3 = input[hDecoder->internal_channel[3]]; + ch4 = input[hDecoder->internal_channel[4]]; + + if (hDecoder->downMatrix) + { + for (i = 0; i < frame_len; ++i) + { + int32_t tmp = (ch1[i] + ((ch0[i] + ch3[i]) >> 1) + ((ch0[i] + ch3[i]) >> 2) + (1 << (REAL_BITS))) >> (REAL_BITS + 1); + if ((tmp + 0x8000) & ~0xffff) + tmp = ~(tmp >> 31) - 0x8000; + short_sample_buffer[0] = tmp; + tmp = (ch2[i] + ((ch0[i] + ch4[i]) >> 1) + ((ch0[i] + ch4[i]) >> 2) + (1 << (REAL_BITS))) >> (REAL_BITS + 1); + if ((tmp + 0x8000) & ~0xffff) + tmp = ~(tmp >> 31) - 0x8000; + short_sample_buffer[1] = tmp; + short_sample_buffer += channels; + } + return sample_buffer; + } + + /* Copy output to a standard PCM buffer */ + for (i = 0; i < frame_len; ++i) + { + for (ch = 0; ch < channels; ++ch) + { + int32 tmp = input[hDecoder->internal_channel[ch]][i]; + tmp += (1 << (REAL_BITS - 1)); + tmp >>= REAL_BITS; + if ((tmp + 0x8000) & ~0xffff) + tmp = ~(tmp >> 31) - 0x8000; + *(short_sample_buffer++) = tmp; + } + } + + return sample_buffer; +} + #endif Index: ps_dec.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libfaad/ps_dec.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ps_dec.c 30 Oct 2005 00:50:19 -0000 1.1 +++ ps_dec.c 17 Jun 2006 20:43:57 -0000 1.2 @@ -159,7 +159,7 @@ /* static function declarations */ static void ps_data_decode(ps_info *ps); -static hyb_info *hybrid_init(); +static hyb_info *hybrid_init(void); static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid); static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); @@ -189,7 +189,7 @@ /* */ -static hyb_info *hybrid_init() +static hyb_info *hybrid_init(void) { uint8_t i; @@ -1935,8 +1935,8 @@ /* main Parametric Stereo decoding function */ uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { - qmf_t X_hybrid_left[32][32] = {{0}}; - qmf_t X_hybrid_right[32][32] = {{0}}; + qmf_t X_hybrid_left[32][32] = {{{0}}}; + qmf_t X_hybrid_right[32][32] = {{{0}}}; /* delta decoding of the bitstream data */ ps_data_decode(ps); Index: sbr_dec.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libfaad/sbr_dec.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- sbr_dec.c 29 Oct 2005 23:57:07 -0000 1.8 +++ sbr_dec.c 17 Jun 2006 20:43:57 -0000 1.9 @@ -526,8 +526,8 @@ uint8_t l, k; uint8_t dont_process = 0; uint8_t ret = 0; - ALIGN qmf_t X_left[38][64] = {{0}}; - ALIGN qmf_t X_right[38][64] = {{0}}; /* must set this to 0 */ + ALIGN qmf_t X_left[38][64] = {{{0}}}; + ALIGN qmf_t X_right[38][64] = {{{0}}}; /* must set this to 0 */ if (sbr == NULL) return 20; Index: specrec.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libfaad/specrec.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- specrec.c 29 Oct 2005 23:57:07 -0000 1.9 +++ specrec.c 17 Jun 2006 20:43:57 -0000 1.10 @@ -673,29 +673,19 @@ /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { - /* allocate the state only when needed */ - if (hDecoder->pred_stat[channel] == NULL) - { - hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); + hDecoder->pred_stat[channel] = (pred_state*)realloc(hDecoder->pred_stat[channel], hDecoder->frameLength * sizeof(pred_state)); reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); - } } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { - /* allocate the state only when needed */ - if (hDecoder->lt_pred_stat[channel] == NULL) - { - hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); + hDecoder->lt_pred_stat[channel] = (int16_t*)realloc(hDecoder->lt_pred_stat[channel], hDecoder->frameLength*4 * sizeof(int16_t)); memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } } #endif - if (hDecoder->time_out[channel] == NULL) - { mul = 1; #ifdef SBR_DEC hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; @@ -706,41 +696,28 @@ hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; } #endif - hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); + hDecoder->time_out[channel] = (real_t*)realloc(hDecoder->time_out[channel], mul*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } #if (defined(PS_DEC) || defined(DRM_PS)) if (output_channels == 2) { - if (hDecoder->time_out[channel+1] == NULL) - { - hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); + hDecoder->time_out[channel+1] = (real_t*)realloc(hDecoder->time_out[channel+1], mul*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } } #endif - if (hDecoder->fb_intermed[channel] == NULL) - { - hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); + hDecoder->fb_intermed[channel] = (real_t*)realloc(hDecoder->fb_intermed[channel], hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); - } #ifdef SSR_DEC if (hDecoder->object_type == SSR) { - if (hDecoder->ssr_overlap[channel] == NULL) - { - hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->prev_fmd[channel] == NULL) - { uint16_t k; - hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + hDecoder->ssr_overlap[channel] = (real_t*)realloc(hDecoder->ssr_overlap[channel], 2*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); + hDecoder->prev_fmd[channel] = (real_t*)realloc(hDecoder->prev_fmd[channel], 2*hDecoder->frameLength*sizeof(real_t)); for (k = 0; k < 2*hDecoder->frameLength; k++) hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); - } } #endif @@ -865,22 +842,14 @@ /* always allocate 2 channels, PS can always "suddenly" turn up */ #if (defined(PS_DEC) || defined(DRM_PS)) - output_channels = 2; + output_channels = hDecoder->ps_used[hDecoder->fr_ch_ele] ? 2 : 1; #else output_channels = 1; #endif - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) + if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] < output_channels) { - /* element_output_channels not set yet */ hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; - } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { - /* element inconsistency */ - return 21; - } - - if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) - { retval = allocate_single_channel(hDecoder, sce->channel, output_channels); if (retval > 0) return retval; @@ -1026,11 +995,10 @@ { return 23; } -#endif /* copy L to R when no PS is used */ #if (defined(PS_DEC) || defined(DRM_PS)) - if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0)) + if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && (output_channels == 2)) { uint8_t ele = hDecoder->fr_ch_ele; uint8_t ch = sce->channel; @@ -1040,6 +1008,7 @@ memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); } #endif +#endif return 0; } |