vlc.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:35k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file vlc.c
  4.  *
  5.  * brief
  6.  *    (CA)VLC coding functions
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Inge Lille-Langoy               <inge.lille-langoy@telenor.com>
  11.  *    - Detlev Marpe                    <marpe@hhi.de>
  12.  *    - Stephan Wenger                  <stewe@cs.tu-berlin.de>
  13.  ***************************************************************************
  14.  */
  15. #include "contributors.h"
  16. #include <math.h>
  17. #include "global.h"
  18. #include "enc_statistics.h"
  19. #include "vlc.h"
  20. #if TRACE
  21. #define SYMTRACESTRING(s) strncpy(sym.tracestring,s,TRACESTRING_SIZE)
  22. #else
  23. #define SYMTRACESTRING(s) // do nothing
  24. #endif
  25. //! gives codeword number from CBP value, both for intra and inter
  26. static const unsigned char NCBP[2][48][2]=
  27. {
  28.   {  // 0      1        2       3       4       5       6       7       8       9      10      11
  29.     { 1, 0},{10, 1},{11, 2},{ 6, 5},{12, 3},{ 7, 6},{14,14},{ 2,10},{13, 4},{15,15},{ 8, 7},{ 3,11},
  30.     { 9, 8},{ 4,12},{ 5,13},{ 0, 9},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},
  31.     { 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},
  32.     { 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0},{ 0, 0}
  33.   },
  34.   {
  35.     { 3, 0},{29, 2},{30, 3},{17, 7},{31, 4},{18, 8},{37,17},{ 8,13},{32, 5},{38,18},{19, 9},{ 9,14},
  36.     {20,10},{10,15},{11,16},{ 2,11},{16, 1},{33,32},{34,33},{21,36},{35,34},{22,37},{39,44},{ 4,40},
  37.     {36,35},{40,45},{23,38},{ 5,41},{24,39},{ 6,42},{ 7,43},{ 1,19},{41, 6},{42,24},{43,25},{25,20},
  38.     {44,26},{26,21},{46,46},{12,28},{45,27},{47,47},{27,22},{13,29},{28,23},{14,30},{15,31},{ 0,12}
  39.   }
  40. };
  41. /*!
  42.  *************************************************************************************
  43.  * brief
  44.  *    ue_v, writes an ue(v) syntax element, returns the length in bits
  45.  *
  46.  * param tracestring
  47.  *    the string for the trace file
  48.  * param value
  49.  *    the value to be coded
  50.  *  param bitstream
  51.  *    the target bitstream the value should be coded into
  52.  *
  53.  * return
  54.  *    Number of bits used by the coded syntax element
  55.  *
  56.  *  note
  57.  *    This function writes always the bit buffer for the progressive scan flag, and
  58.  *    should not be used (or should be modified appropriately) for the interlace crap
  59.  *    When used in the context of the Parameter Sets, this is obviously not a
  60.  *    problem.
  61.  *
  62.  *************************************************************************************
  63.  */
  64. int ue_v (char *tracestring, int value, Bitstream *bitstream)
  65. {
  66.   SyntaxElement symbol, *sym=&symbol;
  67.   sym->value1 = value;
  68.   sym->value2 = 0;
  69.   //assert (bitstream->streamBuffer != NULL);
  70.   ue_linfo(sym->value1,sym->value2,&(sym->len),&(sym->inf));
  71.   symbol2uvlc(sym);
  72.   writeUVLC2buffer (sym, bitstream);
  73. #if TRACE
  74.   strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
  75.   trace2out (sym);
  76. #endif
  77.   return (sym->len);
  78. }
  79. /*!
  80.  *************************************************************************************
  81.  * brief
  82.  *    se_v, writes an se(v) syntax element, returns the length in bits
  83.  *
  84.  * param tracestring
  85.  *    the string for the trace file
  86.  * param value
  87.  *    the value to be coded
  88.  *  param bitstream
  89.  *    the target bitstream the value should be coded into
  90.  *
  91.  * return
  92.  *    Number of bits used by the coded syntax element
  93.  *
  94.  *  note
  95.  *    This function writes always the bit buffer for the progressive scan flag, and
  96.  *    should not be used (or should be modified appropriately) for the interlace crap
  97.  *    When used in the context of the Parameter Sets, this is obviously not a
  98.  *    problem.
  99.  *
  100.  *************************************************************************************
  101.  */
  102. int se_v (char *tracestring, int value, Bitstream *bitstream)
  103. {
  104.   SyntaxElement symbol, *sym=&symbol;
  105.   sym->value1 = value;
  106.   sym->value2 = 0;
  107.   //assert (bitstream->streamBuffer != NULL);
  108.   se_linfo(sym->value1,sym->value2,&(sym->len),&(sym->inf));
  109.   symbol2uvlc(sym);
  110.   writeUVLC2buffer (sym, bitstream);
  111. #if TRACE
  112.   strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
  113.   trace2out (sym);
  114. #endif
  115.   return (sym->len);
  116. }
  117. /*!
  118.  *************************************************************************************
  119.  * brief
  120.  *    u_1, writes a flag (u(1) syntax element, returns the length in bits,
  121.  *    always 1
  122.  *
  123.  * param tracestring
  124.  *    the string for the trace file
  125.  * param value
  126.  *    the value to be coded
  127.  *  param bitstream
  128.  *    the target bitstream the value should be coded into
  129.  *
  130.  * return
  131.  *    Number of bits used by the coded syntax element (always 1)
  132.  *
  133.  *  note
  134.  *    This function writes always the bit buffer for the progressive scan flag, and
  135.  *    should not be used (or should be modified appropriately) for the interlace crap
  136.  *    When used in the context of the Parameter Sets, this is obviously not a
  137.  *    problem.
  138.  *
  139.  *************************************************************************************
  140.  */
  141. Boolean u_1 (char *tracestring, int value, Bitstream *bitstream)
  142. {
  143.   SyntaxElement symbol, *sym=&symbol;
  144.   sym->bitpattern = value;
  145.   sym->value1 = value;
  146.   sym->len = 1;
  147.   //assert (bitstream->streamBuffer != NULL);
  148.   writeUVLC2buffer(sym, bitstream);
  149. #if TRACE
  150.   strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
  151.   trace2out (sym);
  152. #endif
  153.   return ((Boolean) sym->len);
  154. }
  155. /*!
  156.  *************************************************************************************
  157.  * brief
  158.  *    u_v, writes a n bit fixed length syntax element, returns the length in bits,
  159.  *
  160.  * param n
  161.  *    length in bits
  162.  * param tracestring
  163.  *    the string for the trace file
  164.  * param value
  165.  *    the value to be coded
  166.  *  param bitstream
  167.  *    the target bitstream the value should be coded into
  168.  *
  169.  * return
  170.  *    Number of bits used by the coded syntax element
  171.  *
  172.  *  note
  173.  *    This function writes always the bit buffer for the progressive scan flag, and
  174.  *    should not be used (or should be modified appropriately) for the interlace crap
  175.  *    When used in the context of the Parameter Sets, this is obviously not a
  176.  *    problem.
  177.  *
  178.  *************************************************************************************
  179.  */
  180. int u_v (int n, char *tracestring, int value, Bitstream *bitstream)
  181. {
  182.   SyntaxElement symbol, *sym=&symbol;
  183.   sym->bitpattern = value;
  184.   sym->value1 = value;
  185.   sym->len = n;  
  186.   //assert (bitstream->streamBuffer != NULL);
  187.   writeUVLC2buffer(sym, bitstream);
  188. #if TRACE
  189.   strncpy(sym->tracestring,tracestring,TRACESTRING_SIZE);
  190.   trace2out (sym);
  191. #endif
  192.   return (sym->len);
  193. }
  194. /*!
  195.  ************************************************************************
  196.  * brief
  197.  *    mapping for ue(v) syntax elements
  198.  * param ue
  199.  *    value to be mapped
  200.  * param dummy
  201.  *    dummy parameter
  202.  * param info
  203.  *    returns mapped value
  204.  * param len
  205.  *    returns mapped value length
  206.  ************************************************************************
  207.  */
  208. void ue_linfo(int ue, int dummy, int *len,int *info)
  209. {
  210.   int i, nn =(ue+1)>>1;
  211.   for (i=0; i < 33 && nn != 0; i++)
  212.   {
  213.     nn >>= 1;
  214.   }
  215.   *len  = (i << 1) + 1;
  216.   *info = ue + 1 - (1 << i);
  217. }
  218. /*!
  219.  ************************************************************************
  220.  * brief
  221.  *    mapping for se(v) syntax elements
  222.  * param se
  223.  *    value to be mapped
  224.  * param dummy
  225.  *    dummy parameter
  226.  * param len
  227.  *    returns mapped value length
  228.  * param info
  229.  *    returns mapped value
  230.  ************************************************************************
  231.  */
  232. void se_linfo(int se, int dummy, int *len,int *info)
  233. {  
  234.   int sign = (se <= 0) ? 1 : 0;
  235.   int n = iabs(se) << 1;   //  n+1 is the number in the code table.  Based on this we find length and info
  236.   int nn = (n >> 1);
  237.   int i;
  238.   for (i = 0; i < 33 && nn != 0; i++)
  239.   {
  240.     nn >>= 1;
  241.   }
  242.   *len  = (i << 1) + 1;
  243.   *info = n - (1 << i) + sign;
  244. }
  245. /*!
  246.  ************************************************************************
  247.  * par Input:
  248.  *    Number in the code table
  249.  * par Output:
  250.  *    length and info
  251.  ************************************************************************
  252.  */
  253. void cbp_linfo_intra(int cbp, int dummy, int *len,int *info)
  254. {
  255.   ue_linfo(NCBP[((img->yuv_format!=0)&&(img->yuv_format!=3))][cbp][0], dummy, len, info);
  256. }
  257. /*!
  258.  ************************************************************************
  259.  * par Input:
  260.  *    Number in the code table
  261.  * par Output:
  262.  *    length and info
  263.  ************************************************************************
  264.  */
  265. void cbp_linfo_inter(int cbp, int dummy, int *len,int *info)
  266. {
  267.   ue_linfo(NCBP[((img->yuv_format!=0)&&(img->yuv_format!=3))][cbp][1], dummy, len, info);
  268. }
  269. /*!
  270.  ************************************************************************
  271.  * brief
  272.  *    2x2 transform of chroma DC
  273.  * par Input:
  274.  *    level and run for coefficients
  275.  * par Output:
  276.  *    length and info
  277.  * note
  278.  *    see ITU document for bit assignment
  279.  ************************************************************************
  280.  */
  281. void levrun_linfo_c2x2(int level,int run,int *len,int *info)
  282. {
  283.   static const int NTAB[2][2]=
  284.   {
  285.     {1,5},
  286.     {3,0}
  287.   };
  288.   static const int LEVRUN[4]=
  289.   {
  290.     2,1,0,0
  291.   };
  292.   int levabs,i,n,sign = 0,nn;
  293.   if (level == 0) //  check if the coefficient sign EOB (level=0)
  294.   {
  295.     *len=1;
  296.     return;
  297.   }
  298.   if (level <= 0)
  299.   {
  300.     sign=1;
  301.   }
  302.   levabs = iabs(level);
  303.   if (levabs <= LEVRUN[run])
  304.   {
  305.     n = NTAB[levabs - 1][run] + 1;
  306.   }
  307.   else
  308.   {
  309.     n = (levabs - LEVRUN[run]) * 8 + run * 2;
  310.   }
  311.   nn = n >> 1;
  312.   for (i=0; i < 16 && nn != 0; i++)
  313.   {
  314.     nn >>= 1;
  315.   }
  316.   *len  = (i << 1) + 1;
  317.   *info = n - (1 << i) + sign;
  318. }
  319. /*!
  320.  ************************************************************************
  321.  * brief
  322.  *    Single scan coefficients
  323.  * par Input:
  324.  *    level and run for coefficients
  325.  * par Output:
  326.  *    length and info
  327.  * note
  328.  *    see ITU document for bit assignment
  329.  ************************************************************************
  330.  */
  331. void levrun_linfo_inter(int level,int run,int *len,int *info)
  332. {
  333.   static const byte LEVRUN[16]=
  334.   {
  335.     4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0
  336.   };
  337.   static const byte NTAB[4][10]=
  338.   {
  339.     { 1, 3, 5, 9,11,13,21,23,25,27},
  340.     { 7,17,19, 0, 0, 0, 0, 0, 0, 0},
  341.     {15, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  342.     {29, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  343.   };
  344.   static int levabs,i,n,sign,nn;
  345.   if (level == 0)           //  check for EOB
  346.   {
  347.     *len=1;
  348.     return;
  349.   }
  350.   sign   = (level <= 0) ? 1 : 0;
  351.   levabs = iabs(level);
  352.   n = (levabs <= LEVRUN[run]) ? NTAB[levabs - 1][run] + 1 : (levabs - LEVRUN[run]) * 32 + run * 2;
  353.   nn = n >> 1;
  354.   for (i=0; i < 16 && nn != 0; i++)
  355.   {
  356.     nn >>= 1;
  357.   }
  358.   *len  = (i << 1) + 1;
  359.   *info = n - (1 << i) + sign;
  360. }
  361. /*!
  362.  ************************************************************************
  363.  * brief
  364.  *    Makes code word and passes it back
  365.  *    A code word has the following format: 0 0 0 ... 1 Xn ...X2 X1 X0.
  366.  *
  367.  * par Input:
  368.  *    Info   : Xn..X2 X1 X0                                             n
  369.  *    Length : Total number of bits in the codeword
  370.  ************************************************************************
  371.  */
  372.  // NOTE this function is called with sym->inf > (1<<(sym->len/2)).  The upper bits of inf are junk
  373. int symbol2uvlc(SyntaxElement *sym)
  374. {
  375.   int suffix_len = sym->len >> 1;
  376.   //assert (suffix_len < 32);
  377.   suffix_len = (1 << suffix_len);
  378.   sym->bitpattern = suffix_len | (sym->inf & (suffix_len - 1));
  379.   return 0;
  380. }
  381. /*!
  382. ************************************************************************
  383. * brief
  384. *    generates UVLC code and passes the codeword to the buffer
  385. ************************************************************************
  386. */
  387. void writeSE_UVLC(SyntaxElement *se, DataPartition *dp)
  388. {
  389.   ue_linfo (se->value1,se->value2,&(se->len),&(se->inf));
  390.   symbol2uvlc(se);
  391.   writeUVLC2buffer(se, dp->bitstream);
  392.   if(se->type != SE_HEADER)
  393.     dp->bitstream->write_flag = 1;
  394. #if TRACE
  395.   if(dp->bitstream->trace_enabled)
  396.     trace2out (se);
  397. #endif
  398. }
  399. /*!
  400. ************************************************************************
  401. * brief
  402. *    generates UVLC code and passes the codeword to the buffer
  403. ************************************************************************
  404. */
  405. void writeSE_SVLC(SyntaxElement *se, DataPartition *dp)
  406. {
  407.   se_linfo (se->value1,se->value2,&(se->len),&(se->inf));
  408.   symbol2uvlc(se);
  409.   writeUVLC2buffer(se, dp->bitstream);
  410.   if(se->type != SE_HEADER)
  411.     dp->bitstream->write_flag = 1;
  412. #if TRACE
  413.   if(dp->bitstream->trace_enabled)
  414.     trace2out (se);
  415. #endif
  416. }
  417. /*!
  418. ************************************************************************
  419. * brief
  420. *    generates UVLC code and passes the codeword to the buffer
  421. ************************************************************************
  422. */
  423. void writeCBP_VLC (Macroblock* currMB, SyntaxElement *se, DataPartition *dp)
  424. {
  425.   if (IS_OLDINTRA (currMB) || currMB->mb_type == SI4MB ||  currMB->mb_type == I8MB)
  426.   {
  427.     cbp_linfo_intra (se->value1,se->value2,&(se->len),&(se->inf));
  428.   }
  429.   else
  430.   {
  431.     cbp_linfo_inter (se->value1,se->value2,&(se->len),&(se->inf));
  432.   }
  433.   symbol2uvlc(se);
  434.   writeUVLC2buffer(se, dp->bitstream);
  435.   if(se->type != SE_HEADER)
  436.     dp->bitstream->write_flag = 1;
  437. #if TRACE
  438.   if(dp->bitstream->trace_enabled)
  439.     trace2out (se);
  440. #endif
  441. }
  442. /*!
  443.  ************************************************************************
  444.  * brief
  445.  *    generates code and passes the codeword to the buffer
  446.  ************************************************************************
  447.  */
  448. void writeIntraPredMode_CAVLC(SyntaxElement *se, DataPartition *dp)
  449. {
  450.   if (se->value1 == -1)
  451.   {
  452.     se->len = 1;
  453.     se->inf = 1;
  454.   }
  455.   else
  456.   {
  457.     se->len = 4;
  458.     se->inf = se->value1;
  459.   }
  460.   se->bitpattern = se->inf;
  461.   writeUVLC2buffer(se, dp->bitstream);
  462.   if(se->type != SE_HEADER)
  463.     dp->bitstream->write_flag = 1;
  464. #if TRACE
  465.   if(dp->bitstream->trace_enabled)
  466.     trace2out (se);
  467. #endif
  468.   return;
  469. }
  470. /*!
  471.  ************************************************************************
  472.  * brief
  473.  *    generates UVLC code and passes the codeword to the buffer
  474.  * author
  475.  *  Tian Dong
  476.  ************************************************************************
  477.  */
  478. int writeSyntaxElement2Buf_UVLC(SyntaxElement *se, Bitstream* this_streamBuffer )
  479. {
  480.   se->mapping(se->value1,se->value2,&(se->len),&(se->inf));
  481.   symbol2uvlc(se);
  482.   writeUVLC2buffer(se, this_streamBuffer );
  483. #if TRACE
  484.   if(se->type <= 1)
  485.     trace2out (se);
  486. #endif
  487.   return (se->len);
  488. }
  489. /*!
  490.  ************************************************************************
  491.  * brief
  492.  *    writes UVLC code to the appropriate buffer
  493.  ************************************************************************
  494.  */
  495. void  writeUVLC2buffer(SyntaxElement *se, Bitstream *currStream)
  496. {
  497.   unsigned int mask = 1 << (se->len - 1);
  498.   int i;  
  499.   //byte *streamBuffer = &currStream->streamBuffer[currStream->byte_pos];
  500.   //assert ((se->len-1) < 32);
  501.   // Add the new bits to the bitstream.
  502.   // Write out a byte if it is full
  503.   for (i = 0; i < se->len; i++)
  504.   {
  505.     currStream->byte_buf <<= 1;
  506.     
  507.     if (se->bitpattern & mask)
  508.       currStream->byte_buf |= 1;
  509.     mask >>= 1;
  510.     
  511.     if ((--currStream->bits_to_go) == 0)
  512.     {
  513.       currStream->bits_to_go = 8;      
  514.       currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;
  515.       //currStream->byte_pos++;
  516.       //*(streamBuffer++) = currStream->byte_buf;
  517.       currStream->byte_buf = 0;      
  518.     }
  519.   }
  520. }
  521. /*!
  522.  ************************************************************************
  523.  * brief
  524.  *    generates UVLC code and passes the codeword to the buffer
  525.  * author
  526.  *  Tian Dong
  527.  ************************************************************************
  528.  */
  529. int writeSyntaxElement2Buf_Fixed(SyntaxElement *se, Bitstream* this_streamBuffer )
  530. {
  531.   writeUVLC2buffer(se, this_streamBuffer );
  532. #if TRACE
  533.   if(se->type <= 1)
  534.     trace2out (se);
  535. #endif
  536.   return (se->len);
  537. }
  538. /*!
  539. ************************************************************************
  540. * brief
  541. *    generates UVLC code and passes the codeword to the buffer
  542. * author
  543. *  Tian Dong
  544. ************************************************************************
  545. */
  546. void writeSE_Flag(SyntaxElement *se, DataPartition *dp )
  547. {
  548.   se->len        = 1;
  549.   se->bitpattern = (se->value1 & 1);
  550.   writeUVLC2buffer(se, dp->bitstream );
  551. #if TRACE
  552.   if(dp->bitstream->trace_enabled)
  553.     trace2out (se);
  554. #endif
  555. }
  556. /*!
  557. ************************************************************************
  558. * brief
  559. *    generates UVLC code and passes the codeword to the buffer
  560. * author
  561. *  Tian Dong
  562. ************************************************************************
  563. */
  564. void writeSE_invFlag(SyntaxElement *se, DataPartition *dp )
  565. {
  566.   se->len        = 1;
  567.   se->bitpattern = 1 - (se->value1 & 1);
  568.   writeUVLC2buffer(se, dp->bitstream );
  569. #if TRACE
  570.   if(dp->bitstream->trace_enabled)
  571.     trace2out (se);
  572. #endif
  573. }
  574. /*!
  575. ************************************************************************
  576. * brief
  577. *    generates UVLC code and passes the codeword to the buffer
  578. * author
  579. *  Tian Dong
  580. ************************************************************************
  581. */
  582. void writeSE_Dummy(SyntaxElement *se, DataPartition *dp )
  583. {
  584.   se->len = 0;
  585. }
  586. /*!
  587. ************************************************************************
  588. * brief
  589. *    generates UVLC code and passes the codeword to the buffer
  590. * author
  591. *  Tian Dong
  592. ************************************************************************
  593. */
  594. void writeSE_Fix(SyntaxElement *se, Bitstream *bitstream )
  595. {
  596.   writeUVLC2buffer(se, bitstream);
  597. #if TRACE
  598.   if(bitstream->trace_enabled)
  599.     trace2out (se);
  600. #endif
  601. }
  602. /*!
  603.  ************************************************************************
  604.  * brief
  605.  *    Makes code word and passes it back
  606.  *
  607.  * par Input:
  608.  *    Info   : Xn..X2 X1 X0                                             n
  609.  *    Length : Total number of bits in the codeword
  610.  ************************************************************************
  611.  */
  612. int symbol2vlc(SyntaxElement *sym)
  613. {
  614.   int info_len = sym->len;
  615.   // Convert info into a bitpattern int
  616.   sym->bitpattern = 0;
  617.   // vlc coding
  618.   while(--info_len >= 0)
  619.   {
  620.     sym->bitpattern <<= 1;
  621.     sym->bitpattern |= (0x01 & (sym->inf >> info_len));
  622.   }
  623.   return 0;
  624. }
  625. /*!
  626.  ************************************************************************
  627.  * brief
  628.  *    generates VLC code and passes the codeword to the buffer
  629.  ************************************************************************
  630.  */
  631. int writeSyntaxElement_VLC(SyntaxElement *se, DataPartition *dp)
  632. {
  633.   se->inf = se->value1;
  634.   se->len = se->value2;
  635.   symbol2vlc(se);
  636.   writeUVLC2buffer(se, dp->bitstream);
  637.   if(se->type != SE_HEADER)
  638.     dp->bitstream->write_flag = 1;
  639. #if TRACE
  640.   if(dp->bitstream->trace_enabled)
  641.     trace2out (se);
  642. #endif
  643.   return (se->len);
  644. }
  645. /*!
  646.  ************************************************************************
  647.  * brief
  648.  *    write VLC for NumCoeff and TrailingOnes
  649.  ************************************************************************
  650.  */
  651. int writeSyntaxElement_NumCoeffTrailingOnes(SyntaxElement *se, DataPartition *dp)
  652. {
  653.   static const int lentab[3][4][17] =
  654.   {
  655.     {   // 0702
  656.       { 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
  657.       { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
  658.       { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
  659.       { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16},
  660.     },
  661.     {
  662.       { 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
  663.       { 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
  664.       { 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
  665.       { 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14},
  666.     },
  667.     {
  668.       { 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
  669.       { 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
  670.       { 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
  671.       { 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10},
  672.     },
  673.   };
  674.   static const int codtab[3][4][17] =
  675.   {
  676.     {
  677.       { 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4},
  678.       { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10,6},
  679.       { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9,5},
  680.       { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12,8},
  681.     },
  682.     {
  683.       { 3,11, 7, 7, 7, 4, 7,15,11,15,11, 8,15,11, 7, 9,7},
  684.       { 0, 2, 7,10, 6, 6, 6, 6,14,10,14,10,14,10,11, 8,6},
  685.       { 0, 0, 3, 9, 5, 5, 5, 5,13, 9,13, 9,13, 9, 6,10,5},
  686.       { 0, 0, 0, 5, 4, 6, 8, 4, 4, 4,12, 8,12,12, 8, 1,4},
  687.     },
  688.     {
  689.       {15,15,11, 8,15,11, 9, 8,15,11,15,11, 8,13, 9, 5,1},
  690.       { 0,14,15,12,10, 8,14,10,14,14,10,14,10, 7,12, 8,4},
  691.       { 0, 0,13,14,11, 9,13, 9,13,10,13, 9,13, 9,11, 7,3},
  692.       { 0, 0, 0,12,11,10, 9, 8,13,12,12,12, 8,12,10, 6,2},
  693.     },
  694.   };
  695.   int vlcnum = se->len;
  696.   // se->value1 : numcoeff
  697.   // se->value2 : numtrailingones
  698.   if (vlcnum == 3)
  699.   {
  700.     se->len = 6;  // 4 + 2 bit FLC
  701.     if (se->value1 > 0)
  702.     {
  703.       se->inf = ((se->value1-1) << 2) | se->value2;
  704.     }
  705.     else
  706.     {
  707.       se->inf = 3;
  708.     }
  709.   }
  710.   else
  711.   {
  712.     se->len = lentab[vlcnum][se->value2][se->value1];
  713.     se->inf = codtab[vlcnum][se->value2][se->value1];
  714.   }
  715.   if (se->len == 0)
  716.   {
  717.     printf("ERROR: (numcoeff,trailingones) not valid: vlc=%d (%d, %d)n",
  718.       vlcnum, se->value1, se->value2);
  719.     exit(-1);
  720.   }
  721.   symbol2vlc(se);
  722.   writeUVLC2buffer(se, dp->bitstream);
  723.   if(se->type != SE_HEADER)
  724.     dp->bitstream->write_flag = 1;
  725. #if TRACE
  726.   if(dp->bitstream->trace_enabled)
  727.     trace2out (se);
  728. #endif
  729.   return (se->len);
  730. }
  731. /*!
  732.  ************************************************************************
  733.  * brief
  734.  *    write VLC for NumCoeff and TrailingOnes for Chroma DC
  735.  ************************************************************************
  736.  */
  737. int writeSyntaxElement_NumCoeffTrailingOnesChromaDC(SyntaxElement *se, DataPartition *dp)
  738. {
  739.   static const int lentab[3][4][17] =
  740.   {
  741.     //YUV420
  742.    {{ 2, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  743.     { 0, 1, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  744.     { 0, 0, 3, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  745.     { 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
  746.     //YUV422
  747.    {{ 1, 7, 7, 9, 9,10,11,12,13, 0, 0, 0, 0, 0, 0, 0, 0},
  748.     { 0, 2, 7, 7, 9,10,11,12,12, 0, 0, 0, 0, 0, 0, 0, 0},
  749.     { 0, 0, 3, 7, 7, 9,10,11,12, 0, 0, 0, 0, 0, 0, 0, 0},
  750.     { 0, 0, 0, 5, 6, 7, 7,10,11, 0, 0, 0, 0, 0, 0, 0, 0}},
  751.     //YUV444
  752.    {{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
  753.     { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
  754.     { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
  755.     { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16}}
  756.   };
  757.   static const int codtab[3][4][17] =
  758.   {
  759.     //YUV420
  760.    {{ 1, 7, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  761.     { 0, 1, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  762.     { 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  763.     { 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
  764.     //YUV422
  765.    {{ 1,15,14, 7, 6, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0},
  766.     { 0, 1,13,12, 5, 6, 6, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0},
  767.     { 0, 0, 1,11,10, 4, 5, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0},
  768.     { 0, 0, 0, 1, 1, 9, 8, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0}},
  769.     //YUV444
  770.    {{ 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7, 4},
  771.     { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10, 6},
  772.     { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9, 5},
  773.     { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12, 8}}
  774.   };
  775.   int yuv = img->yuv_format - 1;
  776.   // se->value1 : numcoeff
  777.   // se->value2 : numtrailingones
  778.   se->len = lentab[yuv][se->value2][se->value1];
  779.   se->inf = codtab[yuv][se->value2][se->value1];
  780.   if (se->len == 0)
  781.   {
  782.     printf("ERROR: (numcoeff,trailingones) not valid: (%d, %d)n",
  783.       se->value1, se->value2);
  784.     exit(-1);
  785.   }
  786.   symbol2vlc(se);
  787.   writeUVLC2buffer(se, dp->bitstream);
  788.   if(se->type != SE_HEADER)
  789.     dp->bitstream->write_flag = 1;
  790. #if TRACE
  791.   if(dp->bitstream->trace_enabled)
  792.     trace2out (se);
  793. #endif
  794.   return (se->len);
  795. }
  796. /*!
  797.  ************************************************************************
  798.  * brief
  799.  *    write VLC for TotalZeros
  800.  ************************************************************************
  801.  */
  802. int writeSyntaxElement_TotalZeros(SyntaxElement *se, DataPartition *dp)
  803. {
  804.   static const int lentab[TOTRUN_NUM][16] =
  805.   {
  806.     { 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
  807.     { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
  808.     { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
  809.     { 5,3,4,4,3,3,3,4,3,4,5,5,5},
  810.     { 4,4,4,3,3,3,3,3,4,5,4,5},
  811.     { 6,5,3,3,3,3,3,3,4,3,6},
  812.     { 6,5,3,3,3,2,3,4,3,6},
  813.     { 6,4,5,3,2,2,3,3,6},
  814.     { 6,6,4,2,2,3,2,5},
  815.     { 5,5,3,2,2,2,4},
  816.     { 4,4,3,3,1,3},
  817.     { 4,4,2,1,3},
  818.     { 3,3,1,2},
  819.     { 2,2,1},
  820.     { 1,1},
  821.   };
  822.   static const int codtab[TOTRUN_NUM][16] =
  823.   {
  824.     {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
  825.     {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
  826.     {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
  827.     {3,7,5,4,6,5,4,3,3,2,2,1,0},
  828.     {5,4,3,7,6,5,4,3,2,1,1,0},
  829.     {1,1,7,6,5,4,3,2,1,1,0},
  830.     {1,1,5,4,3,3,2,1,1,0},
  831.     {1,1,1,3,3,2,2,1,0},
  832.     {1,0,1,3,2,1,1,1,},
  833.     {1,0,1,3,2,1,1,},
  834.     {0,1,1,2,1,3},
  835.     {0,1,1,1,1},
  836.     {0,1,1,1},
  837.     {0,1,1},
  838.     {0,1},
  839.   };
  840.   int vlcnum = se->len;
  841.   // se->value1 : TotalZeros
  842.   se->len = lentab[vlcnum][se->value1];
  843.   se->inf = codtab[vlcnum][se->value1];
  844.   if (se->len == 0)
  845.   {
  846.     printf("ERROR: (TotalZeros) not valid: (%d)n",se->value1);
  847.     exit(-1);
  848.   }
  849.   symbol2vlc(se);
  850.   writeUVLC2buffer(se, dp->bitstream);
  851.   if(se->type != SE_HEADER)
  852.     dp->bitstream->write_flag = 1;
  853. #if TRACE
  854.   if(dp->bitstream->trace_enabled)
  855.     trace2out (se);
  856. #endif
  857.   return (se->len);
  858. }
  859. /*!
  860.  ************************************************************************
  861.  * brief
  862.  *    write VLC for TotalZeros for Chroma DC
  863.  ************************************************************************
  864.  */
  865. int writeSyntaxElement_TotalZerosChromaDC(SyntaxElement *se, DataPartition *dp)
  866. {
  867.   static const int lentab[3][TOTRUN_NUM][16] =
  868.   {
  869.     //YUV420
  870.    {{ 1,2,3,3},
  871.     { 1,2,2},
  872.     { 1,1}},
  873.     //YUV422
  874.    {{ 1,3,3,4,4,4,5,5},
  875.     { 3,2,3,3,3,3,3},
  876.     { 3,3,2,2,3,3},
  877.     { 3,2,2,2,3},
  878.     { 2,2,2,2},
  879.     { 2,2,1},
  880.     { 1,1}},
  881.     //YUV444
  882.    {{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
  883.     { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
  884.     { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
  885.     { 5,3,4,4,3,3,3,4,3,4,5,5,5},
  886.     { 4,4,4,3,3,3,3,3,4,5,4,5},
  887.     { 6,5,3,3,3,3,3,3,4,3,6},
  888.     { 6,5,3,3,3,2,3,4,3,6},
  889.     { 6,4,5,3,2,2,3,3,6},
  890.     { 6,6,4,2,2,3,2,5},
  891.     { 5,5,3,2,2,2,4},
  892.     { 4,4,3,3,1,3},
  893.     { 4,4,2,1,3},
  894.     { 3,3,1,2},
  895.     { 2,2,1},
  896.     { 1,1}}
  897.   };
  898.   static const int codtab[3][TOTRUN_NUM][16] =
  899.   {
  900.     //YUV420
  901.    {{ 1,1,1,0},
  902.     { 1,1,0},
  903.     { 1,0}},
  904.     //YUV422
  905.    {{ 1,2,3,2,3,1,1,0},
  906.     { 0,1,1,4,5,6,7},
  907.     { 0,1,1,2,6,7},
  908.     { 6,0,1,2,7},
  909.     { 0,1,2,3},
  910.     { 0,1,1},
  911.     { 0,1}},
  912.     //YUV444
  913.    {{1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
  914.     {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
  915.     {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
  916.     {3,7,5,4,6,5,4,3,3,2,2,1,0},
  917.     {5,4,3,7,6,5,4,3,2,1,1,0},
  918.     {1,1,7,6,5,4,3,2,1,1,0},
  919.     {1,1,5,4,3,3,2,1,1,0},
  920.     {1,1,1,3,3,2,2,1,0},
  921.     {1,0,1,3,2,1,1,1,},
  922.     {1,0,1,3,2,1,1,},
  923.     {0,1,1,2,1,3},
  924.     {0,1,1,1,1},
  925.     {0,1,1,1},
  926.     {0,1,1},
  927.     {0,1}}
  928.   };
  929.   int vlcnum = se->len;
  930.   int yuv = img->yuv_format - 1;  
  931.   // se->value1 : TotalZeros
  932.   se->len = lentab[yuv][vlcnum][se->value1];
  933.   se->inf = codtab[yuv][vlcnum][se->value1];
  934.   if (se->len == 0)
  935.   {
  936.     printf("ERROR: (TotalZeros) not valid: (%d)n",se->value1);
  937.     exit(-1);
  938.   }
  939.   symbol2vlc(se);
  940.   writeUVLC2buffer(se, dp->bitstream);
  941.   if(se->type != SE_HEADER)
  942.     dp->bitstream->write_flag = 1;
  943. #if TRACE
  944.   if(dp->bitstream->trace_enabled)
  945.     trace2out (se);
  946. #endif
  947.   return (se->len);
  948. }
  949. /*!
  950.  ************************************************************************
  951.  * brief
  952.  *    write VLC for Run Before Next Coefficient, VLC0
  953.  ************************************************************************
  954.  */
  955. int writeSyntaxElement_Run(SyntaxElement *se, DataPartition *dp)
  956. {
  957.   static const int lentab[TOTRUN_NUM][16] =
  958.   {
  959.     {1,1},
  960.     {1,2,2},
  961.     {2,2,2,2},
  962.     {2,2,2,3,3},
  963.     {2,2,3,3,3,3},
  964.     {2,3,3,3,3,3,3},
  965.     {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
  966.   };
  967.   static const int codtab[TOTRUN_NUM][16] =
  968.   {
  969.     {1,0},
  970.     {1,1,0},
  971.     {3,2,1,0},
  972.     {3,2,1,1,0},
  973.     {3,2,3,2,1,0},
  974.     {3,0,1,3,2,5,4},
  975.     {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
  976.   };
  977.   int vlcnum = se->len;
  978.   // se->value1 : run
  979.   se->len = lentab[vlcnum][se->value1];
  980.   se->inf = codtab[vlcnum][se->value1];
  981.   if (se->len == 0)
  982.   {
  983.     printf("ERROR: (run) not valid: (%d)n",se->value1);
  984.     exit(-1);
  985.   }
  986.   symbol2vlc(se);
  987.   writeUVLC2buffer(se, dp->bitstream);
  988.   if(se->type != SE_HEADER)
  989.     dp->bitstream->write_flag = 1;
  990. #if TRACE
  991.   if(dp->bitstream->trace_enabled)
  992.     trace2out (se);
  993. #endif
  994.   return (se->len);
  995. }
  996. /*!
  997.  ************************************************************************
  998.  * brief
  999.  *    write VLC for Coeff Level (VLC1)
  1000.  ************************************************************************
  1001.  */
  1002. int writeSyntaxElement_Level_VLC1(SyntaxElement *se, DataPartition *dp, int profile_idc)
  1003. {
  1004.   int level  = se->value1;
  1005.   int sign   = (level < 0 ? 1 : 0);
  1006.   int levabs = iabs(level);
  1007.   if (levabs < 8)
  1008.   {
  1009.     se->len = levabs * 2 + sign - 1;
  1010.     se->inf = 1;
  1011.   }
  1012.   else if (levabs < 16) 
  1013.   {
  1014.     // escape code1
  1015.     se->len = 19;
  1016.     se->inf = 16 | ((levabs << 1) - 16) | sign;
  1017.   }
  1018.   else
  1019.   {
  1020.     int iMask = 4096, numPrefix = 0;
  1021.     int levabsm16 = levabs + 2032;
  1022.     // escape code2
  1023.     if ((levabsm16) >= 4096)
  1024.     {
  1025.       numPrefix++;
  1026.       while ((levabsm16) >= (4096 << numPrefix))
  1027.       {
  1028.         numPrefix++;
  1029.       }
  1030.     }
  1031.    
  1032.     iMask <<= numPrefix;
  1033.     se->inf = iMask | ((levabsm16 << 1) - iMask) | sign;
  1034.     /* Assert to make sure that the code fits in the VLC */
  1035.     /* make sure that we are in High Profile to represent level_prefix > 15 */
  1036.     if (numPrefix > 0 && !IS_FREXT_PROFILE( profile_idc ))
  1037.     {
  1038.       //error( "level_prefix must be <= 15 except in High Profilen",  1000 );
  1039.       se->len = 0x0000FFFF; // This can be some other big number
  1040.       return (se->len);
  1041.     }
  1042.     
  1043.     se->len = 28 + (numPrefix << 1);
  1044.   }
  1045.   symbol2vlc(se);
  1046.   writeUVLC2buffer(se, dp->bitstream);
  1047.   if(se->type != SE_HEADER)
  1048.     dp->bitstream->write_flag = 1;
  1049. #if TRACE
  1050.   if(dp->bitstream->trace_enabled)
  1051.     trace2out (se);
  1052. #endif
  1053.   return (se->len);
  1054. }
  1055. /*!
  1056.  ************************************************************************
  1057.  * brief
  1058.  *    write VLC for Coeff Level
  1059.  ************************************************************************
  1060.  */
  1061. int writeSyntaxElement_Level_VLCN(SyntaxElement *se, int vlc, DataPartition *dp, int profile_idc)
  1062. {  
  1063.   int level  = se->value1;
  1064.   int sign   = (level < 0 ? 1 : 0);
  1065.   int levabs = iabs(level) - 1;  
  1066.   int shift = vlc - 1;        
  1067.   int escape = (15 << shift);
  1068.   if (levabs < escape)
  1069.   {
  1070.     int sufmask   = ~((0xffffffff) << shift);
  1071.     int suffix    = (levabs) & sufmask;
  1072.     se->len = ((levabs) >> shift) + 1 + vlc;
  1073.     se->inf = (2 << shift) | (suffix << 1) | sign;
  1074.   }
  1075.   else
  1076.   {
  1077.     int iMask = 4096;
  1078.     int levabsesc = levabs - escape + 2048;
  1079.     int numPrefix = 0;
  1080.     if ((levabsesc) >= 4096)
  1081.     {
  1082.       numPrefix++;
  1083.       while ((levabsesc) >= (4096 << numPrefix))
  1084.       {
  1085.         numPrefix++;
  1086.       }
  1087.     }
  1088.     iMask <<= numPrefix;
  1089.     se->inf = iMask | ((levabsesc << 1) - iMask) | sign;
  1090.     /* Assert to make sure that the code fits in the VLC */
  1091.     /* make sure that we are in High Profile to represent level_prefix > 15 */
  1092.     if (numPrefix > 0 &&  !IS_FREXT_PROFILE( profile_idc ))
  1093.     {
  1094.       //error( "level_prefix must be <= 15 except in High Profilen",  1000 );
  1095.       se->len = 0x0000FFFF; // This can be some other big number
  1096.       return (se->len);
  1097.     }
  1098.     se->len = 28 + (numPrefix << 1);
  1099.   }
  1100.   symbol2vlc(se);
  1101.   writeUVLC2buffer(se, dp->bitstream);
  1102.   if(se->type != SE_HEADER)
  1103.     dp->bitstream->write_flag = 1;
  1104. #if TRACE
  1105.   if(dp->bitstream->trace_enabled)
  1106.     trace2out (se);
  1107. #endif
  1108.   return (se->len);
  1109. }
  1110. #if TRACE
  1111. int bitcounter = 0;
  1112. /*!
  1113.  ************************************************************************
  1114.  * brief
  1115.  *    Write out a trace string on the trace file
  1116.  ************************************************************************
  1117.  */
  1118. void trace2out(SyntaxElement *sym)
  1119. {
  1120.   static
  1121.   int i, chars;
  1122.   if (p_trace != NULL)
  1123.   {
  1124.     putc('@', p_trace);
  1125.     chars = fprintf(p_trace, "%i", bitcounter);
  1126.     while(chars++ < 6)
  1127.       putc(' ',p_trace);
  1128.     chars += fprintf(p_trace, "%s", sym->tracestring);
  1129.     while(chars++ < 55)
  1130.       putc(' ',p_trace);
  1131.     // align bit pattern
  1132.     if(sym->len<15)
  1133.     {
  1134.       for(i=0 ; i<15-sym->len ; i++)
  1135.         fputc(' ', p_trace);
  1136.     }
  1137.     // print bit pattern
  1138.     bitcounter += sym->len;
  1139.     for(i=1 ; i<=sym->len ; i++)
  1140.     {
  1141.       if((sym->bitpattern >> (sym->len-i)) & 0x1)
  1142.         fputc('1', p_trace);
  1143.       else
  1144.         fputc('0', p_trace);
  1145.     }
  1146.     fprintf(p_trace, " (%3d) n",sym->value1);
  1147.   }
  1148.   fflush (p_trace);
  1149. }
  1150. void trace2out_cabac(SyntaxElement *sym)
  1151. {
  1152.   int chars;
  1153.   if (p_trace != NULL)
  1154.   {
  1155.     putc('@', p_trace);
  1156.     chars = fprintf(p_trace, "%i", bitcounter);
  1157.     while(chars++ < 6)
  1158.       putc(' ',p_trace);
  1159.     chars += fprintf(p_trace, "%s", sym->tracestring);
  1160.     while(chars++ < 70)
  1161.       putc(' ',p_trace);
  1162.     fprintf(p_trace, " (%3d) n",sym->value1);
  1163.   }
  1164.   fflush (p_trace);
  1165.   bitcounter += sym->len;
  1166. }
  1167. #endif
  1168. /*!
  1169.  ************************************************************************
  1170.  * brief
  1171.  *    puts the less than 8 bits in the byte buffer of the Bitstream into
  1172.  *    the streamBuffer.
  1173.  *
  1174.  * param
  1175.  *   currStream: the Bitstream the alignment should be established
  1176.  *
  1177.  ************************************************************************
  1178.  */
  1179. void writeVlcByteAlign(Bitstream* currStream, StatParameters *cur_stats)
  1180. {
  1181.   if (currStream->bits_to_go < 8)
  1182.   { // trailing bits to process
  1183.     currStream->byte_buf = (currStream->byte_buf << currStream->bits_to_go) | (0xff >> (8 - currStream->bits_to_go));
  1184.     currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;
  1185.     cur_stats->bit_use_stuffingBits[img->type] += currStream->bits_to_go;    
  1186.     currStream->bits_to_go = 8;
  1187.   }
  1188. }