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

Audio

开发平台:

Visual C++

  1. /*  * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>  *  * This library is free software; you can redistribute it and/or  * modify it under the terms of the GNU Lesser General Public  * License as published by the Free Software Foundation; either  * version 2 of the License, or (at your option) any later version.  *  * This library is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  * Lesser General Public License for more details.  *  * You should have received a copy of the GNU Lesser General Public  * License along with this library; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *  */   /**  * @file cabac.h  * Context Adaptive Binary Arithmetic Coder.  */ #include "common.h" //Add by ty
  2. #undef NDEBUG #include <assert.h>
  3. typedef struct CABACContext{     int low;     int range;     int outstanding_count; #ifdef STRICT_LIMITS     int symCount; #endif     uint8_t lps_range[2*64][4];   ///< rangeTabLPS     uint8_t lps_state[2*64];      ///< transIdxLPS     uint8_t mps_state[2*64];      ///< transIdxMPS     const uint8_t *bytestream_start;     const uint8_t *bytestream;     const uint8_t *bytestream_end;     int bits_left;                ///<
  4.     PutBitContext pb;
  5. }CABACContext; extern const uint8_t ff_h264_lps_range[64][4]; extern const uint8_t ff_h264_mps_state[64]; extern const uint8_t ff_h264_lps_state[64]; void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size);
  6. void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size);
  7. void ff_init_cabac_states(CABACContext *c, uint8_t const (*lps_range)[4], 
  8.                           uint8_t const *mps_state, uint8_t const *lps_state, int state_count);
  9. //static inline void put_cabac_bit(CABACContext *c, int b){
  10. static void put_cabac_bit(CABACContext *c, int b){
  11.     put_bits(&c->pb, 1, b); 
  12.     for(;c->outstanding_count; c->outstanding_count--){ 
  13.         put_bits(&c->pb, 1, 1-b);
  14.     }
  15. }
  16. //static inline void renorm_cabac_encoder(CABACContext *c){
  17. static void renorm_cabac_encoder(CABACContext *c){
  18.     while(c->range < 0x100){
  19.         //FIXME optimize
  20.         if(c->low<0x100){
  21.             put_cabac_bit(c, 0);
  22.         }else if(c->low<0x200){
  23.             c->outstanding_count++;
  24.             c->low -= 0x100;
  25.         }else{
  26.             put_cabac_bit(c, 1);
  27.             c->low -= 0x200;
  28.         }
  29.         
  30.         c->range+= c->range;
  31.         c->low += c->low;
  32.     }
  33. }
  34. //static inline void put_cabac(CABACContext *c, uint8_t * const state, int bit){
  35. static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
  36.     int RangeLPS= c->lps_range[*state][((c->range)>>6)&3];
  37.     
  38.     if(bit == ((*state)&1)){
  39.         c->range -= RangeLPS;
  40.         *state= c->mps_state[*state];
  41.     }else{
  42.         c->low += c->range - RangeLPS;
  43.         c->range = RangeLPS;
  44.         *state= c->lps_state[*state];
  45.     }
  46.     
  47.     renorm_cabac_encoder(c);
  48. #ifdef STRICT_LIMITS
  49.     c->symCount++;
  50. #endif
  51. }
  52. static inline void put_cabac_static(CABACContext *c, int RangeLPS, int bit){
  53. //static void put_cabac_static(CABACContext *c, int RangeLPS, int bit){
  54.     assert(c->range > RangeLPS);
  55.     if(!bit){
  56.         c->range -= RangeLPS;
  57.     }else{
  58.         c->low += c->range - RangeLPS;
  59.         c->range = RangeLPS;
  60.     }
  61.     renorm_cabac_encoder(c);
  62. #ifdef STRICT_LIMITS
  63.     c->symCount++;
  64. #endif
  65. }
  66. /**
  67.  * @param bit 0 -> write zero bit, !=0 write one bit
  68.  */
  69. static inline void put_cabac_bypass(CABACContext *c, int bit){
  70. //static void put_cabac_bypass(CABACContext *c, int bit){
  71.     c->low += c->low;
  72.     if(bit){
  73.         c->low += c->range;
  74.     }
  75. //FIXME optimize
  76.     if(c->low<0x200){
  77.         put_cabac_bit(c, 0);
  78.     }else if(c->low<0x400){
  79.         c->outstanding_count++;
  80.         c->low -= 0x200;
  81.     }else{
  82.         put_cabac_bit(c, 1);
  83.         c->low -= 0x400;
  84.     }
  85.         
  86. #ifdef STRICT_LIMITS
  87.     c->symCount++;
  88. #endif
  89. }
  90. /**
  91.  *
  92.  * @return the number of bytes written
  93.  */
  94. //static inline int put_cabac_terminate(CABACContext *c, int bit){
  95. static int put_cabac_terminate(CABACContext *c, int bit){
  96.     c->range -= 2;
  97.     if(!bit){
  98.         renorm_cabac_encoder(c);
  99.     }else{
  100.         c->low += c->range;
  101.         c->range= 2;
  102.         
  103.         renorm_cabac_encoder(c);
  104.         assert(c->low <= 0x1FF);
  105.         put_cabac_bit(c, c->low>>9);
  106.         put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
  107.         
  108.         flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
  109.     }
  110.         
  111. #ifdef STRICT_LIMITS
  112.     c->symCount++;
  113. #endif
  114.     return (put_bits_count(&c->pb)+7)>>3;
  115. }
  116. /**
  117.  * put (truncated) unary binarization.
  118.  */
  119. //static inline void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, int max_index, int truncated){
  120. static void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, int max_index, int truncated){
  121.     int i;
  122.     
  123.     assert(v <= max);
  124.     
  125. #if 1
  126.     for(i=0; i<v; i++){
  127.         put_cabac(c, state, 1);
  128.         if(i < max_index) state++;
  129.     }
  130.     if(truncated==0 || v<max)
  131.         put_cabac(c, state, 0);
  132. #else
  133.     if(v <= max_index){
  134.         for(i=0; i<v; i++){
  135.             put_cabac(c, state+i, 1);
  136.         }
  137.         if(truncated==0 || v<max)
  138.             put_cabac(c, state+i, 0);
  139.     }else{
  140.         for(i=0; i<=max_index; i++){
  141.             put_cabac(c, state+i, 1);
  142.         }
  143.         for(; i<v; i++){
  144.             put_cabac(c, state+max_index, 1);
  145.         }
  146.         if(truncated==0 || v<max)
  147.             put_cabac(c, state+max_index, 0);
  148.     }
  149. #endif
  150. }
  151. /**
  152.  * put unary exp golomb k-th order binarization.
  153.  */
  154. //static inline void put_cabac_ueg(CABACContext *c, uint8_t * state, int v, int max, int is_signed, int k, int max_index){
  155. static void put_cabac_ueg(CABACContext *c, uint8_t * state, int v, int max, int is_signed, int k, int max_index){
  156.     int i;
  157.     
  158.     if(v==0)
  159.         put_cabac(c, state, 0);
  160.     else{
  161.         const int sign= v < 0;
  162.         
  163.         if(is_signed) v= ABS(v);
  164.         
  165.         if(v<max){
  166.             for(i=0; i<v; i++){
  167.                 put_cabac(c, state, 1);
  168.                 if(i < max_index) state++;
  169.             }
  170.             put_cabac(c, state, 0);
  171.         }else{
  172.             int m= 1<<k;
  173.             for(i=0; i<max; i++){
  174.                 put_cabac(c, state, 1);
  175.                 if(i < max_index) state++;
  176.             }
  177.             v -= max;
  178.             while(v >= m){ //FIXME optimize
  179.                 put_cabac_bypass(c, 1);
  180.                 v-= m;
  181.                 m+= m;
  182.             }
  183.             put_cabac_bypass(c, 0);
  184.             while(m>>=1){
  185.                 put_cabac_bypass(c, v&m);
  186.             }
  187.         }
  188.         if(is_signed)
  189.             put_cabac_bypass(c, sign);
  190.     }
  191. }
  192. //static inline void renorm_cabac_decoder(CABACContext *c){
  193. static void renorm_cabac_decoder(CABACContext *c){
  194.     while(c->range < 0x10000){
  195.         c->range+= c->range;
  196.         c->low+= c->low;
  197.         if(--c->bits_left == 0){
  198.             if(c->bytestream < c->bytestream_end)
  199.                 c->low+= *c->bytestream;
  200.             c->bytestream++;
  201.             c->bits_left= 8;
  202.         }
  203.     }
  204. }
  205. //static inline int get_cabac(CABACContext *c, uint8_t * const state){
  206. static int get_cabac(CABACContext *c, uint8_t * const state){
  207.     int RangeLPS= c->lps_range[*state][((c->range)>>14)&3]<<8;
  208.     int bit;
  209.     
  210.     c->range -= RangeLPS;
  211.     if(c->low < c->range){
  212.         bit= (*state)&1;
  213.         *state= c->mps_state[*state];
  214.     }else{
  215.         bit= ((*state)&1)^1;
  216.         c->low -= c->range;
  217.         c->range = RangeLPS;
  218.         *state= c->lps_state[*state];
  219.     }
  220.     renorm_cabac_decoder(c);
  221.     
  222.     return bit;    
  223. }
  224. //static inline int get_cabac_static(CABACContext *c, int RangeLPS){
  225. static int get_cabac_static(CABACContext *c, int RangeLPS){
  226.     int bit;
  227.     
  228.     c->range -= RangeLPS;
  229.     if(c->low < c->range){
  230.         bit= 0;
  231.     }else{
  232.         bit= 1;
  233.         c->low -= c->range;
  234.         c->range = RangeLPS;
  235.     }
  236.     renorm_cabac_decoder(c);
  237.     
  238.     return bit;    
  239. }
  240. //static inline int get_cabac_bypass(CABACContext *c){
  241. static int get_cabac_bypass(CABACContext *c){
  242.     c->low += c->low;
  243.     if(--c->bits_left == 0){
  244.         if(c->bytestream < c->bytestream_end)
  245.             c->low+= *c->bytestream;
  246.         c->bytestream++;
  247.         c->bits_left= 8;
  248.     }
  249.     
  250.     if(c->low < c->range){
  251.         return 0;
  252.     }else{
  253.         c->low -= c->range;
  254.         return 1;
  255.     }
  256. }
  257. /**
  258.  *
  259.  * @return the number of bytes read or 0 if no end
  260.  */
  261. //static inline int get_cabac_terminate(CABACContext *c){
  262. static int get_cabac_terminate(CABACContext *c){
  263.     c->range -= 2<<8;
  264.     if(c->low < c->range){
  265.         renorm_cabac_decoder(c);    
  266.         return 0;
  267.     }else{
  268.         return c->bytestream - c->bytestream_start;
  269.     }    
  270. }
  271. /**
  272.  * get (truncated) unnary binarization.
  273.  */
  274. //static inline int get_cabac_u(CABACContext *c, uint8_t * state, int max, int max_index, int truncated){
  275. static int get_cabac_u(CABACContext *c, uint8_t * state, int max, int max_index, int truncated){
  276.     int i;
  277.     
  278.     for(i=0; i<max; i++){ 
  279.         if(get_cabac(c, state)==0)
  280.             return i;
  281.             
  282.         if(i< max_index) state++;
  283.     }
  284.     return truncated ? max : -1;
  285. }
  286. /**
  287.  * get unary exp golomb k-th order binarization.
  288.  */
  289. //static inline int get_cabac_ueg(CABACContext *c, uint8_t * state, int max, int is_signed, int k, int max_index){
  290. static int get_cabac_ueg(CABACContext *c, uint8_t * state, int max, int is_signed, int k, int max_index){
  291.     int i, v;
  292.     int m= 1<<k;
  293.     
  294.     if(get_cabac(c, state)==0) 
  295.         return 0;
  296.         
  297.     if(0 < max_index) state++;
  298.     
  299.     for(i=1; i<max; i++){ 
  300.         if(get_cabac(c, state)==0){
  301.             if(is_signed && get_cabac_bypass(c)){
  302.                 return -i;
  303.             }else
  304.                 return i;
  305.         }
  306.         if(i < max_index) state++;
  307.     }
  308.     
  309.     while(get_cabac_bypass(c)){
  310.         i+= m;
  311.         m+= m;
  312.     }
  313.     
  314.     v=0;
  315.     while(m>>=1){
  316.         v+= v + get_cabac_bypass(c);
  317.     }
  318.     i += v;
  319.     if(is_signed && get_cabac_bypass(c)){
  320.         return -i;
  321.     }else
  322.         return i;
  323. }