diff --git a/Makefile b/Makefile index bd4cf192ba..759a0acb9c 100644 --- a/Makefile +++ b/Makefile @@ -123,7 +123,8 @@ video_output_obj = video_output/video_output.o \ video_output/video_x11.o \ video_output/video_graphics.o -audio_decoder_obj = audio_decoder/audio_decoder.o +audio_decoder_obj = audio_decoder/audio_decoder.o \ + audio_decoder/audio_math.o generic_decoder_obj = generic_decoder/generic_decoder.o diff --git a/include/audio_decoder.h b/include/audio_decoder.h index 0091c98a7e..f2b3a39f3e 100644 --- a/include/audio_decoder.h +++ b/include/audio_decoder.h @@ -22,7 +22,6 @@ * TODO : * - Etudier /usr/include/asm/bitops.h d'un peu plus près, bien qu'il ne me * semble pas être possible d'utiliser ces fonctions ici - * - extern inline ? #define ? * - N'y aurait-t-il pas moyen de se passer d'un buffer de bits, en travaillant * directement sur le flux PES ? */ @@ -128,911 +127,3 @@ typedef struct adec_thread_s ******************************************************************************/ adec_thread_t * adec_CreateThread ( input_thread_t * p_input /* !! , aout_thread_t * p_aout !! */ ); void adec_DestroyThread ( adec_thread_t * p_adec ); - -/* Fast 32 points Discrete Cosine Transform (289 additions and multiplications) - F(u)=alpha(u)*SUM(x=0, xactual + b->pos; - y = (b->actual == b->v1 ? b->v2 : b->v1) + b->pos; - x[0] = -(y[0] = c2 * (tt1 - tt2 )); /* t17 */ - x[256] = 0; y[256] = tt1 + tt2; /* t1 */ - t25 = c2 * (tt3 - tt4 ); - t9 = tt3 + tt4; - t21 = c2 * (tt5 - tt6 ); - t5 = tt5 + tt6; - t29 = c2 * (tt7 - tt8 ); - t13 = tt7 + tt8; - t19 = c2 * (tt9 - tt10); - t3 = tt9 + tt10; - t27 = c2 * (tt11 - tt12); - t11 = tt11 + tt12; - t23 = c2 * (tt13 - tt14); - t7 = tt13 + tt14; - t31 = c2 * (tt15 - tt16); - t15 = tt15 + tt16; - t18 = c2 * (tt17 - tt18); - t2 = tt17 + tt18; - t26 = c2 * (tt19 - tt20); - t10 = tt19 + tt20; - t22 = c2 * (tt21 - tt22); - t6 = tt21 + tt22; - t30 = c2 * (tt23 - tt24); - t14 = tt23 + tt24; - t20 = c2 * (tt25 - tt26); - t4 = tt25 + tt26; - t28 = c2 * (tt27 - tt28); - t12 = tt27 + tt28; - t24 = c2 * (tt29 - tt30); - t8 = tt29 + tt30; - t32 = c2 * (tt31 - tt32); - t16 = tt31 + tt32; - /* Do the sums */ - /* Keep on splitting the result */ - y[384] = y[128] = t9 - (x[128] = -(x[384] = t25)); /* t25, t9 */ - t10 += t26; - t11 += t27; - t12 += t28; - t13 += t29; - t14 += t30; - t15 += t31; - t16 += t32; - y[320] = y[192] = t5 + t13; /* t5 */ - y[448] = y[64] = t13 + t21; /* t13 */ - x[64] = -(x[448] = t21 - (x[192] = -(x[320] = t29))); /* t29, t21 */ - t6 += t14; - t14 += t22; - t22 += t30; - t7 += t15; - t15 += t23; - t23 += t31; - t8 += t16; - t16 += t24; - t24 += t32; - y[288] = y[224] = t3 + t7; /* t3 */ - y[352] = y[160] = t7 + t11; /* t7 */ - y[416] = y[96] = t11 + t15; /* t11 */ - y[480] = y[32] = t15 + t19; /* t15 */ - x[32] = -(x[480] = t19 + t23); /* t19 */ - x[96] = -(x[416] = t23 + t27); /* t23 */ - x[160] = -(x[352] = t27 - (x[224] = -(x[288] = t31))); /* t31, t27 */ - t4 += t8 ; - t8 += t12; - t12 += t16; - t16 += t20; - t20 += t24; - t24 += t28; - t28 += t32; - y[272] = y[240] = t2 + t4; /* t2 */ - y[304] = y[208] = t4 + t6; /* t4 */ - y[336] = y[176] = t6 + t8; /* t6 */ - y[368] = y[144] = t8 + t10; /* t8 */ - y[400] = y[112] = t10 + t12; /* t10 */ - y[432] = y[80] = t12 + t14; /* t12 */ - y[464] = y[48] = t14 + t16; /* t14 */ - y[496] = y[16] = t16 + t18; /* t16 */ - x[16] = -(x[496] = t18 + t20); /* t18 */ - x[48] = -(x[464] = t20 + t22); /* t20 */ - x[80] = -(x[432] = t22 + t24); /* t22 */ - x[112] = -(x[400] = t24 + t26); /* t24 */ - x[144] = -(x[368] = t26 + t28); /* t26 */ - x[176] = -(x[336] = t28 + t30); /* t28 */ - x[208] = -(x[304] = t30 - (x[240] = -(x[272] = t32))); /* t32, t30 */ - /* Note that to be really complete, the DCT should multiply t1 by sqrt(2)/N - and t2 to t32 by 2/N, and would take 321 additions and multiplications. - But that's unuseful in this application. */ -} - -/* Compute 32 PCM (Pulse Code Modulation) samples with a convolution product */ -static /* __inline__ */ void PCM(adec_bank_t *b, s16 **pcm, int jump) -{ - /* scale factor */ -#define F 32768 - /* These values are not in the same order as in Annex 3-B.3 of the ISO/IEC - DIS 11172-3 */ - static const float c[512] = { - 0.000000000 * F, -0.000442505 * F, 0.003250122 * F, -0.007003784 * F, - 0.031082153 * F, -0.078628540 * F, 0.100311279 * F, -0.572036743 * F, - 1.144989014 * F, 0.572036743 * F, 0.100311279 * F, 0.078628540 * F, - 0.031082153 * F, 0.007003784 * F, 0.003250122 * F, 0.000442505 * F, - -0.000015259 * F, -0.000473022 * F, 0.003326416 * F, -0.007919312 * F, - 0.030517578 * F, -0.084182739 * F, 0.090927124 * F, -0.600219727 * F, - 1.144287109 * F, 0.543823242 * F, 0.108856201 * F, 0.073059082 * F, - 0.031478882 * F, 0.006118774 * F, 0.003173828 * F, 0.000396729 * F, - -0.000015259 * F, -0.000534058 * F, 0.003387451 * F, -0.008865356 * F, - 0.029785156 * F, -0.089706421 * F, 0.080688477 * F, -0.628295898 * F, - 1.142211914 * F, 0.515609741 * F, 0.116577148 * F, 0.067520142 * F, - 0.031738281 * F, 0.005294800 * F, 0.003082275 * F, 0.000366211 * F, - -0.000015259 * F, -0.000579834 * F, 0.003433228 * F, -0.009841919 * F, - 0.028884888 * F, -0.095169067 * F, 0.069595337 * F, -0.656219482 * F, - 1.138763428 * F, 0.487472534 * F, 0.123474121 * F, 0.061996460 * F, - 0.031845093 * F, 0.004486084 * F, 0.002990723 * F, 0.000320435 * F, - -0.000015259 * F, -0.000625610 * F, 0.003463745 * F, -0.010848999 * F, - 0.027801514 * F, -0.100540161 * F, 0.057617188 * F, -0.683914185 * F, - 1.133926392 * F, 0.459472656 * F, 0.129577637 * F, 0.056533813 * F, - 0.031814575 * F, 0.003723145 * F, 0.002899170 * F, 0.000289917 * F, - -0.000015259 * F, -0.000686646 * F, 0.003479004 * F, -0.011886597 * F, - 0.026535034 * F, -0.105819702 * F, 0.044784546 * F, -0.711318970 * F, - 1.127746582 * F, 0.431655884 * F, 0.134887695 * F, 0.051132202 * F, - 0.031661987 * F, 0.003005981 * F, 0.002792358 * F, 0.000259399 * F, - -0.000015259 * F, -0.000747681 * F, 0.003479004 * F, -0.012939453 * F, - 0.025085449 * F, -0.110946655 * F, 0.031082153 * F, -0.738372803 * F, - 1.120223999 * F, 0.404083252 * F, 0.139450073 * F, 0.045837402 * F, - 0.031387329 * F, 0.002334595 * F, 0.002685547 * F, 0.000244141 * F, - -0.000030518 * F, -0.000808716 * F, 0.003463745 * F, -0.014022827 * F, - 0.023422241 * F, -0.115921021 * F, 0.016510010 * F, -0.765029907 * F, - 1.111373901 * F, 0.376800537 * F, 0.143264771 * F, 0.040634155 * F, - 0.031005859 * F, 0.001693726 * F, 0.002578735 * F, 0.000213623 * F, - -0.000030518 * F, -0.000885010 * F, 0.003417969 * F, -0.015121460 * F, - 0.021575928 * F, -0.120697021 * F, 0.001068115 * F, -0.791213989 * F, - 1.101211548 * F, 0.349868774 * F, 0.146362305 * F, 0.035552979 * F, - 0.030532837 * F, 0.001098633 * F, 0.002456665 * F, 0.000198364 * F, - -0.000030518 * F, -0.000961304 * F, 0.003372192 * F, -0.016235352 * F, - 0.019531250 * F, -0.125259399 * F, -0.015228271 * F, -0.816864014 * F, - 1.089782715 * F, 0.323318481 * F, 0.148773193 * F, 0.030609131 * F, - 0.029937744 * F, 0.000549316 * F, 0.002349854 * F, 0.000167847 * F, - -0.000030518 * F, -0.001037598 * F, 0.003280640 * F, -0.017349243 * F, - 0.017257690 * F, -0.129562378 * F, -0.032379150 * F, -0.841949463 * F, - 1.077117920 * F, 0.297210693 * F, 0.150497437 * F, 0.025817871 * F, - 0.029281616 * F, 0.000030518 * F, 0.002243042 * F, 0.000152588 * F, - -0.000045776 * F, -0.001113892 * F, 0.003173828 * F, -0.018463135 * F, - 0.014801025 * F, -0.133590698 * F, -0.050354004 * F, -0.866363525 * F, - 1.063217163 * F, 0.271591187 * F, 0.151596069 * F, 0.021179199 * F, - 0.028533936 * F, -0.000442505 * F, 0.002120972 * F, 0.000137329 * F, - -0.000045776 * F, -0.001205444 * F, 0.003051758 * F, -0.019577026 * F, - 0.012115479 * F, -0.137298584 * F, -0.069168091 * F, -0.890090942 * F, - 1.048156738 * F, 0.246505737 * F, 0.152069092 * F, 0.016708374 * F, - 0.027725220 * F, -0.000869751 * F, 0.002014160 * F, 0.000122070 * F, - -0.000061035 * F, -0.001296997 * F, 0.002883911 * F, -0.020690918 * F, - 0.009231567 * F, -0.140670776 * F, -0.088775635 * F, -0.913055420 * F, - 1.031936646 * F, 0.221984863 * F, 0.151962280 * F, 0.012420654 * F, - 0.026840210 * F, -0.001266479 * F, 0.001907349 * F, 0.000106812 * F, - -0.000061035 * F, -0.001388550 * F, 0.002700806 * F, -0.021789551 * F, - 0.006134033 * F, -0.143676758 * F, -0.109161377 * F, -0.935195923 * F, - 1.014617920 * F, 0.198059082 * F, 0.151306152 * F, 0.008316040 * F, - 0.025909424 * F, -0.001617432 * F, 0.001785278 * F, 0.000106812 * F, - -0.000076294 * F, -0.001480103 * F, 0.002487183 * F, -0.022857666 * F, - 0.002822876 * F, -0.146255493 * F, -0.130310059 * F, -0.956481934 * F, - 0.996246338 * F, 0.174789429 * F, 0.150115967 * F, 0.004394531 * F, - 0.024932861 * F, -0.001937866 * F, 0.001693726 * F, 0.000091553 * F, - -0.000076294 * F, -0.001586914 * F, 0.002227783 * F, -0.023910522 * F, - -0.000686646 * F, -0.148422241 * F, -0.152206421 * F, -0.976852417 * F, - 0.976852417 * F, 0.152206421 * F, 0.148422241 * F, 0.000686646 * F, - 0.023910522 * F, -0.002227783 * F, 0.001586914 * F, 0.000076294 * F, - -0.000091553 * F, -0.001693726 * F, 0.001937866 * F, -0.024932861 * F, - -0.004394531 * F, -0.150115967 * F, -0.174789429 * F, -0.996246338 * F, - 0.956481934 * F, 0.130310059 * F, 0.146255493 * F, -0.002822876 * F, - 0.022857666 * F, -0.002487183 * F, 0.001480103 * F, 0.000076294 * F, - -0.000106812 * F, -0.001785278 * F, 0.001617432 * F, -0.025909424 * F, - -0.008316040 * F, -0.151306152 * F, -0.198059082 * F, -1.014617920 * F, - 0.935195923 * F, 0.109161377 * F, 0.143676758 * F, -0.006134033 * F, - 0.021789551 * F, -0.002700806 * F, 0.001388550 * F, 0.000061035 * F, - -0.000106812 * F, -0.001907349 * F, 0.001266479 * F, -0.026840210 * F, - -0.012420654 * F, -0.151962280 * F, -0.221984863 * F, -1.031936646 * F, - 0.913055420 * F, 0.088775635 * F, 0.140670776 * F, -0.009231567 * F, - 0.020690918 * F, -0.002883911 * F, 0.001296997 * F, 0.000061035 * F, - -0.000122070 * F, -0.002014160 * F, 0.000869751 * F, -0.027725220 * F, - -0.016708374 * F, -0.152069092 * F, -0.246505737 * F, -1.048156738 * F, - 0.890090942 * F, 0.069168091 * F, 0.137298584 * F, -0.012115479 * F, - 0.019577026 * F, -0.003051758 * F, 0.001205444 * F, 0.000045776 * F, - -0.000137329 * F, -0.002120972 * F, 0.000442505 * F, -0.028533936 * F, - -0.021179199 * F, -0.151596069 * F, -0.271591187 * F, -1.063217163 * F, - 0.866363525 * F, 0.050354004 * F, 0.133590698 * F, -0.014801025 * F, - 0.018463135 * F, -0.003173828 * F, 0.001113892 * F, 0.000045776 * F, - -0.000152588 * F, -0.002243042 * F, -0.000030518 * F, -0.029281616 * F, - -0.025817871 * F, -0.150497437 * F, -0.297210693 * F, -1.077117920 * F, - 0.841949463 * F, 0.032379150 * F, 0.129562378 * F, -0.017257690 * F, - 0.017349243 * F, -0.003280640 * F, 0.001037598 * F, 0.000030518 * F, - -0.000167847 * F, -0.002349854 * F, -0.000549316 * F, -0.029937744 * F, - -0.030609131 * F, -0.148773193 * F, -0.323318481 * F, -1.089782715 * F, - 0.816864014 * F, 0.015228271 * F, 0.125259399 * F, -0.019531250 * F, - 0.016235352 * F, -0.003372192 * F, 0.000961304 * F, 0.000030518 * F, - -0.000198364 * F, -0.002456665 * F, -0.001098633 * F, -0.030532837 * F, - -0.035552979 * F, -0.146362305 * F, -0.349868774 * F, -1.101211548 * F, - 0.791213989 * F, -0.001068115 * F, 0.120697021 * F, -0.021575928 * F, - 0.015121460 * F, -0.003417969 * F, 0.000885010 * F, 0.000030518 * F, - -0.000213623 * F, -0.002578735 * F, -0.001693726 * F, -0.031005859 * F, - -0.040634155 * F, -0.143264771 * F, -0.376800537 * F, -1.111373901 * F, - 0.765029907 * F, -0.016510010 * F, 0.115921021 * F, -0.023422241 * F, - 0.014022827 * F, -0.003463745 * F, 0.000808716 * F, 0.000030518 * F, - -0.000244141 * F, -0.002685547 * F, -0.002334595 * F, -0.031387329 * F, - -0.045837402 * F, -0.139450073 * F, -0.404083252 * F, -1.120223999 * F, - 0.738372803 * F, -0.031082153 * F, 0.110946655 * F, -0.025085449 * F, - 0.012939453 * F, -0.003479004 * F, 0.000747681 * F, 0.000015259 * F, - -0.000259399 * F, -0.002792358 * F, -0.003005981 * F, -0.031661987 * F, - -0.051132202 * F, -0.134887695 * F, -0.431655884 * F, -1.127746582 * F, - 0.711318970 * F, -0.044784546 * F, 0.105819702 * F, -0.026535034 * F, - 0.011886597 * F, -0.003479004 * F, 0.000686646 * F, 0.000015259 * F, - -0.000289917 * F, -0.002899170 * F, -0.003723145 * F, -0.031814575 * F, - -0.056533813 * F, -0.129577637 * F, -0.459472656 * F, -1.133926392 * F, - 0.683914185 * F, -0.057617188 * F, 0.100540161 * F, -0.027801514 * F, - 0.010848999 * F, -0.003463745 * F, 0.000625610 * F, 0.000015259 * F, - -0.000320435 * F, -0.002990723 * F, -0.004486084 * F, -0.031845093 * F, - -0.061996460 * F, -0.123474121 * F, -0.487472534 * F, -1.138763428 * F, - 0.656219482 * F, -0.069595337 * F, 0.095169067 * F, -0.028884888 * F, - 0.009841919 * F, -0.003433228 * F, 0.000579834 * F, 0.000015259 * F, - -0.000366211 * F, -0.003082275 * F, -0.005294800 * F, -0.031738281 * F, - -0.067520142 * F, -0.116577148 * F, -0.515609741 * F, -1.142211914 * F, - 0.628295898 * F, -0.080688477 * F, 0.089706421 * F, -0.029785156 * F, - 0.008865356 * F, -0.003387451 * F, 0.000534058 * F, 0.000015259 * F, - -0.000396729 * F, -0.003173828 * F, -0.006118774 * F, -0.031478882 * F, - -0.073059082 * F, -0.108856201 * F, -0.543823242 * F, -1.144287109 * F, - 0.600219727 * F, -0.090927124 * F, 0.084182739 * F, -0.030517578 * F, - 0.007919312 * F, -0.003326416 * F, 0.000473022 * F, 0.000015259 * F - }; -#undef F - int i; - float tmp, *v; - const float *f; - - f = c; - - switch(b->pos) { - case 0: - v = b->actual; - for(i=0; i<32; i++) { - tmp = *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - /* ceiling saturation */ - **pcm = 0x7FFF; - else - if(tmp < -32768) - /* floor saturation */ - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 1: - v = b->actual + 1; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 2: - v = b->actual + 2; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 3: - v = b->actual + 3; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 4: - v = b->actual + 4; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 5: - v = b->actual + 5; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 6: - v = b->actual + 6; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 7: - v = b->actual + 7; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 8: - v = b->actual + 8; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 9: - v = b->actual + 9; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 10: - v = b->actual + 10; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 11: - v = b->actual + 11; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 12: - v = b->actual + 12; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 13: - v = b->actual + 13; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 14: - v = b->actual + 14; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v; - v += 15; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 15; - } - break; - case 15: - v = b->actual + 15; - for(i=0; i<32; i++) { - tmp = *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - tmp += *f++ * *v--; - if((tmp += *f++ * *v) > 32767) - **pcm = 0x7FFF; - else - if(tmp < -32768) - **pcm = 0x8000; - else - **pcm = (s16)tmp; - *pcm += jump; - v += 31; - } - break; - } - - /* Set the next position in the filter bank */ - b->pos++; - b->pos &= 15; - b->actual = (b->actual == b->v1 ? b->v2 : b->v1); -} diff --git a/include/config.h b/include/config.h index 7712447338..49a352ba2f 100644 --- a/include/config.h +++ b/include/config.h @@ -36,7 +36,7 @@ *******************************************************************************/ /* General debugging support */ -#define DEBUG +//#define DEBUG /* Modules specific debugging */ #define DEBUG_INTF @@ -57,7 +57,7 @@ *******************************************************************************/ /* Automagically spawn input, audio and video threads ? */ -#define AUTO_SPAWN +//#define AUTO_SPAWN /* Startup script */ #define INIT_SCRIPT "vlc.init" diff --git a/src/audio_decoder/audio_decoder.c b/src/audio_decoder/audio_decoder.c index b5fc12bbfd..6ae4bca9d1 100644 --- a/src/audio_decoder/audio_decoder.c +++ b/src/audio_decoder/audio_decoder.c @@ -35,6 +35,7 @@ #include "audio_constants.h" #include "audio_decoder.h" +#include "audio_math.h" /****************************************************************************** * Local prototypes diff --git a/src/audio_decoder/audio_math.c b/src/audio_decoder/audio_math.c new file mode 100644 index 0000000000..203f6e4e37 --- /dev/null +++ b/src/audio_decoder/audio_math.c @@ -0,0 +1,950 @@ +/***************************************************************************** + * audio_math.c: Inverse Discrete Cosine Transform and Pulse Code Modulation + * (c)1999 VideoLAN + *****************************************************************************/ +/***************************************************************************** + * Preamble + *****************************************************************************/ +#include +#include /* "intf_msg.h" */ +#include /* malloc(), free() */ +#include /* ntohl() */ +#include /* "audio_output.h" */ +#include +#include + +#include "config.h" +#include "common.h" +#include "mtime.h" +#include "debug.h" + +#include "intf_msg.h" /* intf_DbgMsg(), intf_ErrMsg() */ + +#include "input.h" +#include "input_netlist.h" +#include "decoder_fifo.h" + +#include "audio_output.h" + +#include "audio_constants.h" +#include "audio_decoder.h" +#include "audio_math.h" + +/***************************************************************************** + * DCT32: Fast 32 points Discrete Cosine Transform + ***************************************************************************** + * 289 additions and multiplications + * F(u)=alpha(u)*SUM(x=0, xactual + b->pos; + y = (b->actual == b->v1 ? b->v2 : b->v1) + b->pos; + x[0] = -(y[0] = c2 * (tt1 - tt2 )); /* t17 */ + x[256] = 0; y[256] = tt1 + tt2; /* t1 */ + t25 = c2 * (tt3 - tt4 ); + t9 = tt3 + tt4; + t21 = c2 * (tt5 - tt6 ); + t5 = tt5 + tt6; + t29 = c2 * (tt7 - tt8 ); + t13 = tt7 + tt8; + t19 = c2 * (tt9 - tt10); + t3 = tt9 + tt10; + t27 = c2 * (tt11 - tt12); + t11 = tt11 + tt12; + t23 = c2 * (tt13 - tt14); + t7 = tt13 + tt14; + t31 = c2 * (tt15 - tt16); + t15 = tt15 + tt16; + t18 = c2 * (tt17 - tt18); + t2 = tt17 + tt18; + t26 = c2 * (tt19 - tt20); + t10 = tt19 + tt20; + t22 = c2 * (tt21 - tt22); + t6 = tt21 + tt22; + t30 = c2 * (tt23 - tt24); + t14 = tt23 + tt24; + t20 = c2 * (tt25 - tt26); + t4 = tt25 + tt26; + t28 = c2 * (tt27 - tt28); + t12 = tt27 + tt28; + t24 = c2 * (tt29 - tt30); + t8 = tt29 + tt30; + t32 = c2 * (tt31 - tt32); + t16 = tt31 + tt32; + /* Do the sums */ + /* Keep on splitting the result */ + y[384] = y[128] = t9 - (x[128] = -(x[384] = t25)); /* t25, t9 */ + t10 += t26; + t11 += t27; + t12 += t28; + t13 += t29; + t14 += t30; + t15 += t31; + t16 += t32; + y[320] = y[192] = t5 + t13; /* t5 */ + y[448] = y[64] = t13 + t21; /* t13 */ + x[64] = -(x[448] = t21 - (x[192] = -(x[320] = t29))); /* t29, t21 */ + t6 += t14; + t14 += t22; + t22 += t30; + t7 += t15; + t15 += t23; + t23 += t31; + t8 += t16; + t16 += t24; + t24 += t32; + y[288] = y[224] = t3 + t7; /* t3 */ + y[352] = y[160] = t7 + t11; /* t7 */ + y[416] = y[96] = t11 + t15; /* t11 */ + y[480] = y[32] = t15 + t19; /* t15 */ + x[32] = -(x[480] = t19 + t23); /* t19 */ + x[96] = -(x[416] = t23 + t27); /* t23 */ + x[160] = -(x[352] = t27 - (x[224] = -(x[288] = t31))); /* t31, t27 */ + t4 += t8 ; + t8 += t12; + t12 += t16; + t16 += t20; + t20 += t24; + t24 += t28; + t28 += t32; + y[272] = y[240] = t2 + t4; /* t2 */ + y[304] = y[208] = t4 + t6; /* t4 */ + y[336] = y[176] = t6 + t8; /* t6 */ + y[368] = y[144] = t8 + t10; /* t8 */ + y[400] = y[112] = t10 + t12; /* t10 */ + y[432] = y[80] = t12 + t14; /* t12 */ + y[464] = y[48] = t14 + t16; /* t14 */ + y[496] = y[16] = t16 + t18; /* t16 */ + x[16] = -(x[496] = t18 + t20); /* t18 */ + x[48] = -(x[464] = t20 + t22); /* t20 */ + x[80] = -(x[432] = t22 + t24); /* t22 */ + x[112] = -(x[400] = t24 + t26); /* t24 */ + x[144] = -(x[368] = t26 + t28); /* t26 */ + x[176] = -(x[336] = t28 + t30); /* t28 */ + x[208] = -(x[304] = t30 - (x[240] = -(x[272] = t32))); /* t32, t30 */ + /* Note that to be really complete, the DCT should multiply t1 by sqrt(2)/N + and t2 to t32 by 2/N, and would take 321 additions and multiplications. + But that's unuseful in this application. */ +} + + +/***************************************************************************** + * PCM: Pulse Code Modulation + ***************************************************************************** + * Compute 32 PCM samples with a convolution product + *****************************************************************************/ + +void PCM(adec_bank_t *b, s16 **pcm, int jump) +{ + /* scale factor */ +#define F 32768 + /* These values are not in the same order as in Annex 3-B.3 of the ISO/IEC + DIS 11172-3 */ + static const float c[512] = { + 0.000000000 * F, -0.000442505 * F, 0.003250122 * F, -0.007003784 * F, + 0.031082153 * F, -0.078628540 * F, 0.100311279 * F, -0.572036743 * F, + 1.144989014 * F, 0.572036743 * F, 0.100311279 * F, 0.078628540 * F, + 0.031082153 * F, 0.007003784 * F, 0.003250122 * F, 0.000442505 * F, + -0.000015259 * F, -0.000473022 * F, 0.003326416 * F, -0.007919312 * F, + 0.030517578 * F, -0.084182739 * F, 0.090927124 * F, -0.600219727 * F, + 1.144287109 * F, 0.543823242 * F, 0.108856201 * F, 0.073059082 * F, + 0.031478882 * F, 0.006118774 * F, 0.003173828 * F, 0.000396729 * F, + -0.000015259 * F, -0.000534058 * F, 0.003387451 * F, -0.008865356 * F, + 0.029785156 * F, -0.089706421 * F, 0.080688477 * F, -0.628295898 * F, + 1.142211914 * F, 0.515609741 * F, 0.116577148 * F, 0.067520142 * F, + 0.031738281 * F, 0.005294800 * F, 0.003082275 * F, 0.000366211 * F, + -0.000015259 * F, -0.000579834 * F, 0.003433228 * F, -0.009841919 * F, + 0.028884888 * F, -0.095169067 * F, 0.069595337 * F, -0.656219482 * F, + 1.138763428 * F, 0.487472534 * F, 0.123474121 * F, 0.061996460 * F, + 0.031845093 * F, 0.004486084 * F, 0.002990723 * F, 0.000320435 * F, + -0.000015259 * F, -0.000625610 * F, 0.003463745 * F, -0.010848999 * F, + 0.027801514 * F, -0.100540161 * F, 0.057617188 * F, -0.683914185 * F, + 1.133926392 * F, 0.459472656 * F, 0.129577637 * F, 0.056533813 * F, + 0.031814575 * F, 0.003723145 * F, 0.002899170 * F, 0.000289917 * F, + -0.000015259 * F, -0.000686646 * F, 0.003479004 * F, -0.011886597 * F, + 0.026535034 * F, -0.105819702 * F, 0.044784546 * F, -0.711318970 * F, + 1.127746582 * F, 0.431655884 * F, 0.134887695 * F, 0.051132202 * F, + 0.031661987 * F, 0.003005981 * F, 0.002792358 * F, 0.000259399 * F, + -0.000015259 * F, -0.000747681 * F, 0.003479004 * F, -0.012939453 * F, + 0.025085449 * F, -0.110946655 * F, 0.031082153 * F, -0.738372803 * F, + 1.120223999 * F, 0.404083252 * F, 0.139450073 * F, 0.045837402 * F, + 0.031387329 * F, 0.002334595 * F, 0.002685547 * F, 0.000244141 * F, + -0.000030518 * F, -0.000808716 * F, 0.003463745 * F, -0.014022827 * F, + 0.023422241 * F, -0.115921021 * F, 0.016510010 * F, -0.765029907 * F, + 1.111373901 * F, 0.376800537 * F, 0.143264771 * F, 0.040634155 * F, + 0.031005859 * F, 0.001693726 * F, 0.002578735 * F, 0.000213623 * F, + -0.000030518 * F, -0.000885010 * F, 0.003417969 * F, -0.015121460 * F, + 0.021575928 * F, -0.120697021 * F, 0.001068115 * F, -0.791213989 * F, + 1.101211548 * F, 0.349868774 * F, 0.146362305 * F, 0.035552979 * F, + 0.030532837 * F, 0.001098633 * F, 0.002456665 * F, 0.000198364 * F, + -0.000030518 * F, -0.000961304 * F, 0.003372192 * F, -0.016235352 * F, + 0.019531250 * F, -0.125259399 * F, -0.015228271 * F, -0.816864014 * F, + 1.089782715 * F, 0.323318481 * F, 0.148773193 * F, 0.030609131 * F, + 0.029937744 * F, 0.000549316 * F, 0.002349854 * F, 0.000167847 * F, + -0.000030518 * F, -0.001037598 * F, 0.003280640 * F, -0.017349243 * F, + 0.017257690 * F, -0.129562378 * F, -0.032379150 * F, -0.841949463 * F, + 1.077117920 * F, 0.297210693 * F, 0.150497437 * F, 0.025817871 * F, + 0.029281616 * F, 0.000030518 * F, 0.002243042 * F, 0.000152588 * F, + -0.000045776 * F, -0.001113892 * F, 0.003173828 * F, -0.018463135 * F, + 0.014801025 * F, -0.133590698 * F, -0.050354004 * F, -0.866363525 * F, + 1.063217163 * F, 0.271591187 * F, 0.151596069 * F, 0.021179199 * F, + 0.028533936 * F, -0.000442505 * F, 0.002120972 * F, 0.000137329 * F, + -0.000045776 * F, -0.001205444 * F, 0.003051758 * F, -0.019577026 * F, + 0.012115479 * F, -0.137298584 * F, -0.069168091 * F, -0.890090942 * F, + 1.048156738 * F, 0.246505737 * F, 0.152069092 * F, 0.016708374 * F, + 0.027725220 * F, -0.000869751 * F, 0.002014160 * F, 0.000122070 * F, + -0.000061035 * F, -0.001296997 * F, 0.002883911 * F, -0.020690918 * F, + 0.009231567 * F, -0.140670776 * F, -0.088775635 * F, -0.913055420 * F, + 1.031936646 * F, 0.221984863 * F, 0.151962280 * F, 0.012420654 * F, + 0.026840210 * F, -0.001266479 * F, 0.001907349 * F, 0.000106812 * F, + -0.000061035 * F, -0.001388550 * F, 0.002700806 * F, -0.021789551 * F, + 0.006134033 * F, -0.143676758 * F, -0.109161377 * F, -0.935195923 * F, + 1.014617920 * F, 0.198059082 * F, 0.151306152 * F, 0.008316040 * F, + 0.025909424 * F, -0.001617432 * F, 0.001785278 * F, 0.000106812 * F, + -0.000076294 * F, -0.001480103 * F, 0.002487183 * F, -0.022857666 * F, + 0.002822876 * F, -0.146255493 * F, -0.130310059 * F, -0.956481934 * F, + 0.996246338 * F, 0.174789429 * F, 0.150115967 * F, 0.004394531 * F, + 0.024932861 * F, -0.001937866 * F, 0.001693726 * F, 0.000091553 * F, + -0.000076294 * F, -0.001586914 * F, 0.002227783 * F, -0.023910522 * F, + -0.000686646 * F, -0.148422241 * F, -0.152206421 * F, -0.976852417 * F, + 0.976852417 * F, 0.152206421 * F, 0.148422241 * F, 0.000686646 * F, + 0.023910522 * F, -0.002227783 * F, 0.001586914 * F, 0.000076294 * F, + -0.000091553 * F, -0.001693726 * F, 0.001937866 * F, -0.024932861 * F, + -0.004394531 * F, -0.150115967 * F, -0.174789429 * F, -0.996246338 * F, + 0.956481934 * F, 0.130310059 * F, 0.146255493 * F, -0.002822876 * F, + 0.022857666 * F, -0.002487183 * F, 0.001480103 * F, 0.000076294 * F, + -0.000106812 * F, -0.001785278 * F, 0.001617432 * F, -0.025909424 * F, + -0.008316040 * F, -0.151306152 * F, -0.198059082 * F, -1.014617920 * F, + 0.935195923 * F, 0.109161377 * F, 0.143676758 * F, -0.006134033 * F, + 0.021789551 * F, -0.002700806 * F, 0.001388550 * F, 0.000061035 * F, + -0.000106812 * F, -0.001907349 * F, 0.001266479 * F, -0.026840210 * F, + -0.012420654 * F, -0.151962280 * F, -0.221984863 * F, -1.031936646 * F, + 0.913055420 * F, 0.088775635 * F, 0.140670776 * F, -0.009231567 * F, + 0.020690918 * F, -0.002883911 * F, 0.001296997 * F, 0.000061035 * F, + -0.000122070 * F, -0.002014160 * F, 0.000869751 * F, -0.027725220 * F, + -0.016708374 * F, -0.152069092 * F, -0.246505737 * F, -1.048156738 * F, + 0.890090942 * F, 0.069168091 * F, 0.137298584 * F, -0.012115479 * F, + 0.019577026 * F, -0.003051758 * F, 0.001205444 * F, 0.000045776 * F, + -0.000137329 * F, -0.002120972 * F, 0.000442505 * F, -0.028533936 * F, + -0.021179199 * F, -0.151596069 * F, -0.271591187 * F, -1.063217163 * F, + 0.866363525 * F, 0.050354004 * F, 0.133590698 * F, -0.014801025 * F, + 0.018463135 * F, -0.003173828 * F, 0.001113892 * F, 0.000045776 * F, + -0.000152588 * F, -0.002243042 * F, -0.000030518 * F, -0.029281616 * F, + -0.025817871 * F, -0.150497437 * F, -0.297210693 * F, -1.077117920 * F, + 0.841949463 * F, 0.032379150 * F, 0.129562378 * F, -0.017257690 * F, + 0.017349243 * F, -0.003280640 * F, 0.001037598 * F, 0.000030518 * F, + -0.000167847 * F, -0.002349854 * F, -0.000549316 * F, -0.029937744 * F, + -0.030609131 * F, -0.148773193 * F, -0.323318481 * F, -1.089782715 * F, + 0.816864014 * F, 0.015228271 * F, 0.125259399 * F, -0.019531250 * F, + 0.016235352 * F, -0.003372192 * F, 0.000961304 * F, 0.000030518 * F, + -0.000198364 * F, -0.002456665 * F, -0.001098633 * F, -0.030532837 * F, + -0.035552979 * F, -0.146362305 * F, -0.349868774 * F, -1.101211548 * F, + 0.791213989 * F, -0.001068115 * F, 0.120697021 * F, -0.021575928 * F, + 0.015121460 * F, -0.003417969 * F, 0.000885010 * F, 0.000030518 * F, + -0.000213623 * F, -0.002578735 * F, -0.001693726 * F, -0.031005859 * F, + -0.040634155 * F, -0.143264771 * F, -0.376800537 * F, -1.111373901 * F, + 0.765029907 * F, -0.016510010 * F, 0.115921021 * F, -0.023422241 * F, + 0.014022827 * F, -0.003463745 * F, 0.000808716 * F, 0.000030518 * F, + -0.000244141 * F, -0.002685547 * F, -0.002334595 * F, -0.031387329 * F, + -0.045837402 * F, -0.139450073 * F, -0.404083252 * F, -1.120223999 * F, + 0.738372803 * F, -0.031082153 * F, 0.110946655 * F, -0.025085449 * F, + 0.012939453 * F, -0.003479004 * F, 0.000747681 * F, 0.000015259 * F, + -0.000259399 * F, -0.002792358 * F, -0.003005981 * F, -0.031661987 * F, + -0.051132202 * F, -0.134887695 * F, -0.431655884 * F, -1.127746582 * F, + 0.711318970 * F, -0.044784546 * F, 0.105819702 * F, -0.026535034 * F, + 0.011886597 * F, -0.003479004 * F, 0.000686646 * F, 0.000015259 * F, + -0.000289917 * F, -0.002899170 * F, -0.003723145 * F, -0.031814575 * F, + -0.056533813 * F, -0.129577637 * F, -0.459472656 * F, -1.133926392 * F, + 0.683914185 * F, -0.057617188 * F, 0.100540161 * F, -0.027801514 * F, + 0.010848999 * F, -0.003463745 * F, 0.000625610 * F, 0.000015259 * F, + -0.000320435 * F, -0.002990723 * F, -0.004486084 * F, -0.031845093 * F, + -0.061996460 * F, -0.123474121 * F, -0.487472534 * F, -1.138763428 * F, + 0.656219482 * F, -0.069595337 * F, 0.095169067 * F, -0.028884888 * F, + 0.009841919 * F, -0.003433228 * F, 0.000579834 * F, 0.000015259 * F, + -0.000366211 * F, -0.003082275 * F, -0.005294800 * F, -0.031738281 * F, + -0.067520142 * F, -0.116577148 * F, -0.515609741 * F, -1.142211914 * F, + 0.628295898 * F, -0.080688477 * F, 0.089706421 * F, -0.029785156 * F, + 0.008865356 * F, -0.003387451 * F, 0.000534058 * F, 0.000015259 * F, + -0.000396729 * F, -0.003173828 * F, -0.006118774 * F, -0.031478882 * F, + -0.073059082 * F, -0.108856201 * F, -0.543823242 * F, -1.144287109 * F, + 0.600219727 * F, -0.090927124 * F, 0.084182739 * F, -0.030517578 * F, + 0.007919312 * F, -0.003326416 * F, 0.000473022 * F, 0.000015259 * F + }; +#undef F + int i; + float tmp, *v; + const float *f; + + f = c; + + switch(b->pos) { + case 0: + v = b->actual; + for(i=0; i<32; i++) { + tmp = *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + /* ceiling saturation */ + **pcm = 0x7FFF; + else + if(tmp < -32768) + /* floor saturation */ + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 1: + v = b->actual + 1; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 2: + v = b->actual + 2; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 3: + v = b->actual + 3; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 4: + v = b->actual + 4; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 5: + v = b->actual + 5; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 6: + v = b->actual + 6; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 7: + v = b->actual + 7; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 8: + v = b->actual + 8; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 9: + v = b->actual + 9; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 10: + v = b->actual + 10; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 11: + v = b->actual + 11; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 12: + v = b->actual + 12; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 13: + v = b->actual + 13; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 14: + v = b->actual + 14; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v; + v += 15; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 15; + } + break; + case 15: + v = b->actual + 15; + for(i=0; i<32; i++) { + tmp = *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + tmp += *f++ * *v--; + if((tmp += *f++ * *v) > 32767) + **pcm = 0x7FFF; + else + if(tmp < -32768) + **pcm = 0x8000; + else + **pcm = (s16)tmp; + *pcm += jump; + v += 31; + } + break; + } + + /* Set the next position in the filter bank */ + b->pos++; + b->pos &= 15; + b->actual = (b->actual == b->v1 ? b->v2 : b->v1); +} diff --git a/src/input/input_psi.c b/src/input/input_psi.c index cb7e26b93c..f7b3323d04 100644 --- a/src/input/input_psi.c +++ b/src/input/input_psi.c @@ -434,7 +434,9 @@ static void DecodePgrmMapSection( u8* p_pms, input_thread_t* p_input ) u16 i_es_pid; int i_index = 0; +#ifdef AUTO_SPAWN int i_es_loop; +#endif pgrm_descriptor_t* p_pgrm; es_descriptor_t* p_es; diff --git a/src/interface/interface.c b/src/interface/interface.c index 9cda39cfa1..7b50e4a823 100644 --- a/src/interface/interface.c +++ b/src/interface/interface.c @@ -11,6 +11,7 @@ *******************************************************************************/ #include #include +#include #include #include #include