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

Audio

开发平台:

Visual C++

  1. /*  * exp golomb vlc stuff  * 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 golomb.h  * @brief   *     exp golomb vlc stuff  * @author Michael Niedermayer <michaelni@gmx.at>  */ #define INVALID_VLC           0x80000000 extern const uint8_t ff_golomb_vlc_len[512];
  2. extern const uint8_t ff_ue_golomb_vlc_code[512];
  3. extern const  int8_t ff_se_golomb_vlc_code[512];
  4. extern const uint8_t ff_ue_golomb_len[256];
  5. extern const uint8_t ff_interleaved_golomb_vlc_len[256];
  6. extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
  7. extern const  int8_t ff_interleaved_se_golomb_vlc_code[256];
  8. #include "common.h" //Add by ty
  9.    /**  * read unsigned exp golomb code.  */ //static inline int get_ue_golomb(GetBitContext *gb){
  10. static int get_ue_golomb(GetBitContext *gb){
  11. //int get_ue_golomb(GetBitContext *gb){
  12.     unsigned int buf;
  13.     int log;
  14.     
  15.     OPEN_READER(re, gb);
  16.     UPDATE_CACHE(re, gb);
  17.     buf=GET_CACHE(re, gb);
  18.     
  19.     if(buf >= (1<<27)){
  20.         buf >>= 32 - 9;
  21.         LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  22.         CLOSE_READER(re, gb);
  23.     
  24.         return ff_ue_golomb_vlc_code[buf];
  25.     }else{
  26.         log= 2*av_log2(buf) - 31;
  27.         buf>>= log;
  28.         buf--;
  29.         LAST_SKIP_BITS(re, gb, 32 - log);
  30.         CLOSE_READER(re, gb);
  31.     
  32.         return buf;
  33.     }
  34. }
  35. //static inline int svq3_get_ue_golomb(GetBitContext *gb){
  36. static int svq3_get_ue_golomb(GetBitContext *gb){
  37.     uint32_t buf;
  38.     int log;
  39.     OPEN_READER(re, gb);
  40.     UPDATE_CACHE(re, gb);
  41.     buf=GET_CACHE(re, gb);
  42.     
  43.     if(buf&0xAA800000){
  44.         buf >>= 32 - 8;
  45.         LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  46.         CLOSE_READER(re, gb);
  47.         
  48.         return ff_interleaved_ue_golomb_vlc_code[buf];
  49.     }else{
  50.         LAST_SKIP_BITS(re, gb, 8);
  51.         UPDATE_CACHE(re, gb);
  52.         buf |= 1 | (GET_CACHE(re, gb) >> 8);
  53.         if((buf & 0xAAAAAAAA) == 0)
  54.             return INVALID_VLC;
  55.         for(log=31; (buf & 0x80000000) == 0; log--){
  56.             buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  57.         }
  58.         LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
  59.         CLOSE_READER(re, gb);
  60.         return ((buf << log) >> log) - 1;
  61.     }
  62. }
  63. /**
  64.  * read unsigned truncated exp golomb code.
  65.  */
  66. //static inline int get_te0_golomb(GetBitContext *gb, int range){
  67. static int get_te0_golomb(GetBitContext *gb, int range){
  68.     assert(range >= 1);
  69.     
  70.     if(range==1)      return 0;
  71.     else if(range==2) return get_bits1(gb)^1;
  72.     else              return get_ue_golomb(gb);
  73. }
  74. /**
  75.  * read unsigned truncated exp golomb code.
  76.  */
  77. //static inline int get_te_golomb(GetBitContext *gb, int range){
  78. static int get_te_golomb(GetBitContext *gb, int range){
  79.     assert(range >= 1);
  80.     
  81.     if(range==2) return get_bits1(gb)^1;
  82.     else         return get_ue_golomb(gb);
  83. }
  84. /**
  85.  * read signed exp golomb code.
  86.  */
  87. //static inline int get_se_golomb(GetBitContext *gb){
  88. static int get_se_golomb(GetBitContext *gb){
  89.     unsigned int buf;
  90.     int log;
  91.     
  92.     OPEN_READER(re, gb);
  93.     UPDATE_CACHE(re, gb);
  94.     buf=GET_CACHE(re, gb);
  95.     
  96.     if(buf >= (1<<27)){
  97.         buf >>= 32 - 9;
  98.         LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  99.         CLOSE_READER(re, gb);
  100.     
  101.         return ff_se_golomb_vlc_code[buf];
  102.     }else{
  103.         log= 2*av_log2(buf) - 31;
  104.         buf>>= log;
  105.         
  106.         LAST_SKIP_BITS(re, gb, 32 - log);
  107.         CLOSE_READER(re, gb);
  108.     
  109.         if(buf&1) buf= -(buf>>1);
  110.         else      buf=  (buf>>1);
  111.         return buf;
  112.     }
  113. }
  114. //static inline int svq3_get_se_golomb(GetBitContext *gb){
  115. static int svq3_get_se_golomb(GetBitContext *gb){
  116.     unsigned int buf;
  117.     int log;
  118.     OPEN_READER(re, gb);
  119.     UPDATE_CACHE(re, gb);
  120.     buf=GET_CACHE(re, gb);
  121.     if(buf&0xAA800000){
  122.         buf >>= 32 - 8;
  123.         LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  124.         CLOSE_READER(re, gb);
  125.         
  126.         return ff_interleaved_se_golomb_vlc_code[buf];
  127.     }else{
  128.         buf |=1;
  129.         if((buf & 0xAAAAAAAA) == 0)
  130.             return INVALID_VLC;
  131.         for(log=31; (buf & 0x80000000) == 0; log--){
  132.             buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  133.         }
  134.         LAST_SKIP_BITS(re, gb, 63 - 2*log);
  135.         CLOSE_READER(re, gb);
  136.         return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  137.     }
  138. }
  139. /**
  140.  * read unsigned golomb rice code (ffv1).
  141.  */
  142. //static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
  143. static int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
  144.     unsigned int buf;
  145.     int log;
  146.     
  147.     OPEN_READER(re, gb);
  148.     UPDATE_CACHE(re, gb);
  149.     buf=GET_CACHE(re, gb);
  150.     log= av_log2(buf);
  151.     if(log > 31-limit){
  152.         buf >>= log - k;
  153.         buf += (30-log)<<k;
  154.         LAST_SKIP_BITS(re, gb, 32 + k - log);
  155.         CLOSE_READER(re, gb);
  156.     
  157.         return buf;
  158.     }else{
  159.         buf >>= 32 - limit - esc_len;
  160.         LAST_SKIP_BITS(re, gb, esc_len + limit);
  161.         CLOSE_READER(re, gb);
  162.     
  163.         return buf + limit - 1;
  164.     }
  165. }
  166. /**
  167.  * read unsigned golomb rice code (jpegls).
  168.  */
  169. //static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){
  170. static int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){
  171.     unsigned int buf;
  172.     int log;
  173.     
  174.     OPEN_READER(re, gb);
  175.     UPDATE_CACHE(re, gb);
  176.     buf=GET_CACHE(re, gb);
  177.     log= av_log2(buf);
  178.     
  179.     if(log > 31-11){
  180.         buf >>= log - k;
  181.         buf += (30-log)<<k;
  182.         LAST_SKIP_BITS(re, gb, 32 + k - log);
  183.         CLOSE_READER(re, gb);
  184.     
  185.         return buf;
  186.     }else{
  187.         int i;
  188.         for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
  189.             LAST_SKIP_BITS(re, gb, 1);
  190.             UPDATE_CACHE(re, gb);
  191.         }
  192.         SKIP_BITS(re, gb, 1);
  193.         if(i < limit - 1){
  194.             if(k){
  195.                 buf = SHOW_UBITS(re, gb, k);
  196.                 LAST_SKIP_BITS(re, gb, k);
  197.             }else{
  198.                 buf=0;
  199.             }
  200.             CLOSE_READER(re, gb);
  201.             return buf + (i<<k);
  202.         }else if(i == limit - 1){
  203.             buf = SHOW_UBITS(re, gb, esc_len);
  204.             LAST_SKIP_BITS(re, gb, esc_len);
  205.             CLOSE_READER(re, gb);
  206.     
  207.             return buf + 1;
  208.         }else
  209.             return -1;
  210.     }
  211. }
  212. /**
  213.  * read unsigned golomb rice code (flac).
  214.  */
  215. //static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
  216. static int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
  217.     int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
  218.     return (v>>1) ^ -(v&1);
  219. }
  220. #ifdef TRACE
  221. //static inline int get_ue(GetBitContext *s, char *file, char *func, int line){
  222. static int get_ue(GetBitContext *s, char *file, char *func, int line){
  223.     int show= show_bits(s, 24);
  224.     int pos= get_bits_count(s);
  225.     int i= get_ue_golomb(s);
  226.     int len= get_bits_count(s) - pos;
  227.     int bits= show>>(24-len);
  228.     
  229.     print_bin(bits, len);
  230.     
  231.     printf("%5d %2d %3d ue  @%5d in %s %s:%dn", bits, len, i, pos, file, func, line);
  232.     
  233.     return i;
  234. }
  235. //static inline int get_se(GetBitContext *s, char *file, char *func, int line){
  236. static int get_se(GetBitContext *s, char *file, char *func, int line){
  237.     int show= show_bits(s, 24);
  238.     int pos= get_bits_count(s);
  239.     int i= get_se_golomb(s);
  240.     int len= get_bits_count(s) - pos;
  241.     int bits= show>>(24-len);
  242.     
  243.     print_bin(bits, len);
  244.     
  245.     printf("%5d %2d %3d se  @%5d in %s %s:%dn", bits, len, i, pos, file, func, line);
  246.     
  247.     return i;
  248. }
  249. //static inline int get_te(GetBitContext *s, int r, char *file, char *func, int line){
  250. static int get_te(GetBitContext *s, int r, char *file, char *func, int line){
  251.     int show= show_bits(s, 24);
  252.     int pos= get_bits_count(s);
  253.     int i= get_te0_golomb(s, r);
  254.     int len= get_bits_count(s) - pos;
  255.     int bits= show>>(24-len);
  256.     
  257.     print_bin(bits, len);
  258.     
  259.     printf("%5d %2d %3d te  @%5d in %s %s:%dn", bits, len, i, pos, file, func, line);
  260.     
  261.     return i;
  262. }
  263. #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  264. #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  265. #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  266. #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  267. #endif
  268. /**
  269.  * write unsigned exp golomb code.
  270.  */
  271. //static inline void set_ue_golomb(PutBitContext *pb, int i){
  272. static void set_ue_golomb(PutBitContext *pb, int i){
  273.     int e;
  274.     
  275.     assert(i>=0);
  276. #if 0
  277.     if(i=0){
  278.         put_bits(pb, 1, 1);
  279.         return;
  280.     }
  281. #endif
  282.     if(i<256)
  283.         put_bits(pb, ff_ue_golomb_len[i], i+1);
  284.     else{
  285.         e= av_log2(i+1);
  286.     
  287.         put_bits(pb, 2*e+1, i+1);
  288.     }
  289. }
  290. /**
  291.  * write truncated unsigned exp golomb code.
  292.  */
  293. //static inline void set_te_golomb(PutBitContext *pb, int i, int range){
  294. static void set_te_golomb(PutBitContext *pb, int i, int range){
  295.     assert(range >= 1);
  296.     assert(i<=range);
  297.     if(range==2) put_bits(pb, 1, i^1);
  298.     else         set_ue_golomb(pb, i);
  299. }
  300. /**
  301.  * write signed exp golomb code.
  302.  */
  303. //atic inline void set_se_golomb(PutBitContext *pb, int i){
  304. static void set_se_golomb(PutBitContext *pb, int i){
  305. #if 0 
  306.     if(i<=0) i= -2*i;
  307.     else     i=  2*i-1;
  308. #elif 1
  309.     i= 2*i-1;
  310.     if(i<0) i^= -1; //FIXME check if gcc does the right thing
  311. #else
  312.     i= 2*i-1;
  313.     i^= (i>>31);
  314. #endif
  315.     set_ue_golomb(pb, i);
  316. }
  317. /**
  318.  * write unsigned golomb rice code (ffv1).
  319.  */
  320. //atic inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
  321. static void set_ur_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
  322.     int e;
  323.     
  324.     assert(i>=0);
  325.     
  326.     e= i>>k;
  327.     if(e<limit){
  328.         put_bits(pb, e + k + 1, (1<<k) + (i&((1<<k)-1)));
  329.     }else{
  330.         put_bits(pb, limit + esc_len, i - limit + 1);
  331.     }
  332. }
  333. /**
  334.  * write unsigned golomb rice code (jpegls).
  335.  */
  336. //atic inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k, int limit, int esc_len){
  337. static void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k, int limit, int esc_len){
  338.     int e;
  339.     
  340.     assert(i>=0);
  341.     
  342.     e= (i>>k) + 1;
  343.     if(e<limit){
  344.         put_bits(pb, e, 1);
  345.         if(k)
  346.             put_bits(pb, k, i&((1<<k)-1));
  347.     }else{
  348.         put_bits(pb, limit  , 1);
  349.         put_bits(pb, esc_len, i - 1);
  350.     }
  351. }