uvlc.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. ***********************************************************************
  3. * COPYRIGHT AND WARRANTY INFORMATION
  4. *
  5. * Copyright 2001, International Telecommunications Union, Geneva
  6. *
  7. * DISCLAIMER OF WARRANTY
  8. *
  9. * These software programs are available to the user without any
  10. * license fee or royalty on an "as is" basis. The ITU disclaims
  11. * any and all warranties, whether express, implied, or
  12. * statutory, including any implied warranties of merchantability
  13. * or of fitness for a particular purpose.  In no event shall the
  14. * contributor or the ITU be liable for any incidental, punitive, or
  15. * consequential damages of any kind whatsoever arising from the
  16. * use of these programs.
  17. *
  18. * This disclaimer of warranty extends to the user of these programs
  19. * and user's customers, employees, agents, transferees, successors,
  20. * and assigns.
  21. *
  22. * The ITU does not represent or warrant that the programs furnished
  23. * hereunder are free of infringement of any third-party patents.
  24. * Commercial implementations of ITU-T Recommendations, including
  25. * shareware, may be subject to royalty fees to patent holders.
  26. * Information regarding the ITU-T patent policy is available from
  27. * the ITU Web site at http://www.itu.int.
  28. *
  29. * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
  30. ************************************************************************
  31. */
  32. /*!
  33.  ***************************************************************************
  34.  * file uvlc.c
  35.  *
  36.  * brief
  37.  *    UVLC table helper functions
  38.  *
  39.  * author
  40.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  41.  *    - Inge Lille-Lang鴜               <inge.lille-langoy@telenor.com>
  42.  *    - Detlev Marpe                    <marpe@hhi.de>
  43.  *    - Stephan Wenger                  <stewe@cs.tu-berlin.de>
  44.  ***************************************************************************
  45.  */
  46. #include "contributors.h"
  47. #include <math.h>
  48. #include <stdlib.h>
  49. #include <string.h>
  50. #include <assert.h>
  51. #include "elements.h"
  52. /*!
  53.  ************************************************************************
  54.  * brief
  55.  *    n_linfo
  56.  * par Input:
  57.  *    Number in the code table
  58.  * par Output:
  59.  *    lenght and info
  60.  ************************************************************************
  61.  */
  62. void n_linfo(int n, int *len,int *info)
  63. {
  64.   int i,nn;
  65.   nn=(n+1)/2;
  66.   for (i=0; i < 16 && nn != 0; i++)
  67.   {
  68.     nn /= 2;
  69.   }
  70.   *len= 2*i + 1;
  71.   *info=n+1-(int)pow(2,i);
  72. }
  73. /*!
  74.  ************************************************************************
  75.  * par Input:
  76.  *    Number in the code table
  77.  * par Output:
  78.  *    lenght and info
  79.  ************************************************************************
  80.  */
  81. void n_linfo2(int n, int dummy, int *len,int *info)
  82. {
  83.   int i,nn;
  84.   nn=(n+1)/2;
  85.   for (i=0; i < 16 && nn != 0; i++)
  86.   {
  87.     nn /= 2;
  88.   }
  89.   *len= 2*i + 1;
  90.   *info=n+1-(int)pow(2,i);
  91. }
  92. /*!
  93.  ************************************************************************
  94.  * par Input:
  95.  *    Number in the code table
  96.  * par Output:
  97.  *    lenght and info
  98.  ************************************************************************
  99.  */
  100. void intrapred_linfo(int ipred1, int ipred2, int *len,int *info)
  101. {
  102.   extern const int IPRED_ORDER[6][6];
  103.   n_linfo(IPRED_ORDER[ipred1][ipred2],len,info);
  104. }
  105. /*!
  106.  ************************************************************************
  107.  * par Input:
  108.  *    Number in the code table
  109.  * par Output:
  110.  *    lenght and info
  111.  ************************************************************************
  112.  */
  113. void cbp_linfo_intra(int cbp, int dummy, int *len,int *info)
  114. {
  115.   extern const int NCBP[48][2];
  116.   n_linfo(NCBP[cbp][0],len,info);
  117. }
  118. /*!
  119.  ************************************************************************
  120.  * par Input:
  121.  *    Number in the code table
  122.  * par Output:
  123.  *    lenght and info
  124.  ************************************************************************
  125.  */
  126. void cbp_linfo_inter(int cbp, int dummy, int *len,int *info)
  127. {
  128.   extern const int NCBP[48][2];
  129.   n_linfo(NCBP[cbp][1],len,info);
  130. }
  131. /*!
  132.  ************************************************************************
  133.  * par Input:
  134.  *    delta quant
  135.  * par Output:
  136.  *    lenght and info
  137.  ************************************************************************
  138.  */
  139. void dquant_linfo(int dquant, int dummy, int *len,int *info)
  140. {
  141.   int i,n,sign,nn;
  142.   sign=0;
  143.   if (dquant <= 0)
  144.   {
  145.     sign=1;
  146.   }
  147.   n=abs(dquant) << 1;
  148.   /*
  149.   n+1 is the number in the code table.  Based on this we find length and info
  150.   */
  151.   nn=n/2;
  152.   for (i=0; i < 16 && nn != 0; i++)
  153.   {
  154.     nn /= 2;
  155.   }
  156.   *len=i*2 + 1;
  157.   *info=n - (int)pow(2,i) + sign;
  158. }
  159. /*!
  160.  ************************************************************************
  161.  * par Input:
  162.  *    motion vector differense
  163.  * par Output:
  164.  *    lenght and info
  165.  ************************************************************************
  166.  */
  167. void mvd_linfo2(int mvd, int dummy, int *len,int *info)
  168. {
  169.   int i,n,sign,nn;
  170.   sign=0;
  171.   if (mvd <= 0)
  172.   {
  173.     sign=1;
  174.   }
  175.   n=abs(mvd) << 1;
  176.   /*
  177.   n+1 is the number in the code table.  Based on this we find length and info
  178.   */
  179.   nn=n/2;
  180.   for (i=0; i < 16 && nn != 0; i++)
  181.   {
  182.     nn /= 2;
  183.   }
  184.   *len=i*2 + 1;
  185.   *info=n - (int)pow(2,i) + sign;
  186. }
  187. /*!
  188.  ************************************************************************
  189.  * brief
  190.  *    2x2 transform of chroma DC
  191.  * par Input:
  192.  *    level and run for coefficiets
  193.  * par Output:
  194.  *    lenght and info
  195.  * note
  196.  *    see ITU document for bit assignment
  197.  ************************************************************************
  198.  */
  199. void levrun_linfo_c2x2(int level,int run,int *len,int *info)
  200. {
  201.   const int NTAB[2][2]=
  202.   {
  203.     {1,5},
  204.     {3,0}
  205.   };
  206.   const int LEVRUN[4]=
  207.   {
  208.     2,1,0,0
  209.   };
  210.   int levabs,i,n,sign,nn;
  211.   if (level == 0) //  check if the coefficient sign EOB (level=0)
  212.   {
  213.     *len=1;
  214.     return;
  215.   }
  216.   sign=0;
  217.   if (level <= 0)
  218.   {
  219.     sign=1;
  220.   }
  221.   levabs=abs(level);
  222.   if (levabs <= LEVRUN[run])
  223.   {
  224.     n=NTAB[levabs-1][run]+1;
  225.   }
  226.   else
  227.   {
  228.     n=(levabs-LEVRUN[run])*8 + run*2;
  229.   }
  230.   nn=n/2;
  231.   for (i=0; i < 16 && nn != 0; i++)
  232.   {
  233.     nn /= 2;
  234.   }
  235.   *len= 2*i + 1;
  236.   *info=n-(int)pow(2,i)+sign;
  237. }
  238. /*!
  239.  ************************************************************************
  240.  * brief
  241.  *    Single scan coefficients
  242.  * par Input:
  243.  *    level and run for coefficiets
  244.  * par Output:
  245.  *    lenght and info
  246.  * note
  247.  *    see ITU document for bit assignment
  248.  ************************************************************************
  249.  */
  250. void levrun_linfo_inter(int level,int run,int *len,int *info)
  251. {
  252.   const byte LEVRUN[16]=
  253.   {
  254.     4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0
  255.   };
  256.   const byte NTAB[4][10]=
  257.   {
  258.     { 1, 3, 5, 9,11,13,21,23,25,27},
  259.     { 7,17,19, 0, 0, 0, 0, 0, 0, 0},
  260.     {15, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  261.     {29, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  262.   };
  263.   int levabs,i,n,sign,nn;
  264.   if (level == 0)           //  check for EOB
  265.   {
  266.     *len=1;
  267.     return;
  268.   }
  269.   if (level <= 0)
  270.     sign=1;
  271.   else
  272.     sign=0;
  273.   levabs=abs(level);
  274.   if (levabs <= LEVRUN[run])
  275.   {
  276.     n=NTAB[levabs-1][run]+1;
  277.   }
  278.   else
  279.   {
  280.     n=(levabs-LEVRUN[run])*32 + run*2;
  281.   }
  282.   nn=n/2;
  283.   for (i=0; i < 16 && nn != 0; i++)
  284.   {
  285.     nn /= 2;
  286.   }
  287.   *len= 2*i + 1;
  288.   *info=n-(int)pow(2,i)+sign;
  289. }
  290. /*!
  291.  ************************************************************************
  292.  * brief
  293.  *    Double scan coefficients
  294.  * par Input:
  295.  *    level and run for coefficiets
  296.  * par Output:
  297.  *    lenght and info
  298.  * note
  299.  *    see ITU document for bit assignment
  300.  ************************************************************************
  301.  */
  302. void levrun_linfo_intra(int level,int run,int *len,int *info)
  303. {
  304.   const byte LEVRUN[8]=
  305.   {
  306.     9,3,1,1,1,0,0,0
  307.   };
  308.   const byte NTAB[9][5] =
  309.   {
  310.     { 1, 3, 7,15,17},
  311.     { 5,19, 0, 0, 0},
  312.     { 9,21, 0, 0, 0},
  313.     {11, 0, 0, 0, 0},
  314.     {13, 0, 0, 0, 0},
  315.     {23, 0, 0, 0, 0},
  316.     {25, 0, 0, 0, 0},
  317.     {27, 0, 0, 0, 0},
  318.     {29, 0, 0, 0, 0},
  319.   };
  320.   int levabs,i,n,sign,nn;
  321.   if (level == 0)     //  check for EOB
  322.   {
  323.     *len=1;
  324.     return;
  325.   }
  326.   if (level <= 0)
  327.     sign=1;
  328.   else
  329.     sign=0;
  330.   levabs=abs(level);
  331.   if (levabs <= LEVRUN[run])
  332.   {
  333.     n=NTAB[levabs-1][run]+1;
  334.   }
  335.   else
  336.   {
  337.     n=(levabs-LEVRUN[run])*16 + 16 + run*2;
  338.   }
  339.   nn=n/2;
  340.   for (i=0; i < 16 && nn != 0; i++)
  341.   {
  342.     nn /= 2;
  343.   }
  344.   *len= 2*i + 1;
  345.   *info=n-(int)pow(2,i)+sign;
  346. }
  347. /*!
  348.  ************************************************************************
  349.  * brief
  350.  *    Makes code word and passes it back
  351.  *    A code word has the following format: 0 Xn...0 X2 0 X1 0 X0 1
  352.  *
  353.  * par Input:
  354.  *    Info   : Xn..X2 X1 X0                                             n
  355.  *    Length : Total number of bits in the codeword
  356.  ************************************************************************
  357.  */
  358. int symbol2uvlc(SyntaxElement *sym)
  359. {
  360.   int info_len = sym->len/2;
  361.   // Convert info into a bitpattern int
  362.   sym->bitpattern = 0;
  363.   // vlc coding
  364.   while(--info_len >= 0)
  365.   {
  366.     sym->bitpattern <<= 2;
  367.     sym->bitpattern |= (0x01 & (sym->inf >> info_len));
  368.   }
  369.   sym->bitpattern <<= 1;
  370.   sym->bitpattern |= 0x01;
  371.   return 0;
  372. }
  373. /*!
  374.  ************************************************************************
  375.  * brief
  376.  *    generates UVLC code and passes the codeword to the buffer
  377.  ************************************************************************
  378.  */
  379. int writeSyntaxElement_UVLC(SyntaxElement *se, DataPartition *this_dataPart)
  380. {
  381.   se->mapping(se->value1,se->value2,&(se->len),&(se->inf));
  382.   symbol2uvlc(se);
  383.   writeUVLC2buffer(se, this_dataPart->bitstream);
  384. #if TRACE
  385.   if(se->type <= 1)
  386.     trace2out (se);
  387. #endif
  388.   return (se->len);
  389. }
  390. /*!
  391.  ************************************************************************
  392.  * brief
  393.  *    writes UVLC code to the appropriate buffer
  394.  ************************************************************************
  395.  */
  396. void  writeUVLC2buffer(SyntaxElement *se, Bitstream *currStream)
  397. {
  398.   int i;
  399.   unsigned int mask = 1 << (se->len-1);
  400.   // Add the new bits to the bitstream.
  401.   // Write out a byte if it is full
  402.   for (i=0; i<se->len; i++)
  403.   {
  404.     currStream->byte_buf <<= 1;
  405.     if (se->bitpattern & mask)
  406.       currStream->byte_buf |= 1;
  407.     currStream->bits_to_go--;
  408.     mask >>= 1;
  409.     if (currStream->bits_to_go==0)
  410.     {
  411.       currStream->bits_to_go = 8;
  412.       currStream->streamBuffer[currStream->byte_pos++]=currStream->byte_buf;
  413.     }
  414.   }
  415. }
  416. /*!
  417.  ************************************************************************
  418.  * brief
  419.  *    generates UVLC code for EOS and writes it to the appropriate buffer
  420.  ************************************************************************
  421.  */
  422. void  writeEOS2buffer()
  423. {
  424.   int dP_nr = assignSE2partition[input->partition_mode][SE_EOS];
  425.   Bitstream *currStream = ((img->currentSlice)->partArr[dP_nr]).bitstream;
  426.   SyntaxElement sym;
  427.   sym.len = LEN_STARTCODE;
  428.   sym.inf = EOS;
  429.   sym.type  = SE_EOS;
  430. #if TRACE
  431.   strncpy(sym.tracestring, "EOS",TRACESTRING_SIZE);
  432. #endif
  433.   symbol2uvlc(&sym);
  434.   writeUVLC2buffer(&sym, currStream);
  435. #if TRACE
  436.   trace2out(&sym);
  437. #endif
  438. }
  439. /*!
  440.  ************************************************************************
  441.  * brief
  442.  *    Write out a trace string on the trace file
  443.  ************************************************************************
  444.  */
  445. #if TRACE
  446. void
  447. trace2out(SyntaxElement *sym)
  448. {
  449.   static int bitcounter = 0;
  450.   int i, chars;
  451.   if (p_trace != NULL)
  452.   {
  453.     putc('@', p_trace);
  454.     chars = fprintf(p_trace, "%i", bitcounter);
  455.     while(chars++ < 6)
  456.       putc(' ',p_trace);
  457.     chars += fprintf(p_trace, "%s", sym->tracestring);
  458.     while(chars++ < 50)
  459.       putc(' ',p_trace);
  460.   // Align bitpattern
  461.     if(sym->len<15)
  462.     {
  463.       for(i=0 ; i<15-sym->len ; i++)
  464.         fputc(' ', p_trace);
  465.     }
  466.     // Print bitpattern
  467.     bitcounter += sym->len;
  468.     for(i=1 ; i<=sym->len ; i++)
  469.     {
  470.       if((sym->bitpattern >> (sym->len-i)) & 0x1)
  471.         fputc('1', p_trace);
  472.       else
  473.         fputc('0', p_trace);
  474.     }
  475.     fprintf(p_trace, "n");
  476.   }
  477.   fflush (p_trace);
  478. }
  479. #endif