cr88192

Experimental BCn-like Block-Audio Codec

Apr 23rd, 2013
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.26 KB | None | 0 0
  1. /*
  2. Copyright (C) 2013 by Brendan G Bohannon
  3. Copying: http://pastebin.com/iJxtZHm6
  4.  */
  5.  
  6. /*
  7. Experimental block-based audio codec.
  8. Encodes blocks of 64 samples into 256 bits (32 bytes).
  9. At 44.1kHz this is 176kbps.
  10. It can encode stereo using a "naive joint stereo" encoding.
  11.  
  12. Basic Format:
  13.     16 bit min sample (center)
  14.     16 bit max sample (center)
  15.     8 bit left-center min (truncated)
  16.     8 bit left-center max
  17.     currently unused (16 bits)
  18.     64 Samples, 1 bits/sample (64 bits)
  19.     16x 4-bit min (64 bits)
  20.     16x 4-bit max (64 bits)
  21.  
  22. The 4-bit values interpolate between the full min/max for the block.
  23. The 1-bit samples select between the min and max value for each sample.
  24.  
  25. Note: Interpolated values are linear, thus 0=0/15, 1=1/15, 2=2/15, ..., 14=14/15, 15=15/15
  26.  
  27. Bit packing is in low-high order, and multibyte values are little-endian.
  28.  */
  29.  
  30. #include <bgbtac.h>
  31.  
  32. void BGBTAC_EncodeBlock8MonoS16(s16 *iblk, byte *oblk)
  33. {
  34.     int tcma[16], tcna[16];
  35.     int tcmb[16], tcnb[16];
  36.     int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  37.     int cm2, cn2, ca2;
  38.     int p0, p1, p2, p3;
  39.     int s0, s1;
  40.     int i, j, k;
  41.  
  42.     lm= 99999; rm= 99999; cm= 99999;
  43.     ln=-99999; rn=-99999; cn=-99999;
  44.    
  45.     for(i=0; i<64; i++)
  46.     {
  47.         tl=iblk[i]; tr=tl;
  48.         k=(tl+tr)>>1;
  49.         if(k<cm) { lm=tl; rm=tr; cm=k; }
  50.         if(k>cn) { ln=tl; rn=tr; cn=k; }
  51.     }
  52.    
  53.     for(i=0; i<32; i++)
  54.         { oblk[i]=0; }
  55.    
  56.     oblk[0]=cm&0xFF;
  57.     oblk[1]=(cm>>8)&0xFF;
  58.     oblk[2]=cn&0xFF;
  59.     oblk[3]=(cn>>8)&0xFF;
  60.     oblk[4]=((lm-rm+128)>>8)&0xFF;
  61.     oblk[5]=((ln-rn+128)>>8)&0xFF;
  62.    
  63.     for(i=0; i<16; i++)
  64.     {
  65.         cm2= 99999; cn2=-99999;
  66.         for(j=0; j<4; j++)
  67.         {
  68.             tl=iblk[i*4+j]; tr=tl;
  69.             tc=(tl+tr)>>1;
  70.             if(tc<cm2) { cm2=tc; }
  71.             if(tc>cn2) { cn2=tc; }
  72.         }
  73.        
  74.         if(cn!=cm)
  75.             { s0=16777216/(cn-cm); }
  76.         else { s0=0; }
  77.  
  78.         p0=(s0*(cm2-cm)+524288)>>20;
  79.         p1=(s0*(cn2-cm)+524288)>>20;
  80.        
  81.         p0=(p0<0)?0:((p0<16)?p0:15);
  82.         p1=(p1<0)?0:((p1<16)?p1:15);
  83.        
  84.         tcma[i]=p0;
  85.         tcna[i]=p1;
  86.  
  87.         s1=(cn-cm);
  88.         cm2=((s1*p0+8)>>4)+cm;
  89.         cn2=((s1*p1+8)>>4)+cm;
  90.  
  91.         tcmb[i]=cm2;
  92.         tcnb[i]=cn2;
  93.     }
  94.  
  95.     for(i=0; i<16; i++)
  96.     {
  97.         oblk[16+(i>>1)]|=tcma[i]<<((i&1)*4);
  98.         oblk[24+(i>>1)]|=tcna[i]<<((i&1)*4);
  99.     }
  100.    
  101.     for(i=0; i<16; i++)
  102.     {
  103.         ca2=(tcmb[i]+tcnb[i])>>1;
  104.    
  105.         for(j=0; j<4; j++)
  106.         {
  107.             k=i*4+j;
  108.        
  109.             tl=iblk[k]; tr=tl;
  110. //          tl=(iblk[k]+7)>>4; tr=tl;
  111.             tc=(tl+tr)>>1;
  112.  
  113.             if(tc>=ca2)
  114.                 { oblk[8+(k>>3)]|=1<<(k&7); }
  115.             else
  116.                 { oblk[8+(k>>3)]&=~(1<<(k&7)); }
  117.         }
  118.     }  
  119. }
  120.  
  121. void BGBTAC_DecodeBlock8MonoS16(byte *iblk, s16 *oblk)
  122. {
  123.     int tcma[16], tcna[16];
  124.     int tcmb[16], tcnb[16];
  125.     int p0, p1, p2, p3;
  126.     int cm, cn, ca;
  127.     int cm2, cn2, ca2;
  128.     int i, j, k;
  129.    
  130.     cm=(s16)(iblk[0]+(iblk[1]<<8));
  131.     cn=(s16)(iblk[2]+(iblk[3]<<8));
  132.     ca=(cm+cn)>>1;
  133.  
  134.     for(i=0; i<128; i++)
  135.         { oblk[i]=ca; }
  136.        
  137.     for(i=0; i<16; i++)
  138.     {
  139.         cm2=(iblk[16+(i>>1)]>>((i&1)*4))&15;
  140.         cn2=(iblk[24+(i>>1)]>>((i&1)*4))&15;
  141. //      cm2=tcmb[i];
  142. //      cn2=tcnb[i];
  143.    
  144.         j=(cn-cm);
  145.         p0=((j*cm2+8)>>4)+cm;
  146.         p1=((j*cn2+8)>>4)+cm;
  147.  
  148.         p0=(p0<cm)?cm:((p0<cn)?p0:cn);
  149.         p1=(p1<cm)?cm:((p1<cn)?p1:cn);
  150.    
  151.         tcma[i]=p0;
  152.         tcna[i]=p1;
  153.        
  154.         p2=(p0+p1)>>1;
  155. //      if(p2<cm)p2=cm;
  156. //      if(p2>cn)p2=cn;
  157.        
  158.         for(j=0; j<4; j++)
  159.         {
  160.             k=i*4+j;
  161.        
  162. //          oblk[i*16+j]=p2;
  163.             oblk[i*4+j]=(iblk[8+(k>>3)]&(1<<(k&7)))?p1:p0;
  164.         }
  165.     }
  166. }
  167.  
  168. BTAC_API void BGBTAC_EncodeStream8MonoS16(s16 *iblk, byte *oblk, int len)
  169. {
  170.     int i, j, n;
  171.    
  172.     n=(len+63)/64;
  173.     for(i=0; i<n; i++)
  174.     {
  175.         BGBTAC_EncodeBlock8MonoS16(iblk+i*64, oblk+i*32);
  176.     }
  177. }
  178.  
  179. BTAC_API void BGBTAC_DecodeStream8MonoS16(byte *iblk, s16 *oblk, int len)
  180. {
  181.     int i, j, n;
  182.    
  183.     n=(len+63)/64;
  184.     for(i=0; i<n; i++)
  185.     {
  186.         BGBTAC_DecodeBlock8MonoS16(iblk+i*32, oblk+i*64);
  187.     }
  188. }
  189.  
  190.  
  191.  
  192. void BGBTAC_EncodeBlock8StereoS16(s16 *iblk, byte *oblk)
  193. {
  194.     s16 tcblk[64];
  195.     int tcma[16], tcna[16];
  196.     int tcmb[16], tcnb[16];
  197.     int lm, ln, cm, rm, rn, cn, tl, tr, tc;
  198.     int cm2, cn2, ca2, ba;
  199.     int p0, p1, p2, p3;
  200.     int s0, s1;
  201.     int i, j, k;
  202.  
  203.     lm= 99999; rm= 99999; cm= 99999;
  204.     ln=-99999; rn=-99999; cn=-99999;
  205.    
  206.     ba=0;
  207.     for(i=0; i<64; i++)
  208.     {
  209.         tl=iblk[i*2+0];
  210.         tr=iblk[i*2+1];
  211.         k=(tl+tr)>>1;
  212.         tcblk[i]=k;
  213.         ba+=tl-k;
  214.         if(k<cm) { lm=tl; rm=tr; cm=k; }
  215.         if(k>cn) { ln=tl; rn=tr; cn=k; }
  216.     }
  217.  
  218.     ba/=64;
  219.    
  220.     for(i=0; i<32; i++)
  221.         { oblk[i]=0; }
  222.  
  223.    
  224.     p0=(lm-cm+128)>>8;
  225.     p1=(ln-cn+128)>>8;
  226.     p2=(ba+128)>>8;
  227.     p0=(5*p0+11*p2)>>4;
  228.     p1=(5*p1+11*p2)>>4;
  229. //  p0=p2; p1=p2;
  230.  
  231.     p0=(p0<0)?0:((p0<256)?p0:255);
  232.     p1=(p1<0)?0:((p1<256)?p1:255);
  233.    
  234.     oblk[0]=cm&0xFF;
  235.     oblk[1]=(cm>>8)&0xFF;
  236.     oblk[2]=cn&0xFF;
  237.     oblk[3]=(cn>>8)&0xFF;
  238. //  oblk[4]=((lm-cm+128)>>8)&0xFF;
  239. //  oblk[5]=((ln-cn+128)>>8)&0xFF;
  240.  
  241.     oblk[4]=p0&0xFF;
  242.     oblk[5]=p1&0xFF;
  243.    
  244.     for(i=0; i<16; i++)
  245.     {
  246.         cm2= 99999; cn2=-99999;
  247.         for(j=0; j<4; j++)
  248.         {
  249.             tc=tcblk[i*4+j];
  250.             if(tc<cm2) { cm2=tc; }
  251.             if(tc>cn2) { cn2=tc; }
  252.         }
  253.        
  254.         if(cn!=cm)
  255.             { s0=16777216/(cn-cm); }
  256.         else { s0=0; }
  257.  
  258.         p0=(s0*(cm2-cm)+524288)>>20;
  259.         p1=(s0*(cn2-cm)+524288)>>20;
  260.  
  261. //      p0=(s0*(cm2-cm)+262144)>>20;
  262. //      p1=(s0*(cn2-cm)+786432)>>20;
  263.        
  264.         p0=(p0<0)?0:((p0<16)?p0:15);
  265.         p1=(p1<0)?0:((p1<16)?p1:15);
  266.        
  267.         tcma[i]=p0;
  268.         tcna[i]=p1;
  269.  
  270.         s1=(cn-cm);
  271.         cm2=((s1*p0+8)>>4)+cm;
  272.         cn2=((s1*p1+8)>>4)+cm;
  273.  
  274.         tcmb[i]=cm2;
  275.         tcnb[i]=cn2;
  276.     }
  277.  
  278.     for(i=0; i<16; i++)
  279.     {
  280.         oblk[16+(i>>1)]|=tcma[i]<<((i&1)*4);
  281.         oblk[24+(i>>1)]|=tcna[i]<<((i&1)*4);
  282.     }
  283.    
  284.     for(i=0; i<16; i++)
  285.     {
  286.         ca2=(tcmb[i]+tcnb[i])>>1;
  287.    
  288.         for(j=0; j<4; j++)
  289.         {
  290.             k=i*4+j;
  291.             tc=tcblk[k];
  292.             if(tc>=ca2)
  293.                 { oblk[8+(k>>3)]|=1<<(k&7); }
  294.             else
  295.                 { oblk[8+(k>>3)]&=~(1<<(k&7)); }
  296.         }
  297.     }  
  298. }
  299.  
  300. void BGBTAC_DecodeBlock8StereoS16(byte *iblk, s16 *oblk)
  301. {
  302. //  int tcma[16], tcna[16];
  303. //  int tcmb[16], tcnb[16];
  304.     int p0, p1, p2, p3;
  305.     int s0, s1;
  306.     int cm, cn, ca;
  307.     int lm, ln, la;
  308.     int rm, rn, ra;
  309.     int cm2, cn2, ca2;
  310.     int lm2, ln2, la2;
  311.     int rm2, rn2, ra2;
  312.     int i, j, k;
  313.    
  314.     cm=(s16)(iblk[0]+(iblk[1]<<8));
  315.     cn=(s16)(iblk[2]+(iblk[3]<<8));
  316.     ca=(cm+cn)>>1;
  317.  
  318.     i=((s16)(iblk[4]<<8));
  319.     j=((s16)(iblk[5]<<8));
  320.  
  321.     lm=cm+i; rm=cm-i;
  322.     ln=cn+j; rn=cn-j;
  323.  
  324.     lm=(lm<(-32768))?(-32768):((lm<32768)?lm:32767);
  325.     ln=(ln<(-32768))?(-32768):((ln<32768)?ln:32767);
  326.     rm=(rm<(-32768))?(-32768):((rm<32768)?rm:32767);
  327.     rn=(rn<(-32768))?(-32768):((rn<32768)?rn:32767);
  328.  
  329.     for(i=0; i<128; i++)
  330.     {
  331.         oblk[i]=ca;
  332.     }
  333.        
  334.     for(i=0; i<16; i++)
  335.     {
  336.         p0=(iblk[16+(i>>1)]>>((i&1)*4))&15;
  337.         p1=(iblk[24+(i>>1)]>>((i&1)*4))&15;
  338. //      cm2=tcmb[i];
  339. //      cn2=tcnb[i];
  340.  
  341. //      s0=(cn-cm);
  342. //      s1=(cn-cm);
  343.    
  344.         s0=(ln-lm);
  345.         s1=(rn-rm);
  346.         lm2=((s0*p0+8)>>4)+lm;
  347.         ln2=((s0*p1+8)>>4)+lm;
  348.         rm2=((s1*p0+8)>>4)+rm;
  349.         rn2=((s1*p1+8)>>4)+rm;
  350.  
  351. //      cm2=((s1*p0+8)>>4)+cm;
  352. //      cn2=((s1*p1+8)>>4)+cm;
  353.  
  354.         lm2=(lm2<lm)?lm:((lm2<ln)?lm2:ln);
  355.         ln2=(ln2<lm)?lm:((ln2<ln)?ln2:ln);
  356.         rm2=(rm2<rm)?rm:((rm2<rn)?rm2:rn);
  357.         rn2=(rn2<rm)?rm:((rn2<rn)?rn2:rn);
  358.  
  359. //      cm2=(cm2<cm)?cm:((cm2<cn)?cm2:cn);
  360. //      cn2=(cn2<cm)?cm:((cn2<cn)?cn2:cn);
  361.    
  362. //      p2=(p0+p1)>>1;
  363. //      if(p2<cm)p2=cm;
  364. //      if(p2>cn)p2=cn;
  365.        
  366.         for(j=0; j<4; j++)
  367.         {
  368.             k=i*4+j;
  369.        
  370. //          oblk[i*16+j]=p2;
  371.             p0=(iblk[8+(k>>3)]&(1<<(k&7)));
  372.             oblk[k*2+0]=p0?ln2:lm2;
  373.             oblk[k*2+1]=p0?rn2:rm2;
  374.  
  375. //          oblk[k*2+0]=p0?cn2:cm2;
  376. //          oblk[k*2+1]=p0?cn2:cm2;
  377.         }
  378.     }
  379. }
  380.  
  381. BTAC_API void BGBTAC_EncodeStream8StereoS16(s16 *iblk, byte *oblk, int len)
  382. {
  383.     int i, j, n;
  384.    
  385.     n=(len+63)/64;
  386.     for(i=0; i<n; i++)
  387.     {
  388.         BGBTAC_EncodeBlock8StereoS16(iblk+i*2*64, oblk+i*32);
  389.     }
  390. }
  391.  
  392. BTAC_API void BGBTAC_DecodeStream8StereoS16(byte *iblk, s16 *oblk, int len)
  393. {
  394.     int p0, p1, p2, p3;
  395.     int q0, q1, q2, q3;
  396.     int i, j, n;
  397.    
  398.     n=(len+63)/64;
  399.     for(i=0; i<n; i++)
  400.     {
  401.         BGBTAC_DecodeBlock8StereoS16(iblk+i*32, oblk+i*2*64);
  402.     }
  403.    
  404.     //deblocking...
  405.     for(i=1; i<(n-1); i++)
  406.         for(j=0; j<2; j++)
  407.     {
  408. #if 0
  409.         p0=oblk[i*64*2-2];
  410.         p1=oblk[i*64*2-1];
  411.         p2=oblk[i*64*2+0];
  412.         p3=oblk[i*64*2+1];
  413.  
  414.         q0=(11*p0+5*p2)>>4;
  415.         q1=(11*p1+5*p3)>>4;
  416.         q2=(11*p2+5*p0)>>4;
  417.         q3=(11*p3+5*p1)>>4;
  418.        
  419.         oblk[i*64*2-2]=q0;
  420.         oblk[i*64*2-1]=q1;
  421.         oblk[i*64*2+0]=q2;
  422.         oblk[i*64*2+1]=q3;
  423. #endif
  424.  
  425. #if 1
  426.         p0=oblk[i*64*2-4+j];
  427.         p1=oblk[i*64*2-2+j];
  428.         p2=oblk[i*64*2+0+j];
  429.         p3=oblk[i*64*2+2+j];
  430.  
  431.         q0=(128*p0+ 64*p1+ 48*p2+ 16*p3)>>8;
  432.         q1=( 48*p0+128*p1+ 48*p2+ 32*p3)>>8;
  433.         q2=( 32*p0+ 48*p1+128*p2+ 48*p3)>>8;
  434.         q3=( 16*p0+ 48*p1+ 64*p2+128*p3)>>8;
  435.        
  436.         oblk[i*64*2-4+j]=q0;
  437.         oblk[i*64*2-2+j]=q1;
  438.         oblk[i*64*2+0+j]=q2;
  439.         oblk[i*64*2+2+j]=q3;
  440. #endif
  441.     }
  442. }
Advertisement
Add Comment
Please, Sign In to add comment