|  |  | @@ -25,9 +25,6 @@ | 
		
	
		
			
			|  |  |  | #include "avcodec.h" | 
		
	
		
			
			|  |  |  | #include "dsputil.h" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | //#define DEBUG_PARAMS | 
		
	
		
			
			|  |  |  | //#define DEBUG_TRACE | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* size of blocks */ | 
		
	
		
			
			|  |  |  | #define BLOCK_MIN_BITS 7 | 
		
	
		
			
			|  |  |  | #define BLOCK_MAX_BITS 11 | 
		
	
	
		
			
				|  |  | @@ -127,57 +124,20 @@ static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #include "wmadata.h" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #ifdef DEBUG_TRACE | 
		
	
		
			
			|  |  |  | #include <stdarg.h> | 
		
	
		
			
			|  |  |  | int frame_count; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static FILE *flog; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void trace(const char *fmt, ...) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | va_list ap; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!flog) { | 
		
	
		
			
			|  |  |  | flog = fopen("/tmp/out.log", "w"); | 
		
	
		
			
			|  |  |  | setlinebuf(flog); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | va_start(ap, fmt); | 
		
	
		
			
			|  |  |  | vfprintf(flog, fmt, ap); | 
		
	
		
			
			|  |  |  | va_end(ap); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #define get_bits(s, n) get_bits_trace(s, n) | 
		
	
		
			
			|  |  |  | #define get_vlc(s, vlc) get_vlc_trace(s, vlc) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | unsigned int get_bits_trace(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | unsigned int val; | 
		
	
		
			
			|  |  |  | val = (get_bits)(s, n); | 
		
	
		
			
			|  |  |  | trace("get_bits(%d) : 0x%x\n", n, val); | 
		
	
		
			
			|  |  |  | return val; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static int get_vlc_trace(GetBitContext *s, VLC *vlc) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int code; | 
		
	
		
			
			|  |  |  | code = (get_vlc)(s, vlc); | 
		
	
		
			
			|  |  |  | trace("get_vlc() : %d\n", code); | 
		
	
		
			
			|  |  |  | return code; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #ifdef TRACE | 
		
	
		
			
			|  |  |  | int frame_count = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static void dump_shorts(const char *name, const short *tab, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int i; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | trace("%s[%d]:\n", name, n); | 
		
	
		
			
			|  |  |  | tprintf("%s[%d]:\n", name, n); | 
		
	
		
			
			|  |  |  | for(i=0;i<n;i++) { | 
		
	
		
			
			|  |  |  | if ((i & 7) == 0) | 
		
	
		
			
			|  |  |  | trace("%4d: ", i); | 
		
	
		
			
			|  |  |  | trace(" %5d.0", tab[i]); | 
		
	
		
			
			|  |  |  | tprintf("%4d: ", i); | 
		
	
		
			
			|  |  |  | tprintf(" %5d.0", tab[i]); | 
		
	
		
			
			|  |  |  | if ((i & 7) == 7) | 
		
	
		
			
			|  |  |  | trace("\n"); | 
		
	
		
			
			|  |  |  | tprintf("\n"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -185,22 +145,17 @@ static void dump_floats(const char *name, int prec, const float *tab, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int i; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | trace("%s[%d]:\n", name, n); | 
		
	
		
			
			|  |  |  | tprintf("%s[%d]:\n", name, n); | 
		
	
		
			
			|  |  |  | for(i=0;i<n;i++) { | 
		
	
		
			
			|  |  |  | if ((i & 7) == 0) | 
		
	
		
			
			|  |  |  | trace("%4d: ", i); | 
		
	
		
			
			|  |  |  | trace(" %8.*f", prec, tab[i]); | 
		
	
		
			
			|  |  |  | tprintf("%4d: ", i); | 
		
	
		
			
			|  |  |  | tprintf(" %8.*f", prec, tab[i]); | 
		
	
		
			
			|  |  |  | if ((i & 7) == 7) | 
		
	
		
			
			|  |  |  | trace("\n"); | 
		
	
		
			
			|  |  |  | tprintf("\n"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if ((i & 7) != 0) | 
		
	
		
			
			|  |  |  | trace("\n"); | 
		
	
		
			
			|  |  |  | tprintf("\n"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #define trace(fmt, args...) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* XXX: use same run/length optimization as mpeg decoders */ | 
		
	
	
		
			
				|  |  | @@ -359,16 +314,14 @@ static int wma_decode_init(AVCodecContext * avctx) | 
		
	
		
			
			|  |  |  | high_freq = high_freq * 0.5; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #ifdef DEBUG_PARAMS | 
		
	
		
			
			|  |  |  | printf("flags1=0x%x flags2=0x%x\n", flags1, flags2); | 
		
	
		
			
			|  |  |  | printf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", | 
		
	
		
			
			|  |  |  | dprintf("flags1=0x%x flags2=0x%x\n", flags1, flags2); | 
		
	
		
			
			|  |  |  | dprintf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", | 
		
	
		
			
			|  |  |  | s->version, s->nb_channels, s->sample_rate, s->bit_rate, | 
		
	
		
			
			|  |  |  | s->block_align); | 
		
	
		
			
			|  |  |  | printf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n", | 
		
	
		
			
			|  |  |  | dprintf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n", | 
		
	
		
			
			|  |  |  | bps, bps1, high_freq, s->byte_offset_bits); | 
		
	
		
			
			|  |  |  | printf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", | 
		
	
		
			
			|  |  |  | dprintf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", | 
		
	
		
			
			|  |  |  | s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* compute the scale factor band sizes for each MDCT block size */ | 
		
	
		
			
			|  |  |  | { | 
		
	
	
		
			
				|  |  | @@ -458,28 +411,28 @@ static int wma_decode_init(AVCodecContext * avctx) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | s->exponent_high_sizes[k] = j; | 
		
	
		
			
			|  |  |  | #if 0 | 
		
	
		
			
			|  |  |  | trace("%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ", | 
		
	
		
			
			|  |  |  | tprintf("%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ", | 
		
	
		
			
			|  |  |  | s->frame_len >> k, | 
		
	
		
			
			|  |  |  | s->coefs_end[k], | 
		
	
		
			
			|  |  |  | s->high_band_start[k], | 
		
	
		
			
			|  |  |  | s->exponent_high_sizes[k]); | 
		
	
		
			
			|  |  |  | for(j=0;j<s->exponent_high_sizes[k];j++) | 
		
	
		
			
			|  |  |  | trace(" %d", s->exponent_high_bands[k][j]); | 
		
	
		
			
			|  |  |  | trace("\n"); | 
		
	
		
			
			|  |  |  | tprintf(" %d", s->exponent_high_bands[k][j]); | 
		
	
		
			
			|  |  |  | tprintf("\n"); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #ifdef DEBUG_TRACE | 
		
	
		
			
			|  |  |  | #ifdef TRACE | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int i, j; | 
		
	
		
			
			|  |  |  | for(i = 0; i < s->nb_block_sizes; i++) { | 
		
	
		
			
			|  |  |  | trace("%5d: n=%2d:", | 
		
	
		
			
			|  |  |  | tprintf("%5d: n=%2d:", | 
		
	
		
			
			|  |  |  | s->frame_len >> i, | 
		
	
		
			
			|  |  |  | s->exponent_sizes[i]); | 
		
	
		
			
			|  |  |  | for(j=0;j<s->exponent_sizes[i];j++) | 
		
	
		
			
			|  |  |  | trace(" %d", s->exponent_bands[i][j]); | 
		
	
		
			
			|  |  |  | trace("\n"); | 
		
	
		
			
			|  |  |  | tprintf(" %d", s->exponent_bands[i][j]); | 
		
	
		
			
			|  |  |  | tprintf("\n"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #endif | 
		
	
	
		
			
				|  |  | @@ -511,7 +464,7 @@ static int wma_decode_init(AVCodecContext * avctx) | 
		
	
		
			
			|  |  |  | else | 
		
	
		
			
			|  |  |  | s->noise_mult = 0.04; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | #if defined(DEBUG_TRACE) | 
		
	
		
			
			|  |  |  | #ifdef TRACE | 
		
	
		
			
			|  |  |  | for(i=0;i<NOISE_TAB_SIZE;i++) | 
		
	
		
			
			|  |  |  | s->noise_table[i] = 1.0 * s->noise_mult; | 
		
	
		
			
			|  |  |  | #else | 
		
	
	
		
			
				|  |  | @@ -741,7 +694,7 @@ static int wma_decode_block(WMADecodeContext *s) | 
		
	
		
			
			|  |  |  | int nb_coefs[MAX_CHANNELS]; | 
		
	
		
			
			|  |  |  | float mdct_norm; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | trace("***decode_block: %d:%d\n", frame_count - 1, s->block_num); | 
		
	
		
			
			|  |  |  | tprintf("***decode_block: %d:%d\n", frame_count - 1, s->block_num); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* compute current block length */ | 
		
	
		
			
			|  |  |  | if (s->use_variable_block_len) { | 
		
	
	
		
			
				|  |  | @@ -987,7 +940,7 @@ static int wma_decode_block(WMADecodeContext *s) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | exp_power[j] = e2 / n; | 
		
	
		
			
			|  |  |  | last_high_band = j; | 
		
	
		
			
			|  |  |  | trace("%d: power=%f (%d)\n", j, exp_power[j], n); | 
		
	
		
			
			|  |  |  | tprintf("%d: power=%f (%d)\n", j, exp_power[j], n); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | exp_ptr += n; | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -1045,7 +998,7 @@ static int wma_decode_block(WMADecodeContext *s) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #ifdef DEBUG_TRACE | 
		
	
		
			
			|  |  |  | #ifdef TRACE | 
		
	
		
			
			|  |  |  | for(ch = 0; ch < s->nb_channels; ch++) { | 
		
	
		
			
			|  |  |  | if (s->channel_coded[ch]) { | 
		
	
		
			
			|  |  |  | dump_floats("exponents", 3, s->exponents[ch], s->block_len); | 
		
	
	
		
			
				|  |  | @@ -1062,9 +1015,7 @@ static int wma_decode_block(WMADecodeContext *s) | 
		
	
		
			
			|  |  |  | /* no need to optimize this case because it should almost | 
		
	
		
			
			|  |  |  | never happen */ | 
		
	
		
			
			|  |  |  | if (!s->channel_coded[0]) { | 
		
	
		
			
			|  |  |  | #ifdef DEBUG_TRACE | 
		
	
		
			
			|  |  |  | trace("rare ms-stereo case happened\n"); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | tprintf("rare ms-stereo case happened\n"); | 
		
	
		
			
			|  |  |  | memset(s->coefs[0], 0, sizeof(float) * s->block_len); | 
		
	
		
			
			|  |  |  | s->channel_coded[0] = 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -1176,7 +1127,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples) | 
		
	
		
			
			|  |  |  | int16_t *ptr; | 
		
	
		
			
			|  |  |  | float *iptr; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | trace("***decode_frame: %d size=%d\n", frame_count++, s->frame_len); | 
		
	
		
			
			|  |  |  | tprintf("***decode_frame: %d size=%d\n", frame_count++, s->frame_len); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* read each block */ | 
		
	
		
			
			|  |  |  | s->block_num = 0; | 
		
	
	
		
			
				|  |  | @@ -1213,7 +1164,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples) | 
		
	
		
			
			|  |  |  | s->frame_len * sizeof(float)); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #ifdef DEBUG_TRACE | 
		
	
		
			
			|  |  |  | #ifdef TRACE | 
		
	
		
			
			|  |  |  | dump_shorts("samples", samples, n * s->nb_channels); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
	
		
			
				|  |  | @@ -1228,7 +1179,7 @@ static int wma_decode_superframe(AVCodecContext *avctx, | 
		
	
		
			
			|  |  |  | uint8_t *q; | 
		
	
		
			
			|  |  |  | int16_t *samples; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | trace("***decode_superframe:\n"); | 
		
	
		
			
			|  |  |  | tprintf("***decode_superframe:\n"); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | samples = data; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | 
 |