cr88192

Experimental Block Audio Codec 2

Apr 28th, 2013
443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 29.84 KB | None | 0 0
  1. /*
  2. Copyright (C) 2013 by Brendan G Bohannon
  3. Copying: http://pastebin.com/iJxtZHm6
  4.  */
  5.  
  6. #include <bgbtac.h>
  7.  
  8. /*
  9. Experimental block-based audio codec.
  10. Encodes blocks of 64 samples into 256 bits (32 bytes).
  11. At 44.1kHz this is 176kbps.
  12. It can encode stereo using a "naive joint stereo" encoding.
  13.  
  14. Most block formats will encode a single center channel and will offset it for the left/right channel.
  15.  
  16. Basic Format 0:
  17.     4 bit: Block-Mode (0)
  18.     currently unused (12 bits, zeroed)
  19.     16 bit min sample (center)
  20.     16 bit max sample (center)
  21.     8 bit left-center min (ssqrt)
  22.     8 bit left-center max (ssqrt)
  23.     64 Samples, 1 bits/sample (64 bits)
  24.     16x 4-bit min (64 bits)
  25.     16x 4-bit max (64 bits)
  26.  
  27. The 4-bit values interpolate between the full min/max for the block.
  28. The 1-bit samples select between the min and max value for each sample.
  29.  
  30. Note: Interpolated values are linear, thus 0=0/15, 1=1/15, 2=2/15, ..., 14=14/15, 15=15/15
  31.  
  32. Bit packing is in low-high order, and multibyte values are little-endian.
  33.  
  34. Basic Format 1:
  35.     4 bit: Block-Mode (1)
  36.     currently unused (12 bits, zeroed)
  37.     16 bit min sample (center)
  38.     16 bit max sample (center)
  39.     8 bit left-center min (ssqrt)
  40.     8 bit left-center max (ssqrt)
  41.     32x 2-bit sample (64 bits)
  42.     32x 4-bit sample (128 bits)
  43.  
  44. This directly codes all samples, with the 4-bit values encoding even samples, and the 2-bit values encoding odd samples.
  45.  
  46. The 4-bit samples are encoded between the block min/max values, and the 2-bit samples between the prior/next sample.
  47.  
  48. Sample interpolation (2 bit samples):
  49. 0=prior sample, 1=next sample, 2=average, 3=quadratic interpolated value.
  50.  
  51. Basic Format 2:
  52.     4 bit: Block-Mode (2)
  53.     currently unused (12 bits, zeroed)
  54.     16 bit min sample (center)
  55.     16 bit max sample (center)
  56.     8 bit left-center min (ssqrt)
  57.     8 bit left-center max (ssqrt)
  58.     32x 6-bit samples (192 bits)
  59.  
  60. This directly codes samples, with the 6-bit values encoding samples.
  61. The 6-bit samples are encoded between the block min/max values.
  62.  
  63. This mode encodes even samples, with odd-samples being interpolated (quadratic).
  64. The last sample is extrapolated.
  65.  
  66. Stereo Format 3:
  67.     4 bit: Block-Mode (3)
  68.     currently unused (12 bits, zeroed)
  69.     16 bit min sample (center)
  70.     16 bit max sample (center)
  71.     8 bit left-center min (ssqrt)
  72.     8 bit left-center max (ssqrt)
  73.     32x 2-bit pan (64 bits)
  74.     32x 4-bit sample (128 bits)
  75.  
  76. This directly codes samples, with the 4-bit values encoding even samples.
  77. The 2-bit pan value encodes the relative pan of the sample.
  78.  
  79. The 4-bit samples are encoded between the block min/max values.
  80.  
  81. The 2-bit samples represent values as:
  82. 0=center pan (offset):
  83.     The sample will be offset for left/right channels.
  84. 1=center-pan (duplicate):
  85.     The sample will be the same (center) value for both channels.
  86. 2=left-pan:
  87.     The sample will be panned towards the left.
  88. 3=right pan:
  89.     The sample will be panned towards the right.
  90.  
  91. This mode encodes even samples, with odd-samples being interpolated (quadratic).
  92.  
  93. Basic Format 4:
  94.     4 bit: Block-Mode (4)
  95.     currently unused (12 bits, zeroed)
  96.     16 bit min sample (center)
  97.     16 bit max sample (center)
  98.     8 bit left-center min (ssqrt)
  99.     8 bit left-center max (ssqrt)
  100.     8x 4-bit min (32 bits)
  101.     8x 4-bit max (32 bits)
  102.     64x 2-bit sample (128 bits)
  103.  
  104. The 4-bit values interpolate between the full min/max for the block.
  105. The 2-bit samples interpolate between the min and max values for each sub-block (0=min, 1=1/3, 2=2/3, 3=max).
  106.  
  107.  */
  108.  
  109. int bgbtac_ssqrti(int v)
  110. {
  111.     int i;
  112.     double f;
  113.     f=(v>=0)?sqrt(v):-sqrt(-v);
  114.     i=(int)(f+0.5);
  115.     return(i);
  116. }
  117.  
  118. int bgbtac_ssqri(int v)
  119. {
  120.     return((v>=0)?(v*v):(-v*v));
  121. }
  122.  
  123. int bgbtac_spowi(int v, float e)
  124. {
  125.     int i;
  126.     double f;
  127.     f=(v>=0)?pow(v, e):-pow(-v, e);
  128.     i=(int)(f+0.5);
  129.     return(i);
  130. }
  131.  
  132. void BGBTAC_EncodeBlockHeaderS16(
  133.     s16 *iblk, byte *oblk, s16 *tcblk,
  134.     int *rcm, int *rcn, int flags)
  135. {
  136.     int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  137.     int cm2, cn2, ca2, ba;
  138.     int p0, p1, p2, p3;
  139.     int s0, s1;
  140.     int i, j, k;
  141.  
  142. #if 1
  143.     lm= 99999; rm= 99999; cm= 99999;
  144.     ln=-99999; rn=-99999; cn=-99999;
  145.    
  146.     ba=0;
  147.     for(i=0; i<64; i++)
  148.     {
  149.         if(flags&BGBTAC_EFL_HALFMONO)
  150.             { tl=iblk[i*2+0]; tr=tl; }
  151.         else if(flags&BGBTAC_EFL_STEREO)
  152.             { tl=iblk[i*2+0]; tr=iblk[i*2+1]; }
  153.         else
  154.             { tl=iblk[i]; tr=tl; }
  155.         k=(tl+tr)>>1;
  156.         tcblk[i]=k;
  157.         ba+=tl-k;
  158.         if(k<cm) { lm=tl; rm=tr; cm=k; }
  159.         if(k>cn) { ln=tl; rn=tr; cn=k; }
  160.     }
  161.  
  162.     ba/=64;
  163.    
  164.     if(flags&BGBTAC_EFL_MIDSTREAM)
  165.     {
  166.         ba=0;
  167.         for(i=-64; i<128; i++)
  168.         {
  169.             if(flags&BGBTAC_EFL_HALFMONO)
  170.                 { tl=iblk[i*2+0]; tr=tl; }
  171.             else if(flags&BGBTAC_EFL_STEREO)
  172.                 { tl=iblk[i*2+0]; tr=iblk[i*2+1]; }
  173.             else
  174.                 { tl=iblk[i]; tr=tl; }
  175.             k=(tl+tr)>>1;
  176.             ba+=tl-k;
  177.         }
  178.         ba/=192;
  179.     }
  180.    
  181.     for(i=0; i<32; i++)
  182.         { oblk[i]=0; }
  183.  
  184.     p0=lm-cm;
  185.     p1=ln-cn;
  186.     p2=ba;
  187.  
  188.     p0=(5*p0+11*p2)>>4;
  189.     p1=(5*p1+11*p2)>>4;
  190. //  p0=p2; p1=p2;
  191.  
  192.     if(flags&(BGBTAC_EFL_CENTERMONO|BGBTAC_EFL_HALFMONO))
  193.         { p0=0; p1=0; }
  194.  
  195. //  p0/=2;  p1/=2;
  196.     p0=bgbtac_spowi(p0, 0.73);
  197.     p1=bgbtac_spowi(p1, 0.73);
  198.  
  199. //  p0=bgbtac_spowi(p0, 0.90);
  200. //  p1=bgbtac_spowi(p1, 0.90);
  201.  
  202. //  p0=bgbtac_spowi(p0, 0.80);
  203. //  p1=bgbtac_spowi(p1, 0.80);
  204.  
  205.     p0=bgbtac_ssqrti(p0);
  206.     p1=bgbtac_ssqrti(p1);
  207.  
  208.     p0=(p0<(-128))?(-128):((p0<128)?p0:127);
  209.     p1=(p1<(-128))?(-128):((p1<128)?p1:127);
  210.    
  211.     oblk[0]=0x00;
  212.     oblk[1]=0x00;
  213.  
  214.     oblk[2]=cm&0xFF;
  215.     oblk[3]=(cm>>8)&0xFF;
  216.     oblk[4]=cn&0xFF;
  217.     oblk[5]=(cn>>8)&0xFF;
  218.     oblk[6]=p0&0xFF;
  219.     oblk[7]=p1&0xFF;
  220. #endif
  221.  
  222.     *rcm=cm;
  223.     *rcn=cn;
  224. }
  225.  
  226. void BGBTAC_EncodeBlockHeaderPanS16(
  227.     s16 *iblk, byte *oblk,
  228.     s16 *tcblk, s16 *tcpan,
  229.     int *rcm, int *rcn,
  230.     int *rlm, int *rln,
  231.     int *rrm, int *rrn,
  232.     int flags)
  233. {
  234.     int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  235.     int cm2, cn2, ca2, ba;
  236.     int p0, p1, p2, p3;
  237.     int s0, s1;
  238.     int i, j, k;
  239.  
  240. #if 1
  241.     lm= 99999; rm= 99999; cm= 99999;
  242.     ln=-99999; rn=-99999; cn=-99999;
  243.    
  244.     ba=0;
  245.     for(i=0; i<64; i++)
  246.     {
  247.         if(flags&BGBTAC_EFL_HALFMONO)
  248.         {
  249.             tl=iblk[i*2+0];
  250.             tr=tl;
  251.         }else if(flags&BGBTAC_EFL_STEREO)
  252.         {
  253.             tl=iblk[i*2+0];
  254.             tr=iblk[i*2+1];
  255.         }else
  256.         {
  257.             tl=iblk[i];
  258.             tr=tl;
  259.         }
  260.         k=(tl+tr)>>1;
  261.         tcblk[i]=k;
  262.         tcpan[i]=tl-k;
  263.         ba+=tl-k;
  264.         if(k<cm) { lm=tl; rm=tr; cm=k; }
  265.         if(k>cn) { ln=tl; rn=tr; cn=k; }
  266.     }
  267.  
  268.     ba/=64;
  269.    
  270.     for(i=0; i<32; i++)
  271.         { oblk[i]=0; }
  272.  
  273.     p0=lm-cm;
  274.     p1=ln-cn;
  275.     p2=ba;
  276.  
  277.     p0=(5*p0+11*p2)>>4;
  278.     p1=(5*p1+11*p2)>>4;
  279. //  p0=p2; p1=p2;
  280.  
  281.     if((flags&BGBTAC_EFL_CENTERMONO) || (flags&BGBTAC_EFL_HALFMONO))
  282.         { p0=0; p1=0; }
  283.  
  284. //  p0/=2;  p1/=2;
  285.     p0=bgbtac_spowi(p0, 0.73);
  286.     p1=bgbtac_spowi(p1, 0.73);
  287.  
  288. //  p0=bgbtac_spowi(p0, 0.90);
  289. //  p1=bgbtac_spowi(p1, 0.90);
  290.  
  291. //  p0=bgbtac_spowi(p0, 0.80);
  292. //  p1=bgbtac_spowi(p1, 0.80);
  293.  
  294.     p0=bgbtac_ssqrti(p0);
  295.     p1=bgbtac_ssqrti(p1);
  296.  
  297.     p0=(p0<(-128))?(-128):((p0<128)?p0:127);
  298.     p1=(p1<(-128))?(-128):((p1<128)?p1:127);
  299.    
  300.     oblk[0]=0x00;
  301.     oblk[1]=0x00;
  302.  
  303.     oblk[2]=cm&0xFF;
  304.     oblk[3]=(cm>>8)&0xFF;
  305.     oblk[4]=cn&0xFF;
  306.     oblk[5]=(cn>>8)&0xFF;
  307.     oblk[6]=p0&0xFF;
  308.     oblk[7]=p1&0xFF;
  309. #endif
  310.  
  311.     *rcm=cm;
  312.     *rcn=cn;
  313.     if(rlm && rln) { *rlm=lm; *rln=ln; }
  314.     if(rrm && rrn) { *rrm=rm; *rrn=rn; }
  315. }
  316.  
  317. #if 1
  318. void BGBTAC_EncodeBlock8S16(s16 *iblk, byte *oblk, int flags)
  319. {
  320.     s16 tcblk[64];
  321.     int tcma[16], tcna[16];
  322.     int tcmb[16], tcnb[16];
  323. //  int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  324.     int cm, cn, tc;
  325.     int cm2, cn2, ca2, ba;
  326.     int p0, p1, p2, p3;
  327.     int s0, s1;
  328.     int i, j, k;
  329.  
  330.     BGBTAC_EncodeBlockHeaderS16(iblk, oblk, tcblk, &cm, &cn, flags);
  331.  
  332.     for(i=0; i<16; i++)
  333.     {
  334.         cm2= 99999; cn2=-99999;
  335.         for(j=0; j<4; j++)
  336.         {
  337.             tc=tcblk[i*4+j];
  338.             if(tc<cm2) { cm2=tc; }
  339.             if(tc>cn2) { cn2=tc; }
  340.         }
  341.  
  342.         if(cn!=cm)
  343.             { s0=268435456/(cn-cm); }
  344.         else { s0=0; }
  345.  
  346.         p0=(s0*(cm2-cm)+8388608)>>24;
  347.         p1=(s0*(cn2-cm)+8388608)>>24;
  348.  
  349.         p0=(p0<0)?0:((p0<16)?p0:15);
  350.         p1=(p1<0)?0:((p1<16)?p1:15);
  351.        
  352.         tcma[i]=p0;
  353.         tcna[i]=p1;
  354.  
  355.         s1=(cn-cm);
  356.         cm2=((s1*p0+8)>>4)+cm;
  357.         cn2=((s1*p1+8)>>4)+cm;
  358.  
  359.         tcmb[i]=cm2;
  360.         tcnb[i]=cn2;
  361.     }
  362.  
  363.     for(i=0; i<16; i++)
  364.     {
  365.         oblk[16+(i>>1)]|=tcma[i]<<((i&1)*4);
  366.         oblk[24+(i>>1)]|=tcna[i]<<((i&1)*4);
  367.     }
  368.    
  369.     for(i=0; i<16; i++)
  370.     {
  371.         ca2=(tcmb[i]+tcnb[i])>>1;
  372.    
  373.         for(j=0; j<4; j++)
  374.         {
  375.             k=i*4+j;
  376.             tc=tcblk[k];
  377.             if(tc>=ca2)
  378.                 { oblk[8+(k>>3)]|=1<<(k&7); }
  379.             else
  380.                 { oblk[8+(k>>3)]&=~(1<<(k&7)); }
  381.         }
  382.     }  
  383. }
  384.  
  385. void BGBTAC_DecodeBlockHeader(byte *iblk, int flags,
  386.     int *rcm, int *rcn, int *rca,
  387.     int *rlm, int *rln, int *rla,
  388.     int *rrm, int *rrn, int *rra)
  389. {
  390.     int cm, cn, ca;
  391.     int lm, ln, la;
  392.     int rm, rn, ra;
  393.     int i, j;
  394.  
  395.     cm=(s16)(iblk[2]+(iblk[3]<<8));
  396.     cn=(s16)(iblk[4]+(iblk[5]<<8));
  397.     ca=(cm+cn)>>1;
  398.  
  399.     i=bgbtac_ssqri((s8)iblk[6]);
  400.     j=bgbtac_ssqri((s8)iblk[7]);
  401.  
  402.     lm=cm+i; rm=cm-i;
  403.     ln=cn+j; rn=cn-j;
  404.     la=(lm+ln)>>1;
  405.     ra=(rm+rn)>>1;
  406.  
  407.     lm=(lm<(-32768))?(-32768):((lm<32768)?lm:32767);
  408.     ln=(ln<(-32768))?(-32768):((ln<32768)?ln:32767);
  409.     rm=(rm<(-32768))?(-32768):((rm<32768)?rm:32767);
  410.     rn=(rn<(-32768))?(-32768):((rn<32768)?rn:32767);
  411.    
  412.     *rcm=cm; *rcn=cn; *rca=ca;
  413.     *rlm=lm; *rln=ln; *rla=la;
  414.     *rrm=rm; *rrn=rn; *rra=ra;
  415. }
  416.  
  417. void BGBTAC_DecodeBlock8S16(byte *iblk, s16 *oblk, int flags)
  418. {
  419.     int p0, p1, p2, p3;
  420.     int s0, s1;
  421.     int cm, cn, ca;
  422.     int lm, ln, la;
  423.     int rm, rn, ra;
  424.     int cm2, cn2, ca2;
  425.     int lm2, ln2, la2;
  426.     int rm2, rn2, ra2;
  427.     int i, j, k;
  428.  
  429.     BGBTAC_DecodeBlockHeader(iblk, flags,
  430.         &cm, &cn, &ca, &lm, &ln, &la, &rm, &rn, &ra);
  431.  
  432.     for(i=0; i<16; i++)
  433.     {
  434.         p0=(iblk[16+(i>>1)]>>((i&1)*4))&15;
  435.         p1=(iblk[24+(i>>1)]>>((i&1)*4))&15;
  436.  
  437.         if(flags&(BGBTAC_EFL_STEREO|BGBTAC_EFL_HALFMONO))
  438.         {
  439.             s0=(ln-lm);
  440.             s1=(rn-rm);
  441.             lm2=((s0*p0+8)>>4)+lm;
  442.             ln2=((s0*p1+8)>>4)+lm;
  443.             rm2=((s1*p0+8)>>4)+rm;
  444.             rn2=((s1*p1+8)>>4)+rm;
  445.             la2=(lm2+ln2)>>1;
  446.             ra2=(rm2+rn2)>>1;
  447.  
  448.             lm2=(13*lm2+3*la2+8)>>4;
  449.             ln2=(13*ln2+3*la2+8)>>4;
  450.             rm2=(13*rm2+3*ra2+8)>>4;
  451.             rn2=(13*rn2+3*ra2+8)>>4;
  452.  
  453.             lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  454.             ln2=(ln2<lm)?lm:((ln2<ln)?ln2:ln);
  455.             rm2=(rm2<rm)?rm:((rm2<rn)?rm2:rn);
  456.             rn2=(rn2<rm)?rm:((rn2<rn)?rn2:rn);
  457.         }else
  458.         {
  459.             cm2=((s1*p0+8)>>4)+cm;
  460.             cn2=((s1*p1+8)>>4)+cm;
  461.             ca2=(cm2+cn2)>>1;
  462.  
  463.             cm2=(13*cm2+3*ca2+8)>>4;
  464.             cn2=(13*cn2+3*ca2+8)>>4;
  465.  
  466.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  467.             cn2=(cn2<cm)?cm:((cn2<cn)?cn2:cn);
  468.         }
  469.  
  470.         for(j=0; j<4; j++)
  471.         {
  472.             k=i*4+j;
  473.        
  474.             p0=(iblk[8+(k>>3)]&(1<<(k&7)));
  475.             if(flags&BGBTAC_EFL_HALFMONO)
  476.                 { oblk[k*2+0]=p0?ln2:lm2; }
  477.             else if(flags&BGBTAC_EFL_STEREO)
  478.             {
  479.                 oblk[k*2+0]=p0?ln2:lm2;
  480.                 oblk[k*2+1]=p0?rn2:rm2;
  481.             }else
  482.             {
  483.                 oblk[k]=p0?cn2:cm2;
  484.             }
  485.         }
  486.     }
  487. }
  488. #endif
  489.  
  490. void BGBTAC_EncodeBlock9S16(s16 *iblk, byte *oblk, int flags)
  491. {
  492.     s16 tcblk[64];
  493.     int tcma[32];
  494.     int tcmb[32];
  495. //  int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  496.     int cm, cn, tc;
  497.     int cm2, cn2, ca2, ba;
  498.     int p0, p1, p2, p3;
  499.     int s0, s1, s2, s3;
  500.     int i, j, k;
  501.  
  502.     BGBTAC_EncodeBlockHeaderS16(iblk, oblk, tcblk, &cm, &cn, flags);
  503.  
  504.     oblk[0]=0x01;
  505.     oblk[1]=0x00;
  506.    
  507.     for(i=0; i<32; i++)
  508.     {
  509.         cm2= 99999; cn2=-99999;
  510.         tc=tcblk[i*2+0];
  511.  
  512.         if(cn!=cm)
  513.             { s0=268435456/(cn-cm); }
  514.         else { s0=0; }
  515.         p0=(s0*(tc-cm)+8388608)>>24;
  516.         p0=(p0<0)?0:((p0<16)?p0:15);
  517.         tcma[i]=p0;
  518.  
  519.         s1=(cn-cm);
  520.         p1=((s1*p0+8)>>4)+cm;
  521.  
  522.         tcmb[i]=p1;
  523.     }
  524.  
  525.     for(i=0; i<32; i++)
  526.         { oblk[16+(i>>1)]|=tcma[i]<<((i&1)*4); }
  527.  
  528. #if 1
  529.     for(i=0; i<32; i++)
  530.     {
  531.         p0=tcmb[i];
  532. //      p1=tcmb[(i+1)&31];
  533. //      p2=tcmb[(i-1)&31];
  534. //      p3=tcmb[(i+2)&31];
  535.         p1=(i<31)?tcmb[(i+1)&31]:p0;
  536.         p2=(i>0)?tcmb[(i-1)&31]:p0;
  537.         p3=(i<30)?tcmb[(i+2)&31]:p1;
  538.         ca2=(p0+p1)>>1;
  539.    
  540.         tc=tcblk[i*2+1];
  541.  
  542.         k=0; s0=abs(tc-p0);
  543.         s1=abs(tc-p1);
  544.         if(s1<s0) { k=1; s0=s1; }
  545.         s2=(p0+p1)>>1;
  546.         s1=abs(tc-s2);
  547.         if(s1<s0) { k=2; s0=s1; }
  548.  
  549.         s2=(3*p0+3*p1-p2-p3+2)>>2;
  550.         s1=abs(tc-s2);
  551.         if(s1<s0) { k=3; s0=s1; }
  552.  
  553.         oblk[8+(i>>2)]|=k<<((i&3)*2);
  554.     }
  555. #endif
  556. }
  557.  
  558. void BGBTAC_DecodeBlock9S16(byte *iblk, s16 *oblk, int flags)
  559. {
  560.     int p0, p1, p2, p3;
  561.     int s0, s1;
  562.     int cm, cn, ca;
  563.     int lm, ln, la;
  564.     int rm, rn, ra;
  565.     int cm2, cn2, ca2;
  566.     int lm2, ln2, la2;
  567.     int rm2, rn2, ra2;
  568.     int i, j, k;
  569.  
  570.     BGBTAC_DecodeBlockHeader(iblk, flags,
  571.         &cm, &cn, &ca, &lm, &ln, &la, &rm, &rn, &ra);
  572.  
  573.     for(i=0; i<32; i++)
  574.     {
  575.         p0=(iblk[16+(i>>1)]>>((i&1)*4))&15;
  576.    
  577.         if(flags&BGBTAC_EFL_HALFMONO)
  578.         {
  579.             s0=(cn-cm);
  580.             cm2=((s0*p0+8)>>4)+cm;
  581.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  582.             oblk[i*4+0]=cm2;
  583.         }
  584.         else if(flags&BGBTAC_EFL_STEREO)
  585.         {
  586.             s0=(ln-lm);
  587.             s1=(rn-rm);
  588.             lm2=((s0*p0+8)>>4)+lm;
  589.             rm2=((s1*p0+8)>>4)+rm;
  590.  
  591.             lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  592.             rm2=(rm2<rm)?rm:((rm2<rn)?rm2:rn);
  593.  
  594.             oblk[i*4+0]=lm2;
  595.             oblk[i*4+1]=rm2;
  596.         }else
  597.         {
  598.             s0=(cn-cm);
  599.             cm2=((s0*p0+8)>>4)+cm;
  600.  
  601.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  602.  
  603.             oblk[i*2+0]=cm2;
  604.         }
  605.     }
  606.  
  607. #if 1
  608.     if(flags&BGBTAC_EFL_HALFMONO)
  609.     {
  610.         for(i=0; i<32; i++)
  611.         {
  612.             p1=oblk[i*4+0];
  613.             p0=(i>0)?oblk[i*4-4]:p1;
  614.             p2=(i<31)?oblk[i*4+4]:p1;
  615.             p3=(i<30)?oblk[i*4+8]:p2;
  616.  
  617.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  618.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  619.  
  620.             oblk[i*4+2]=p3;
  621.         }
  622.     }else if(flags&BGBTAC_EFL_STEREO)
  623.     {
  624.         for(i=0; i<32; i++)
  625.             for(j=0; j<2; j++)
  626.         {
  627.             p1=oblk[i*4+0+j];
  628.             p0=(i>0)?oblk[i*4-4+j]:p1;
  629.             p2=(i<31)?oblk[i*4+4+j]:p1;
  630.             p3=(i<30)?oblk[i*4+8+j]:p2;
  631.  
  632.             s0=(iblk[8+(i>>2)]>>((i&3)*2))&3;
  633.            
  634.             switch(s0)
  635.             {
  636.             case 0:
  637.                 p3=p1;
  638.                 break;
  639.             case 1:
  640.                 p3=p2;
  641.                 break;
  642.             case 2:
  643.                 p3=(p1+p2)>>1;
  644.                 break;
  645.             case 3:
  646.                 p3=(3*p1+3*p2-p0-p3+2)>>2;
  647.                 p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  648.                 break;
  649.             default:
  650.                 p3=(p1+p2)>>1;
  651.                 break;
  652.             }
  653.  
  654.             oblk[i*4+2+j]=p3;
  655.         }
  656.     }else
  657.     {
  658.         for(i=0; i<32; i++)
  659.         {
  660.             p1=oblk[i*2+0];
  661.             p0=(i>0)?oblk[i*2-2]:p1;
  662.             p2=(i<31)?oblk[i*2+2]:p1;
  663.             p3=(i<30)?oblk[i*2+4]:p2;
  664.  
  665.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  666.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  667.  
  668.             oblk[i*2+1]=p3;
  669.         }
  670.     }
  671. #endif
  672. }
  673.  
  674. void BGBTAC_EncodeBlock10S16(s16 *iblk, byte *oblk, int flags)
  675. {
  676.     s16 tcblk[64];
  677.     int tcma[32];
  678.     int tcmb[32];
  679. //  int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  680.     int cm, cn, tc;
  681.     int cm2, cn2, ca2, ba;
  682.     int p0, p1, p2, p3;
  683.     int s0, s1;
  684.     int i, j, k;
  685.  
  686.     BGBTAC_EncodeBlockHeaderS16(iblk, oblk, tcblk, &cm, &cn, flags);
  687.  
  688.     oblk[0]=0x02;
  689.     oblk[1]=0x00;
  690.  
  691.     for(i=0; i<32; i++)
  692.     {
  693.         cm2= 99999; cn2=-99999;
  694.         tc=tcblk[i*2+0];
  695.  
  696.         if(cn!=cm)
  697.             { s0=268435456/(cn-cm); }
  698.         else { s0=0; }
  699.         p0=(s0*(tc-cm)+2097152)>>22;
  700.         p0=(p0<0)?0:((p0<64)?p0:63);
  701.         tcma[i]=p0;
  702.     }
  703.  
  704.     for(i=0; i<32; i++)
  705.     {
  706.         j=i*6;
  707.         k=tcma[i]<<(j&7);
  708.  
  709.         oblk[8+(j>>3)+0]|=k;
  710.         oblk[8+(j>>3)+1]|=k>>8;
  711.     }
  712. }
  713.  
  714. void BGBTAC_DecodeBlock10S16(byte *iblk, s16 *oblk, int flags)
  715. {
  716.     int p0, p1, p2, p3;
  717.     int s0, s1;
  718.     int cm, cn, ca;
  719.     int lm, ln, la;
  720.     int rm, rn, ra;
  721.     int cm2, cn2, ca2;
  722.     int lm2, ln2, la2;
  723.     int rm2, rn2, ra2;
  724.     int i, j, k;
  725.  
  726.     BGBTAC_DecodeBlockHeader(iblk, flags,
  727.         &cm, &cn, &ca, &lm, &ln, &la, &rm, &rn, &ra);
  728.  
  729.     for(i=0; i<32; i++)
  730.     {
  731.         j=i*6;
  732.        
  733.         k=iblk[8+(j>>3)+0] | (iblk[8+(j>>3)+1]<<8);
  734.         p0=(k>>(j&7))&63;
  735.        
  736.         if(flags&BGBTAC_EFL_HALFMONO)
  737.         {
  738.             s0=(ln-lm);
  739.             lm2=((s0*p0+32)>>6)+lm;
  740.  
  741.             lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  742.  
  743.             oblk[i*4+0]=lm2;
  744.             oblk[i*4+2]=lm2;
  745.         }else if(flags&BGBTAC_EFL_STEREO)
  746.         {
  747.             s0=(ln-lm);
  748.             s1=(rn-rm);
  749.             lm2=((s0*p0+32)>>6)+lm;
  750.             rm2=((s1*p0+32)>>6)+rm;
  751.  
  752.             lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  753.             rm2=(rm2<rm)?rm:((rm2<rn)?rm2:rn);
  754.  
  755.             oblk[i*4+0]=lm2;
  756.             oblk[i*4+1]=rm2;
  757.             oblk[i*4+2]=lm2;
  758.             oblk[i*4+3]=rm2;
  759.         }else
  760.         {
  761.             s0=(cn-cm);
  762.             cm2=((s0*p0+32)>>6)+cm;
  763.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  764.  
  765.             oblk[i*2+0]=cm2;
  766.             oblk[i*2+1]=cm2;
  767.         }
  768.     }
  769.  
  770. #if 1
  771.     if(flags&BGBTAC_EFL_HALFMONO)
  772.     {
  773.         for(i=0; i<32; i++)
  774.         {
  775.             p1=oblk[i*4+0];
  776.             p0=(i>0)?oblk[i*4-4]:p1;
  777.             p2=(i<31)?oblk[i*4+4]:p1;
  778.             p3=(i<30)?oblk[i*4+8]:p2;
  779.  
  780.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  781.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  782.  
  783.             oblk[i*4+2]=p3;
  784.         }
  785.     }else
  786.     if(flags&BGBTAC_EFL_STEREO)
  787.     {
  788.         for(i=0; i<32; i++)
  789.             for(j=0; j<2; j++)
  790.         {
  791.             p1=oblk[i*4+0+j];
  792.             p0=(i>0)?oblk[i*4-4+j]:p1;
  793.             p2=(i<31)?oblk[i*4+4+j]:p1;
  794.             p3=(i<30)?oblk[i*4+8+j]:p2;
  795.  
  796.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  797.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  798.  
  799.             oblk[i*4+2+j]=p3;
  800.         }
  801.     }else
  802.     {
  803.         for(i=0; i<32; i++)
  804.         {
  805.             p1=oblk[i*2+0];
  806.             p0=(i>0)?oblk[i*2-2]:p1;
  807.             p2=(i<31)?oblk[i*2+2]:p1;
  808.             p3=(i<30)?oblk[i*2+4]:p2;
  809.  
  810.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  811.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  812.  
  813.             oblk[i*2+1]=p3;
  814.         }
  815.     }
  816. #endif
  817. }
  818.  
  819. void BGBTAC_EncodeBlock12S16(s16 *iblk, byte *oblk, int flags)
  820. {
  821.     s16 tcblk[64], tcpan[64];
  822.     int tcma[32];
  823.     int tcmb[32];
  824.     int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  825.     int cm2, cn2, ca2, ba;
  826.     int p0, p1, p2, p3;
  827.     int s0, s1;
  828.     int i, j, k;
  829.  
  830.     BGBTAC_EncodeBlockHeaderPanS16(
  831.         iblk, oblk, tcblk, tcpan,
  832.         &cm, &cn, &lm, &ln, &rm, &rn,
  833.         flags);
  834.  
  835.     oblk[0]=0x03;
  836.     oblk[1]=0x00;
  837.    
  838.     for(i=0; i<32; i++)
  839.     {
  840.         cm2= 99999; cn2=-99999;
  841.         tc=tcblk[i*2+0];
  842.  
  843. #if 0
  844.         if(cn!=cm)
  845.             { s0=16777216/(cn-cm); }
  846.         else { s0=0; }
  847.  
  848.         p0=(s0*(tc-cm)+524288)>>20;
  849.         p0=(p0<0)?0:((p0<16)?p0:15);
  850.         tcma[i]=p0;
  851. #endif
  852.  
  853. #if 1
  854.         if(cn!=cm)
  855.             { s0=268435456/(cn-cm); }
  856.         else { s0=0; }
  857.         p0=(s0*(tc-cm)+8388608)>>24;
  858.         p0=(p0<0)?0:((p0<16)?p0:15);
  859.         tcma[i]=p0;
  860. #endif
  861.  
  862.         s1=(cn-cm);
  863.         p1=((s1*p0+8)>>4)+cm;
  864.  
  865.         tcmb[i]=p1;
  866.     }
  867.  
  868.     for(i=0; i<32; i++)
  869.         { oblk[16+(i>>1)]|=tcma[i]<<((i&1)*4); }
  870.  
  871. #if 1
  872.     tl=abs(ln-cn);
  873.     tr=-abs(rn-cn);
  874.  
  875.     for(i=0; i<32; i++)
  876.     {
  877.         tc=tcpan[i*2+0];
  878.  
  879.         p2=0;
  880.  
  881. #if 1
  882.         if(tc>tl)
  883.             { p2=2; }
  884.         else if(tc<tr)
  885.             { p2=3; }
  886.         else if(abs(tc)<(tl>>2))
  887.             { p2=1; }
  888.         else
  889.             { p2=0; }
  890. #endif
  891.  
  892.         oblk[8+(i>>2)]|=p2<<((i&3)*2);
  893.     }
  894. #endif
  895. }
  896.  
  897. void BGBTAC_DecodeBlock12S16(byte *iblk, s16 *oblk, int flags)
  898. {
  899.     int p0, p1, p2, p3;
  900.     int s0, s1, s2;
  901.     int cm, cn, ca;
  902.     int lm, ln, la;
  903.     int rm, rn, ra;
  904.     int cm2, cn2, ca2;
  905.     int lm2, ln2, la2;
  906.     int rm2, rn2, ra2;
  907.     int lm3, rm3;
  908.     int i, j, k;
  909.  
  910.     BGBTAC_DecodeBlockHeader(iblk, flags,
  911.         &cm, &cn, &ca, &lm, &ln, &la, &rm, &rn, &ra);
  912.  
  913.     for(i=0; i<32; i++)
  914.     {
  915.         p0=(iblk[16+(i>>1)]>>((i&1)*4))&15;
  916.         p1=(iblk[8+(i>>2)]>>((i&3)*2))&3;
  917.    
  918.         if(flags&BGBTAC_EFL_HALFMONO)
  919.         {
  920.             s0=(cn-cm);
  921.             cm2=((s0*p0+8)>>4)+cm;
  922.  
  923.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  924.  
  925.             oblk[i*4+0]=cm2;
  926.             oblk[i*4+2]=cm2;
  927.         }else if(flags&BGBTAC_EFL_STEREO)
  928.         {
  929.             s0=(ln-lm);
  930.             s1=(rn-rm);
  931.             s2=(cn-cm);
  932.             lm2=((s0*p0+8)>>4)+lm;
  933.             rm2=((s1*p0+8)>>4)+rm;
  934.             cm2=((s2*p0+8)>>4)+cm;
  935.  
  936.             lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  937.             rm2=(rm2<rm)?rm:((rm2<rn)?rm2:rn);
  938.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  939.  
  940.             switch(p1)
  941.             {
  942.             case 0:
  943.                 oblk[i*4+0]=lm2;
  944.                 oblk[i*4+1]=rm2;
  945.                 break;
  946.             case 1:
  947.                 oblk[i*4+0]=cm2;
  948.                 oblk[i*4+1]=cm2;
  949.                 break;
  950.             case 2:
  951.                 lm3=max(lm2, cm2);
  952.                 rm3=min(rm2, cm2);
  953.                 oblk[i*4+0]=lm3;
  954.                 oblk[i*4+1]=rm3;
  955.                 break;
  956.             case 3:
  957.                 lm3=min(lm2, cm2);
  958.                 rm3=max(rm2, cm2);
  959.                 oblk[i*4+0]=lm3;
  960.                 oblk[i*4+1]=rm3;
  961.                 break;
  962.             }
  963.         }else
  964.         {
  965.             s0=(cn-cm);
  966.             cm2=((s0*p0+8)>>4)+cm;
  967.  
  968.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  969.  
  970.             oblk[i*2+0]=cm2;
  971.         }
  972.     }
  973.  
  974. #if 1
  975.     if(flags&BGBTAC_EFL_HALFMONO)
  976.     {
  977.         for(i=0; i<32; i++)
  978.         {
  979.             p1=oblk[i*4+0];
  980.             p0=(i>0)?oblk[i*4-4]:p1;
  981.             p2=(i<31)?oblk[i*4+4]:p1;
  982.             p3=(i<30)?oblk[i*4+8]:p2;
  983.  
  984.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  985.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  986.  
  987.             oblk[i*4+2]=p3;
  988.         }
  989.     }else if(flags&BGBTAC_EFL_STEREO)
  990.     {
  991.         for(i=0; i<32; i++)
  992.             for(j=0; j<2; j++)
  993.         {
  994.             p1=oblk[i*4+0+j];
  995.             p0=(i>0)?oblk[i*4-4+j]:p1;
  996.             p2=(i<31)?oblk[i*4+4+j]:p1;
  997.             p3=(i<30)?oblk[i*4+8+j]:p2;
  998.  
  999.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  1000.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  1001.  
  1002.             oblk[i*4+2+j]=p3;
  1003.         }
  1004.     }else
  1005.     {
  1006.         for(i=0; i<32; i++)
  1007.         {
  1008.             p1=oblk[i*2+0];
  1009.             p0=(i>0)?oblk[i*2-2]:p1;
  1010.             p2=(i<31)?oblk[i*2+2]:p1;
  1011.             p3=(i<30)?oblk[i*2+4]:p2;
  1012.  
  1013.             p3=(3*p1+3*p2-p0-p3+2)>>2;
  1014.             p3=(p3<(-32768))?(-32768):((p3<32768)?p3:32767);
  1015.  
  1016.             oblk[i*2+1]=p3;
  1017.         }
  1018.     }
  1019. #endif
  1020. }
  1021.  
  1022. #if 1
  1023. void BGBTAC_EncodeBlock13S16(s16 *iblk, byte *oblk, int flags)
  1024. {
  1025.     s16 tcblk[64];
  1026.     int tcma[16], tcna[16];
  1027.     int tcmb[16], tcnb[16];
  1028. //  int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  1029.     int cm, cn, tc;
  1030.     int cm2, cn2, ca2, ba, cm2a, cn2a;
  1031.     int p0, p1, p2, p3;
  1032.     int s0, s1;
  1033.     int i, j, k;
  1034.  
  1035.     BGBTAC_EncodeBlockHeaderS16(iblk, oblk, tcblk, &cm, &cn, flags);
  1036.  
  1037.     oblk[0]=0x04;
  1038.     oblk[1]=0x00;
  1039.  
  1040.     for(i=0; i<8; i++)
  1041.     {
  1042.         cm2= 99999; cn2=-99999;
  1043.         for(j=0; j<8; j++)
  1044.         {
  1045.             tc=tcblk[i*8+j];
  1046.             if(tc<cm2) { cm2=tc; }
  1047.             if(tc>cn2) { cn2=tc; }
  1048.         }
  1049.  
  1050. #if 1
  1051.         if(cn!=cm)
  1052.             { s0=268435456/(cn-cm); }
  1053.         else { s0=0; }
  1054.  
  1055.         p0=(s0*(cm2-cm)+8388608)>>24;
  1056.         p1=(s0*(cn2-cm)+8388608)>>24;
  1057. #endif
  1058.  
  1059.         p0=(p0<0)?0:((p0<16)?p0:15);
  1060.         p1=(p1<0)?0:((p1<16)?p1:15);
  1061.        
  1062.         tcma[i]=p0;
  1063.         tcna[i]=p1;
  1064.  
  1065.         s1=(cn-cm);
  1066.         cm2=((s1*p0+8)>>4)+cm;
  1067.         cn2=((s1*p1+8)>>4)+cm;
  1068.         ca2=(cm2+cn2)>>1;
  1069.  
  1070.         cm2=(13*cm2+3*ca2+8)>>4;
  1071.         cn2=(13*cn2+3*ca2+8)>>4;
  1072.  
  1073.         tcmb[i]=cm2;
  1074.         tcnb[i]=cn2;
  1075.     }
  1076.  
  1077.     for(i=0; i<8; i++)
  1078.     {
  1079.         oblk[ 8+(i>>1)]|=tcma[i]<<((i&1)*4);
  1080.         oblk[12+(i>>1)]|=tcna[i]<<((i&1)*4);
  1081.     }
  1082.    
  1083.     for(i=0; i<8; i++)
  1084.     {
  1085.         cm2=tcmb[i];
  1086.         cn2=tcnb[i];
  1087.         ca2=(cm2+cn2)>>1;
  1088.  
  1089. //      cm2a=(11*cm2+5*cn2+8)>>4;
  1090. //      cn2a=(11*cn2+5*cm2+8)>>4;
  1091.  
  1092.         s0=cn2-cm2;
  1093.         cm2a=((22*s0*1+32)>>6)+cm2;
  1094.         cn2a=((22*s0*2+32)>>6)+cm2;
  1095.  
  1096.         for(j=0; j<8; j++)
  1097.         {
  1098.             k=i*8+j;
  1099.             tc=tcblk[k];
  1100.            
  1101. //          p0=0; s0=abs(tc-cm2);
  1102. //          s1=abs(tc-cn2);
  1103. //          if(s1<s0) { p0=1; s0=s1; }
  1104. //          s1=abs(tc-ca2);
  1105. //          if(s1<s0) { p0=2; s0=s1; }
  1106.  
  1107.             p0=0; s0=abs(tc-cm2);
  1108.             s1=abs(tc-cn2);
  1109.             if(s1<s0) { p0=3; s0=s1; }
  1110.             s1=abs(tc-cm2a);
  1111.             if(s1<s0) { p0=1; s0=s1; }
  1112.             s1=abs(tc-cn2a);
  1113.             if(s1<s0) { p0=2; s0=s1; }
  1114.            
  1115.             oblk[16+(k>>2)]|=p0<<((k&3)*2);
  1116.         }
  1117.     }  
  1118. }
  1119.  
  1120. void BGBTAC_DecodeBlock13S16(byte *iblk, s16 *oblk, int flags)
  1121. {
  1122.     int p0, p1, p2, p3;
  1123.     int s0, s1;
  1124.     int cm, cn, ca;
  1125.     int lm, ln, la;
  1126.     int rm, rn, ra;
  1127.     int cm2, cn2, ca2;
  1128.     int lm2, ln2, la2;
  1129.     int rm2, rn2, ra2;
  1130.     int i, j, k;
  1131.  
  1132.     BGBTAC_DecodeBlockHeader(iblk, flags,
  1133.         &cm, &cn, &ca, &lm, &ln, &la, &rm, &rn, &ra);
  1134.  
  1135.     for(i=0; i<8; i++)
  1136.     {
  1137.         p0=(iblk[ 8+(i>>1)]>>((i&1)*4))&15;
  1138.         p1=(iblk[12+(i>>1)]>>((i&1)*4))&15;
  1139.    
  1140.         if(flags&(BGBTAC_EFL_STEREO|BGBTAC_EFL_HALFMONO))
  1141.         {
  1142.             s0=(ln-lm);
  1143.             s1=(rn-rm);
  1144.             lm2=((s0*p0+8)>>4)+lm;
  1145.             ln2=((s0*p1+8)>>4)+lm;
  1146.             rm2=((s1*p0+8)>>4)+rm;
  1147.             rn2=((s1*p1+8)>>4)+rm;
  1148.             la2=(lm2+ln2)>>1;
  1149.             ra2=(rm2+rn2)>>1;
  1150.  
  1151.             lm2=(13*lm2+3*la2+8)>>4;
  1152.             ln2=(13*ln2+3*la2+8)>>4;
  1153.             rm2=(13*rm2+3*ra2+8)>>4;
  1154.             rn2=(13*rn2+3*ra2+8)>>4;
  1155.  
  1156.             lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  1157.             ln2=(ln2<lm)?lm:((ln2<ln)?ln2:ln);
  1158.             rm2=(rm2<rm)?rm:((rm2<rn)?rm2:rn);
  1159.             rn2=(rn2<rm)?rm:((rn2<rn)?rn2:rn);
  1160.         }else
  1161.         {
  1162.             cm2=((s1*p0+8)>>4)+cm;
  1163.             cn2=((s1*p1+8)>>4)+cm;
  1164.             ca2=(cm2+cn2)>>1;
  1165.  
  1166.             cm2=(13*cm2+3*ca2+8)>>4;
  1167.             cn2=(13*cn2+3*ca2+8)>>4;
  1168.  
  1169.             cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  1170.             cn2=(cn2<cm)?cm:((cn2<cn)?cn2:cn);
  1171.         }
  1172.  
  1173.         if(flags&BGBTAC_EFL_HALFMONO)
  1174.         {
  1175.             for(j=0; j<8; j++)
  1176.             {
  1177.                 k=i*8+j;
  1178.        
  1179.                 p0=(iblk[16+(k>>2)]>>((k&3)*2))&3;
  1180.  
  1181.                 s0=ln2-lm2;
  1182.                 p1=((22*s0*p0+32)>>6)+lm2;
  1183.                 oblk[k*2+0]=p1;
  1184.             }
  1185.         }else if(flags&BGBTAC_EFL_STEREO)
  1186.         {
  1187.             for(j=0; j<8; j++)
  1188.             {
  1189.                 k=i*8+j;
  1190.        
  1191.                 p0=(iblk[16+(k>>2)]>>((k&3)*2))&3;
  1192.  
  1193.                 s0=ln2-lm2;
  1194.                 s1=rn2-rm2;
  1195.                 p1=((22*s0*p0+32)>>6)+lm2;
  1196.                 p2=((22*s1*p0+32)>>6)+rm2;
  1197.                 oblk[k*2+0]=p1;
  1198.                 oblk[k*2+1]=p2;
  1199.             }
  1200.         }else
  1201.         {
  1202.             for(j=0; j<8; j++)
  1203.             {
  1204.                 k=i*8+j;
  1205.        
  1206.                 p0=(iblk[16+(k>>2)]>>((k&3)*2))&3;
  1207.  
  1208.                 s0=cn2-cm2;
  1209.                 p1=((22*s0*p0+32)>>6)+cm2;
  1210.                 oblk[k]=p1;
  1211.             }
  1212.         }
  1213.     }
  1214. }
  1215. #endif
  1216.  
  1217.  
  1218. BTAC_API void BGBTAC_FilterStreamMonoS16(s16 *buf, int len)
  1219. {
  1220.     int ta[2];
  1221.     int a, b, c, n;
  1222.     int i, j, k;
  1223.    
  1224.     a=0;
  1225.    
  1226. //  for(i=8; i<(len-8); i++)
  1227.     for(i=0; i<len; i++)
  1228.     {
  1229.         b=buf[i];
  1230. //      c=(a*5+b*11+8)>>4;
  1231. //      c=(a*3+b*13+8)>>4;
  1232.  
  1233. //      c=(a*80+b*176+128)>>8;
  1234.         c=(a*48+b*208+128)>>8;
  1235.         buf[i]=c;
  1236.        
  1237.         a=(b*128+a*128+128)>>8;
  1238. //      a=(b*96+a*160+128)>>8;
  1239. //      a=(b*80+a*176+128)>>8;
  1240. //      a=(b*48+a*208+128)>>8;
  1241.     }
  1242. }
  1243.  
  1244. BTAC_API void BGBTAC_DeblockStreamMonoS16(s16 *oblk, int len)
  1245. {
  1246.     int p0, p1, p2, p3;
  1247.     int q0, q1, q2, q3;
  1248.     float f, g;
  1249.     int i, j, k, n;
  1250.  
  1251.     n=(len+63)/64;
  1252.  
  1253. #if 1
  1254.     //deblocking...
  1255.     for(i=1; i<(n-1); i++)
  1256.     {
  1257. #if 1
  1258.         p0=oblk[i*64-2];
  1259.         p1=oblk[i*64-1];
  1260.         p2=oblk[i*64+0];
  1261.         p3=oblk[i*64+1];
  1262.  
  1263.         q0=(128*p0+ 64*p1+ 48*p2+ 16*p3)>>8;
  1264.         q1=( 48*p0+128*p1+ 48*p2+ 32*p3)>>8;
  1265.         q2=( 32*p0+ 48*p1+128*p2+ 48*p3)>>8;
  1266.         q3=( 16*p0+ 48*p1+ 64*p2+128*p3)>>8;
  1267.        
  1268.         oblk[i*64-2]=q0;
  1269.         oblk[i*64-1]=q1;
  1270.         oblk[i*64+0]=q2;
  1271.         oblk[i*64+1]=q3;
  1272. #endif
  1273.     }
  1274. #endif
  1275. }
  1276.  
  1277. BTAC_API void BGBTAC_FilterStreamS16(s16 *buf, int len)
  1278. {
  1279.     int ta[2];
  1280.     int a, b, c, n;
  1281.     int i, j, k;
  1282.    
  1283.     ta[0]=0; ta[1]=0;
  1284.    
  1285. //  for(i=8; i<(len-8); i++)
  1286.     for(i=0; i<len; i++)
  1287.         for(j=0; j<2; j++)
  1288.     {
  1289.         a=ta[j];
  1290.        
  1291.         b=buf[i*2+j];
  1292. //      c=(a*5+b*11+8)>>4;
  1293. //      c=(a*3+b*13+8)>>4;
  1294.  
  1295. //      c=(a*80+b*176+128)>>8;
  1296.         c=(a*48+b*208+128)>>8;
  1297.         buf[i*2+j]=c;
  1298.        
  1299.         a=(b*128+a*128+128)>>8;
  1300. //      a=(b*96+a*160+128)>>8;
  1301. //      a=(b*80+a*176+128)>>8;
  1302. //      a=(b*48+a*208+128)>>8;
  1303.         ta[j]=a;
  1304.     }
  1305. }
  1306.  
  1307. BTAC_API void BGBTAC_DeblockStreamS16(
  1308.     s16 *oblk, int len)
  1309. {
  1310.     int p0, p1, p2, p3;
  1311.     int q0, q1, q2, q3;
  1312.     float f, g;
  1313.     int i, j, k, n;
  1314.  
  1315.     n=(len+63)/64;
  1316.  
  1317. #if 1
  1318.     //deblocking...
  1319.     for(i=1; i<(n-1); i++)
  1320.         for(j=0; j<2; j++)
  1321.     {
  1322. #if 0
  1323.         p0=oblk[i*64*2-2];
  1324.         p1=oblk[i*64*2-1];
  1325.         p2=oblk[i*64*2+0];
  1326.         p3=oblk[i*64*2+1];
  1327.  
  1328.         q0=(11*p0+5*p2)>>4;
  1329.         q1=(11*p1+5*p3)>>4;
  1330.         q2=(11*p2+5*p0)>>4;
  1331.         q3=(11*p3+5*p1)>>4;
  1332.        
  1333.         oblk[i*64*2-2]=q0;
  1334.         oblk[i*64*2-1]=q1;
  1335.         oblk[i*64*2+0]=q2;
  1336.         oblk[i*64*2+1]=q3;
  1337. #endif
  1338.  
  1339. #if 1
  1340.         p0=oblk[i*64*2-4+j];
  1341.         p1=oblk[i*64*2-2+j];
  1342.         p2=oblk[i*64*2+0+j];
  1343.         p3=oblk[i*64*2+2+j];
  1344.  
  1345.         q0=(128*p0+ 64*p1+ 48*p2+ 16*p3)>>8;
  1346.         q1=( 48*p0+128*p1+ 48*p2+ 32*p3)>>8;
  1347.         q2=( 32*p0+ 48*p1+128*p2+ 48*p3)>>8;
  1348.         q3=( 16*p0+ 48*p1+ 64*p2+128*p3)>>8;
  1349.        
  1350.         oblk[i*64*2-4+j]=q0;
  1351.         oblk[i*64*2-2+j]=q1;
  1352.         oblk[i*64*2+0+j]=q2;
  1353.         oblk[i*64*2+2+j]=q3;
  1354. #endif
  1355.     }
  1356. #endif
  1357. }
  1358.  
  1359. void BGBTAC_EncodeBlockTagS16(s16 *iblk, byte *oblk,
  1360.     int tag, int flags)
  1361. {
  1362.     switch(tag)
  1363.     {
  1364.     case 0:
  1365.         BGBTAC_EncodeBlock8S16(iblk, oblk, flags);
  1366.         break;
  1367.     case 1:
  1368.         BGBTAC_EncodeBlock9S16(iblk, oblk, flags);
  1369.         break;
  1370.     case 2:
  1371.         BGBTAC_EncodeBlock10S16(iblk, oblk, flags);
  1372.         break;
  1373.     case 3:
  1374.         BGBTAC_EncodeBlock12S16(iblk, oblk, flags);
  1375.         break;
  1376.     case 4:
  1377.         BGBTAC_EncodeBlock13S16(iblk, oblk, flags);
  1378.         break;
  1379.     }
  1380. }
  1381.  
  1382. void BGBTAC_DecodeBlockTagS16(byte *iblk, s16 *oblk, int flags)
  1383. {
  1384.     switch(iblk[0]&15)
  1385.     {
  1386.     case 0:
  1387.         BGBTAC_DecodeBlock8S16(iblk, oblk, flags);
  1388.         break;
  1389.     case 1:
  1390.         BGBTAC_DecodeBlock9S16(iblk, oblk, flags);
  1391.         break;
  1392.     case 2:
  1393.         BGBTAC_DecodeBlock10S16(iblk, oblk, flags);
  1394.         break;
  1395.     case 3:
  1396.         BGBTAC_DecodeBlock12S16(iblk, oblk, flags);
  1397.         break;
  1398.     case 4:
  1399.         BGBTAC_DecodeBlock13S16(iblk, oblk, flags);
  1400.         break;
  1401.     }
  1402. }
  1403.  
  1404. BTAC_API int BGBTAC_CalcBlockErrorS16(
  1405.     s16 *iblk, s16 *tblk, int flags)
  1406. {
  1407.     double e;
  1408.     int ld, rd, cd, c0, c1;
  1409.     int i;
  1410.  
  1411.     if(flags&BGBTAC_EFL_HALFMONO)
  1412.     {
  1413.         e=0;
  1414.         for(i=0; i<64; i++)
  1415.         {
  1416.             ld=iblk[i*2+0]-tblk[i*2+0];
  1417.             e+=ld*ld;
  1418.         }
  1419.    
  1420.         i=sqrt(e/64);
  1421.         return(i);
  1422.     }else if(flags&BGBTAC_EFL_STEREO)
  1423.     {
  1424.         e=0;
  1425.         for(i=0; i<64; i++)
  1426.         {
  1427.             ld=iblk[i*2+0]-tblk[i*2+0];
  1428.             rd=iblk[i*2+1]-tblk[i*2+1];
  1429.             c0=(iblk[i*2+0]+iblk[i*2+1])>>1;
  1430.             c1=(tblk[i*2+0]+tblk[i*2+1])>>1;
  1431.             cd=c1-c0;
  1432.             e+=ld*ld;   e+=rd*rd;
  1433.             e+=cd*cd;   e+=cd*cd;
  1434.         }
  1435.    
  1436.         i=sqrt(e/64);
  1437.         return(i);
  1438.     }else
  1439.     {
  1440.         e=0;
  1441.         for(i=0; i<64; i++)
  1442.         {
  1443.             ld=iblk[i]-tblk[i];
  1444.             e+=ld*ld;
  1445.         }
  1446.    
  1447.         i=sqrt(e/64);
  1448.         return(i);
  1449.     }
  1450. }
  1451.  
  1452. BTAC_API int BGBTAC_CheckBlockBestS16(s16 *iblk, int flags)
  1453. {
  1454.     s16 eblk[128];
  1455.     byte tblk[32];
  1456.     int bn, be, te;
  1457.     int i;
  1458.    
  1459.     bn=0; be=999999999;
  1460.     for(i=0; i<5; i++)
  1461.     {
  1462.         BGBTAC_EncodeBlockTagS16(iblk, tblk, i, flags);
  1463.         BGBTAC_DecodeBlockTagS16(tblk, eblk, flags);
  1464.         te=BGBTAC_CalcBlockErrorS16(iblk, eblk, flags);
  1465.         if(te<be) { bn=i; be=te; }
  1466.     }
  1467.    
  1468.     return(bn);
  1469. }
  1470.  
  1471.  
  1472. BTAC_API void BGBTAC_EncodeStreamS16(
  1473.     s16 *iblk, byte *oblk, int len, int flags)
  1474. {
  1475.     int tcnt[16];
  1476.     int i, j, n, tag, ltag, rtag, fl2;
  1477.    
  1478.     for(i=0; i<16; i++)
  1479.         { tcnt[i]=0; }
  1480.    
  1481.     n=(len+63)/64;
  1482.     for(i=0; i<n; i++)
  1483.     {
  1484.         fl2=flags;
  1485.         if((i>0) && i<(n-1))
  1486.             fl2|=BGBTAC_EFL_MIDSTREAM;
  1487.  
  1488.         if((flags&BGBTAC_EFL_STEREO) && (flags&BGBTAC_EFL_HALFMONO))
  1489.         {
  1490. //          tag=0;
  1491. //          tag=2;  //2, 3
  1492. //          tag=BGBTAC_CheckBlockBestS16(
  1493. //              iblk+i*2*64+0, flags&(~BGBTAC_EFL_HALFMONO));
  1494.  
  1495.             ltag=BGBTAC_CheckBlockBestS16(iblk+i*2*64+0, flags);
  1496.             rtag=BGBTAC_CheckBlockBestS16(iblk+i*2*64+1, flags);
  1497.  
  1498.             BGBTAC_EncodeBlockTagS16(
  1499.                 iblk+i*2*64+0, oblk+i*64+ 0, ltag, fl2);
  1500.             BGBTAC_EncodeBlockTagS16(
  1501.                 iblk+i*2*64+1, oblk+i*64+32, rtag, fl2);
  1502. //          tcnt[tag]++;
  1503.  
  1504.             tcnt[ltag]++;
  1505.             tcnt[rtag]++;
  1506.         }else if(flags&BGBTAC_EFL_STEREO)
  1507.         {
  1508. //          tag=0;
  1509. //          tag=1;
  1510. //          tag=4;
  1511.             tag=BGBTAC_CheckBlockBestS16(iblk+i*2*64, flags);
  1512. //          BGBTAC_EncodeBlockTagS16(iblk+i*2*64,
  1513. //              oblk+i*32, tag, flags);
  1514.             BGBTAC_EncodeBlockTagS16(iblk+i*2*64, oblk+i*32, tag, fl2);
  1515.        
  1516. //          printf("%d", tag);
  1517.             tcnt[tag]++;
  1518.         }else
  1519.         {
  1520.             tag=BGBTAC_CheckBlockBestS16(iblk+i*64, flags);
  1521.             BGBTAC_EncodeBlockTagS16(iblk+i*64, oblk+i*32, tag, fl2);
  1522.             tcnt[tag]++;
  1523.         }
  1524.     }
  1525.  
  1526. //  printf("\n");
  1527.    
  1528.     printf("Encode %d: ", n);
  1529.     for(i=0; i<16; i++)
  1530.         printf("%d ", tcnt[i]);
  1531.     printf("\n");
  1532. }
  1533.  
  1534. BTAC_API void BGBTAC_DecodeStreamS16(
  1535.     byte *iblk, s16 *oblk, int len, int flags)
  1536. {
  1537.     int p0, p1, p2, p3;
  1538.     int q0, q1, q2, q3;
  1539.     float f, g;
  1540.     int i, j, k, n;
  1541.    
  1542.     n=(len+63)/64;
  1543.     for(i=0; i<n; i++)
  1544.     {
  1545.         if((flags&BGBTAC_EFL_STEREO) && (flags&BGBTAC_EFL_HALFMONO))
  1546.         {
  1547.             BGBTAC_DecodeBlockTagS16(
  1548.                 iblk+i*64+ 0, oblk+i*2*64+0, flags);
  1549.             BGBTAC_DecodeBlockTagS16(
  1550.                 iblk+i*64+32, oblk+i*2*64+1, flags);
  1551.         }else if(flags&BGBTAC_EFL_STEREO)
  1552.         {
  1553.             BGBTAC_DecodeBlockTagS16(iblk+i*32, oblk+i*2*64, flags);
  1554.         }else
  1555.         {
  1556.             BGBTAC_DecodeBlockTagS16(iblk+i*32, oblk+i*64, flags);
  1557.         }
  1558.     }
  1559.  
  1560.     if((flags&BGBTAC_EFL_STEREO) && (flags&BGBTAC_EFL_HALFMONO))
  1561.     {
  1562.         BGBTAC_DeblockStreamS16(oblk, len);
  1563.         BGBTAC_FilterStreamS16(oblk, len);
  1564.     }else if(flags&BGBTAC_EFL_STEREO)
  1565.     {
  1566.         BGBTAC_DeblockStreamS16(oblk, len);
  1567.         BGBTAC_FilterStreamS16(oblk, len);
  1568.     }else
  1569.     {
  1570.         BGBTAC_DeblockStreamMonoS16(oblk, len);
  1571.         BGBTAC_FilterStreamMonoS16(oblk, len);
  1572.     }
  1573. }
Advertisement
Add Comment
Please, Sign In to add comment