1. /*
  2.     Project  : H.264 encoder test    
  3.     Module   : Context-adaptive variable-length coding (CAVLC)
  4.  
  5.     Author   : Marko 'Fador' Viitanen
  6.  
  7.     Date     : 11/5/2009
  8.     Modified : 27/6/2009
  9.  
  10. */
  11.  
  12. #include <math.h>
  13. #include <stdarg.h>
  14. #include <stdio.h>
  15. #include "common.h"
  16. #include "tables.h"
  17. #include "cavlc.h"
  18. #include "bitstream.h"
  19.  
  20.  
  21.  
  22. #define DEBUG 1
  23.  
  24. void printf_cavlc(char *msg, ...)
  25. {
  26. #if DEBUG == 1
  27. va_list fmtargs;
  28. char buffer[1024];
  29.  
  30.   va_start(fmtargs,msg);
  31.   vsnprintf(buffer,sizeof(buffer)-1,msg,fmtargs);
  32.   va_end(fmtargs);
  33.   printf("%s",buffer);
  34. #endif
  35.  
  36. }
  37.  
  38. //From wikipedia
  39. //http://en.wikipedia.org/wiki/Binary_logarithm#Algorithm
  40. int floorLog2(unsigned int n) {
  41.   int pos = 0;
  42.   if (n >= 1<<16) { n >>= 16; pos += 16; }
  43.   if (n >= 1<< 8) { n >>=  8; pos +=  8; }
  44.   if (n >= 1<< 4) { n >>=  4; pos +=  4; }
  45.   if (n >= 1<< 2) { n >>=  2; pos +=  2; }
  46.   if (n >= 1<< 1) {           pos +=  1; }
  47.   return ((n == 0) ? (-1) : pos);  
  48. }
  49.  
  50. //Initialize the Exp Golomb code table with desired number of values
  51. void init_exp_golomb(uint32 len)
  52. {
  53.     uint32 code_num;
  54.     uint32 M;
  55.     uint32 info;
  56.     exp_table=(bitTable*)malloc(len*sizeof(bitTable));    
  57.    
  58.     for(code_num=0;code_num<len;code_num++)
  59.     {
  60.         M=(uint32)floorLog2(code_num+1);
  61.         info=code_num+1-(uint32)pow(2,M);        
  62.         exp_table[code_num].len=M*2+1;
  63.         exp_table[code_num].value=(1<<M)|info;
  64.         //printf_cavlc("Len: %i %x\n", M*2+1, (1<<M)|info);
  65.     }
  66. }
  67.  
  68.  
  69. uint32 get_exp_golomb_code(sint32 value, uint32* len, uint8 maptype)
  70. {
  71.     uint32 index=0;
  72.  
  73.     switch(maptype)
  74.     {
  75.         //Unsigned
  76.         case EXP_UNSIGNED:
  77.             index=(uint32)value;
  78.             break;
  79.         //Signed
  80.         case EXP_SIGNED:
  81.             index=(value<=0)?2*(uint32)abs(value):2*(uint32)abs(value)-1;
  82.             break;
  83.         //Intra coding
  84.         case EXP_INTRA:
  85.             index=coded_block_pattern_intra[value];
  86.             break;
  87.         //Inter coding
  88.         case EXP_INTER:
  89.             index=coded_block_pattern_inter[value];
  90.             break;
  91.     }
  92.  
  93.     len[0]=exp_table[index].len;
  94.     return exp_table[index].value;
  95. }
  96.  
  97.  
  98. static uint8 countCoeffs(sint32 *block, uint8 totCount,valueTable *coeffTable)
  99. {
  100.     uint8 i;
  101.     uint8 total=0;
  102.     for(i=0;i<totCount;i++)
  103.     {
  104.         if(block[i]!=0)
  105.         {
  106.             coeffTable[total].value=block[i];
  107.             coeffTable[total].pos=i;
  108.             total++;
  109.         }
  110.     }
  111.     return total;
  112. }
  113.  
  114. static uint8 countZeros(sint32 *block, uint8 totCount,valueTable *zeroTable)
  115. {
  116.     sint8 i;
  117.     uint8 total=0;
  118.     for(i=totCount-1;i>=0;i--)
  119.     {
  120.         if(block[i]==0)
  121.         {
  122.             zeroTable[total].value=block[i];
  123.             zeroTable[total].pos=i;
  124.             total++;
  125.         }
  126.     }
  127.     return total;
  128. }
  129.  
  130. //Find trailing ones from the block, maximum of 3 ones
  131. static uint8 findTrailingOnes(sint32 *block, uint8 totCount, valueTable *table)
  132. {
  133.     uint8 oneCount=0;
  134.     sint8 i;
  135.     uint32 tempval;
  136.    
  137.     for(i=totCount-1;i>=0;i--)
  138.     {
  139.         tempval=(uint32)abs(block[i]);
  140.         //Non-zero
  141.         if(tempval!=0)
  142.         {
  143.             //One
  144.             if(tempval==1)
  145.             {
  146.                 table[oneCount].value=block[i];
  147.                 table[oneCount].pos=i;
  148.                 oneCount++;
  149.                 if(oneCount==3) return oneCount;
  150.             }
  151.             //Other coeff
  152.             else
  153.             {
  154.                 return oneCount;
  155.             }
  156.         }
  157.     }
  158.     //This should newer be executed! Just for the show ;)
  159.     return oneCount;
  160. }
  161.  
  162. bitTable lev_VLCN[7][4096];
  163.  
  164.  
  165. uint8 genLevelVLC()
  166. {
  167.     uint16 code;
  168.     uint8 table;
  169.  
  170.  
  171.     for(code=0;code<4096;code++)
  172.     {
  173.  
  174.         //level VLC0
  175.         if(code<14)
  176.         {
  177.             lev_VLCN[0][code].len=code+1;
  178.             lev_VLCN[0][code].value=1;
  179.         }
  180.         else if(code<30)
  181.         {
  182.             lev_VLCN[0][code].len=19;
  183.             lev_VLCN[0][code].value=(1<<4)|code;
  184.         }
  185.         else
  186.         {
  187.             lev_VLCN[0][code].len=28;
  188.             lev_VLCN[0][code].value=(1<<12)|code;
  189.         }
  190.  
  191.         //level VLC1-6
  192.         //TODO verify tables!
  193.         for(table=1;table<7;table++)
  194.         {
  195.             if(code<30*(1<<(table-1)))
  196.             {
  197.                 lev_VLCN[table][code].len=((uint32)floor(code/(1<<table)))+(table+1);
  198.                 lev_VLCN[table][code].value=(1<<table)|(code%(1<<table));
  199.             }
  200.             else
  201.             {
  202.                 lev_VLCN[2][code].len=28;
  203.                 lev_VLCN[2][code].value=(1<<12)|code;
  204.             }
  205.         }
  206.     }
  207.  
  208. }
  209.  
  210. bitTable levelVLC(sint32 levelCode, uint8 table)
  211. {
  212.     bitTable returnValue;  
  213.          
  214.     returnValue=lev_VLCN[table][((levelCode<=0)?2*(uint32)abs(levelCode+1)+1:2*(uint32)abs(levelCode-1))];
  215.     printf_cavlc("levelVLC(%i,%i) = {%i,%i} val: %i\n", levelCode,table,returnValue.value,returnValue.len,
  216.         ((levelCode<=0)?2*(uint32)abs(levelCode+1)+1:2*(uint32)abs(levelCode-1)));
  217.  
  218.     return returnValue;
  219. }
  220.  
  221. uint8 cavlc_code_coeff_4x4(sint32 block[4*4], bitstream *stream, uint8 nC)
  222. {
  223.     sint32 reordered[4*4];
  224.     sint16 i;
  225.     valueTable oneTable[3];
  226.     valueTable zeroTable[16];
  227.     valueTable coeffTable[16];
  228.     uint8 TotalCoeffs;
  229.     uint8 TrailingOnes;
  230.     //Which table to select for nC
  231.     uint8 nC_to_table[16] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3};
  232.     //Thresholds to move to next suffixLength
  233.     uint8 suffixThresholds[7] = {0,3,6,12,24,48,255};
  234.     uint8 tableToUse=nC_to_table[nC];
  235.     uint8 suffixLength=0;
  236.     uint8 total_zeros;
  237.     uint8 ZerosLeft;
  238.     uint8 run_before;
  239.     bitTable tempValue;
  240.    
  241.  
  242.     genLevelVLC();
  243.  
  244.     printf_cavlc("Reorder: ");
  245.     //Zig-zag reorder
  246.     for(i=0;i<4*4;i++)
  247.     {
  248.         reordered[i]=block[zigzag_4x4[i]];
  249.         printf_cavlc("%i,",reordered[i]);
  250.     }
  251.     printf_cavlc("\n");
  252.  
  253.     //Stage 1 Page 201
  254.     //coeff token
  255.        
  256.     TrailingOnes=findTrailingOnes(&reordered, 4*4, &oneTable);
  257.     TotalCoeffs=countCoeffs(&reordered, 4*4, &coeffTable);
  258.     printf_cavlc("TotalCoeffs: %i\n", TotalCoeffs);
  259.  
  260.     //Value from table for TotalCoeffs and TrailingOnes
  261.     bitstream_put(stream, coeff_token_tables[TotalCoeffs][TrailingOnes][tableToUse].value,
  262.                           coeff_token_tables[TotalCoeffs][TrailingOnes][tableToUse].len);
  263.  
  264.     //Init suffixLength as 1 when more than 10 coeffs and less than 3 trailing ones
  265.     //Page 202 book, page 223 specification
  266.     if(TotalCoeffs>10 && TrailingOnes<3) suffixLength=1;
  267.  
  268.     //TrailingOnes signs to stream
  269.     for(i=0;i<TrailingOnes;i++)
  270.     {
  271.         bitstream_put(stream,(oneTable[i].value==-1)?1:0, 1);
  272.     }
  273.  
  274.     //Levels to bitstream (not the trailing ones)
  275.     for(i=TotalCoeffs-1-TrailingOnes;i>=0;i--)
  276.     {
  277.         //If less than 3 trailing ones the first level to encode
  278.         //Cannot be 1, so we can save bits to set +-2=+-1, +-3=+-2 etc
  279.         if(TrailingOnes<3 && i==TotalCoeffs-1-TrailingOnes){  coeffTable[i].value=((coeffTable[i].value<0)?coeffTable[i].value+1:coeffTable[i].value-1);}
  280.  
  281.         //Level VLC from tables
  282.         tempValue=levelVLC(coeffTable[i].value,suffixLength);
  283.         bitstream_put(stream,tempValue.value,tempValue.len);        
  284.  
  285.         //Check if we need to increase suffix Length
  286.         if((uint32)abs(coeffTable[i].value)>suffixThresholds[suffixLength])
  287.             suffixLength++;
  288.     }
  289.  
  290.     //Total number of zeros
  291.     total_zeros=countZeros(&reordered,(TrailingOnes?oneTable[0].pos:coeffTable[TotalCoeffs-1].pos),zeroTable);
  292.     printf_cavlc("total_zeros: %i\n", total_zeros);
  293.     bitstream_put(stream,total_zeros_4x4[total_zeros][TotalCoeffs-1].value,total_zeros_4x4[total_zeros][TotalCoeffs-1].len);
  294.    
  295.     //Run before
  296.  
  297.     if(total_zeros)
  298.     {
  299.         run_before=0;
  300.         ZerosLeft=total_zeros;
  301.  
  302.         for(i=zeroTable[0].pos;i>=0&&i>coeffTable[0].pos&&ZerosLeft>0;i--)
  303.         {
  304.             if(reordered[i]==0)
  305.             {
  306.                 run_before++;
  307.                 printf_cavlc("run_before++\n");
  308.             }
  309.             else
  310.             {                
  311.                 printf_cavlc("run_before: %i zerosleft: %i\n", run_before,ZerosLeft);
  312.                 bitstream_put(stream,run_before_table[run_before][((ZerosLeft>6)?6:ZerosLeft-1)].value,
  313.                                      run_before_table[run_before][((ZerosLeft>6)?6:ZerosLeft-1)].len);
  314.                 ZerosLeft-=run_before;
  315.                 run_before=0;
  316.             }
  317.         }
  318.         if(run_before)
  319.         {
  320.            bitstream_put(stream,run_before_table[run_before][((ZerosLeft>6)?6:ZerosLeft-1)].value,
  321.                                      run_before_table[run_before][((ZerosLeft>6)?6:ZerosLeft-1)].len);
  322.         }
  323.     }
  324.  
  325.  
  326.     for(i=0;i<stream->cur_bit;i++)
  327.     {
  328.         printf_cavlc("%i", (((stream->data[0]&(1<<(31-i)) ))?1:0));
  329.     }
  330.    
  331.     printf_cavlc("\n");
  332.     //printf_cavlc("\n%x %x %i %i\n", stream->data[0],stream->data[1], stream->cur_bit, stream->cur_byte);
  333.  
  334.     return TotalCoeffs;
  335. }
  336.