golomb.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:11k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * exp golomb vlc stuff
  3.  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4.  * Copyright (c) 2004 Alex Beregszaszi
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with this library; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  *
  20.  */
  21.  
  22. /**
  23.  * @file golomb.h
  24.  * @brief 
  25.  *     exp golomb vlc stuff
  26.  * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
  27.  */
  28. #define INVALID_VLC           0x80000000
  29. extern const uint8_t ff_golomb_vlc_len[512];
  30. extern const uint8_t ff_ue_golomb_vlc_code[512];
  31. extern const  int8_t ff_se_golomb_vlc_code[512];
  32. extern const uint8_t ff_ue_golomb_len[256];
  33. extern const uint8_t ff_interleaved_golomb_vlc_len[256];
  34. extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
  35. extern const  int8_t ff_interleaved_se_golomb_vlc_code[256];
  36.  
  37.  /**
  38.  * read unsigned exp golomb code.
  39.  */
  40. static inline int get_ue_golomb(GetBitContext *gb){
  41.     unsigned int buf;
  42.     int log;
  43.     
  44.     OPEN_READER(re, gb);
  45.     UPDATE_CACHE(re, gb);
  46.     buf=GET_CACHE(re, gb);
  47.     
  48.     if(buf >= (1<<27)){
  49.         buf >>= 32 - 9;
  50.         LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  51.         CLOSE_READER(re, gb);
  52.     
  53.         return ff_ue_golomb_vlc_code[buf];
  54.     }else{
  55.         log= 2*av_log2(buf) - 31;
  56.         buf>>= log;
  57.         buf--;
  58.         LAST_SKIP_BITS(re, gb, 32 - log);
  59.         CLOSE_READER(re, gb);
  60.     
  61.         return buf;
  62.     }
  63. }
  64. static inline int svq3_get_ue_golomb(GetBitContext *gb){
  65.     uint32_t buf;
  66.     int log;
  67.     OPEN_READER(re, gb);
  68.     UPDATE_CACHE(re, gb);
  69.     buf=GET_CACHE(re, gb);
  70.     
  71.     if(buf&0xAA800000){
  72.         buf >>= 32 - 8;
  73.         LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  74.         CLOSE_READER(re, gb);
  75.         
  76.         return ff_interleaved_ue_golomb_vlc_code[buf];
  77.     }else{
  78.         LAST_SKIP_BITS(re, gb, 8);
  79.         UPDATE_CACHE(re, gb);
  80.         buf |= 1 | (GET_CACHE(re, gb) >> 8);
  81.         if((buf & 0xAAAAAAAA) == 0)
  82.             return INVALID_VLC;
  83.         for(log=31; (buf & 0x80000000) == 0; log--){
  84.             buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  85.         }
  86.         LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
  87.         CLOSE_READER(re, gb);
  88.         return ((buf << log) >> log) - 1;
  89.     }
  90. }
  91. /**
  92.  * read unsigned truncated exp golomb code.
  93.  */
  94. static inline int get_te0_golomb(GetBitContext *gb, int range){
  95.     assert(range >= 1);
  96.     
  97.     if(range==1)      return 0;
  98.     else if(range==2) return get_bits1(gb)^1;
  99.     else              return get_ue_golomb(gb);
  100. }
  101. /**
  102.  * read unsigned truncated exp golomb code.
  103.  */
  104. static inline int get_te_golomb(GetBitContext *gb, int range){
  105.     assert(range >= 1);
  106.     
  107.     if(range==2) return get_bits1(gb)^1;
  108.     else         return get_ue_golomb(gb);
  109. }
  110. /**
  111.  * read signed exp golomb code.
  112.  */
  113. static inline int get_se_golomb(GetBitContext *gb){
  114.     unsigned int buf;
  115.     int log;
  116.     
  117.     OPEN_READER(re, gb);
  118.     UPDATE_CACHE(re, gb);
  119.     buf=GET_CACHE(re, gb);
  120.     
  121.     if(buf >= (1<<27)){
  122.         buf >>= 32 - 9;
  123.         LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  124.         CLOSE_READER(re, gb);
  125.     
  126.         return ff_se_golomb_vlc_code[buf];
  127.     }else{
  128.         log= 2*av_log2(buf) - 31;
  129.         buf>>= log;
  130.         
  131.         LAST_SKIP_BITS(re, gb, 32 - log);
  132.         CLOSE_READER(re, gb);
  133.     
  134.         if(buf&1) buf= -(buf>>1);
  135.         else      buf=  (buf>>1);
  136.         return buf;
  137.     }
  138. }
  139. static inline int svq3_get_se_golomb(GetBitContext *gb){
  140.     unsigned int buf;
  141.     int log;
  142.     OPEN_READER(re, gb);
  143.     UPDATE_CACHE(re, gb);
  144.     buf=GET_CACHE(re, gb);
  145.     if(buf&0xAA800000){
  146.         buf >>= 32 - 8;
  147.         LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  148.         CLOSE_READER(re, gb);
  149.         
  150.         return ff_interleaved_se_golomb_vlc_code[buf];
  151.     }else{
  152.         LAST_SKIP_BITS(re, gb, 8);
  153.         UPDATE_CACHE(re, gb);
  154.         buf |= 1 | (GET_CACHE(re, gb) >> 8);
  155.         if((buf & 0xAAAAAAAA) == 0)
  156.             return INVALID_VLC;
  157.         for(log=31; (buf & 0x80000000) == 0; log--){
  158.             buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  159.         }
  160.         LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
  161.         CLOSE_READER(re, gb);
  162.         return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  163.     }
  164. }
  165. /**
  166.  * read unsigned golomb rice code (ffv1).
  167.  */
  168. static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
  169.     unsigned int buf;
  170.     int log;
  171.     
  172.     OPEN_READER(re, gb);
  173.     UPDATE_CACHE(re, gb);
  174.     buf=GET_CACHE(re, gb);
  175.     log= av_log2(buf);
  176.     if(log > 31-limit){
  177.         buf >>= log - k;
  178.         buf += (30-log)<<k;
  179.         LAST_SKIP_BITS(re, gb, 32 + k - log);
  180.         CLOSE_READER(re, gb);
  181.     
  182.         return buf;
  183.     }else{
  184.         buf >>= 32 - limit - esc_len;
  185.         LAST_SKIP_BITS(re, gb, esc_len + limit);
  186.         CLOSE_READER(re, gb);
  187.     
  188.         return buf + limit - 1;
  189.     }
  190. }
  191. /**
  192.  * read unsigned golomb rice code (jpegls).
  193.  */
  194. static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){
  195.     unsigned int buf;
  196.     int log;
  197.     
  198.     OPEN_READER(re, gb);
  199.     UPDATE_CACHE(re, gb);
  200.     buf=GET_CACHE(re, gb);
  201.     log= av_log2(buf);
  202.     
  203.     if(log > 31-11){
  204.         buf >>= log - k;
  205.         buf += (30-log)<<k;
  206.         LAST_SKIP_BITS(re, gb, 32 + k - log);
  207.         CLOSE_READER(re, gb);
  208.     
  209.         return buf;
  210.     }else{
  211.         int i;
  212.         for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
  213.             LAST_SKIP_BITS(re, gb, 1);
  214.             UPDATE_CACHE(re, gb);
  215.         }
  216.         SKIP_BITS(re, gb, 1);
  217.         if(i < limit - 1){
  218.             if(k){
  219.                 buf = SHOW_UBITS(re, gb, k);
  220.                 LAST_SKIP_BITS(re, gb, k);
  221.             }else{
  222.                 buf=0;
  223.             }
  224.             CLOSE_READER(re, gb);
  225.             return buf + (i<<k);
  226.         }else if(i == limit - 1){
  227.             buf = SHOW_UBITS(re, gb, esc_len);
  228.             LAST_SKIP_BITS(re, gb, esc_len);
  229.             CLOSE_READER(re, gb);
  230.     
  231.             return buf + 1;
  232.         }else
  233.             return -1;
  234.     }
  235. }
  236. /**
  237.  * read signed golomb rice code (ffv1).
  238.  */
  239. static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len){
  240.     int v= get_ur_golomb(gb, k, limit, esc_len);
  241.     
  242.     v++;
  243.     if (v&1) return v>>1;
  244.     else return -(v>>1);
  245.     
  246. //    return (v>>1) ^ -(v&1);
  247. }
  248. /**
  249.  * read signed golomb rice code (flac).
  250.  */
  251. static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
  252.     int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
  253.     return (v>>1) ^ -(v&1);
  254. }
  255. /**
  256.  * read unsigned golomb rice code (shorten).
  257.  */
  258. static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k){
  259. return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
  260. }
  261. /**
  262.  * read signed golomb rice code (shorten).
  263.  */
  264. static inline int get_sr_golomb_shorten(GetBitContext* gb, int k)
  265. {
  266.     int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
  267.     if (uvar & 1)
  268.         return ~(uvar >> 1);
  269.     else
  270.         return uvar >> 1;
  271. }
  272. #ifdef TRACE
  273. static inline int get_ue(GetBitContext *s, char *file, const char *func, int line){
  274.     int show= show_bits(s, 24);
  275.     int pos= get_bits_count(s);
  276.     int i= get_ue_golomb(s);
  277.     int len= get_bits_count(s) - pos;
  278.     int bits= show>>(24-len);
  279.     
  280.     print_bin(bits, len);
  281.     
  282.     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue  @%5d in %s %s:%dn", bits, len, i, pos, file, func, line);
  283.     
  284.     return i;
  285. }
  286. static inline int get_se(GetBitContext *s, char *file, const char *func, int line){
  287.     int show= show_bits(s, 24);
  288.     int pos= get_bits_count(s);
  289.     int i= get_se_golomb(s);
  290.     int len= get_bits_count(s) - pos;
  291.     int bits= show>>(24-len);
  292.     
  293.     print_bin(bits, len);
  294.     
  295.     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se  @%5d in %s %s:%dn", bits, len, i, pos, file, func, line);
  296.     
  297.     return i;
  298. }
  299. static inline int get_te(GetBitContext *s, int r, char *file, const char *func, int line){
  300.     int show= show_bits(s, 24);
  301.     int pos= get_bits_count(s);
  302.     int i= get_te0_golomb(s, r);
  303.     int len= get_bits_count(s) - pos;
  304.     int bits= show>>(24-len);
  305.     
  306.     print_bin(bits, len);
  307.     
  308.     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te  @%5d in %s %s:%dn", bits, len, i, pos, file, func, line);
  309.     
  310.     return i;
  311. }
  312. #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  313. #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  314. #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  315. #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  316. #endif
  317. /**
  318.  * write unsigned exp golomb code.
  319.  */
  320. static inline void set_ue_golomb(PutBitContext *pb, int i){
  321.     int e;
  322.     
  323.     assert(i>=0);
  324. #if 0
  325.     if(i=0){
  326.         put_bits(pb, 1, 1);
  327.         return;
  328.     }
  329. #endif
  330.     if(i<256)
  331.         put_bits(pb, ff_ue_golomb_len[i], i+1);
  332.     else{
  333.         e= av_log2(i+1);
  334.     
  335.         put_bits(pb, 2*e+1, i+1);
  336.     }
  337. }
  338. /**
  339.  * write truncated unsigned exp golomb code.
  340.  */
  341. static inline void set_te_golomb(PutBitContext *pb, int i, int range){
  342.     assert(range >= 1);
  343.     assert(i<=range);
  344.     if(range==2) put_bits(pb, 1, i^1);
  345.     else         set_ue_golomb(pb, i);
  346. }
  347. /**
  348.  * write signed exp golomb code.
  349.  */
  350. static inline void set_se_golomb(PutBitContext *pb, int i){
  351. #if 0 
  352.     if(i<=0) i= -2*i;
  353.     else     i=  2*i-1;
  354. #elif 1
  355.     i= 2*i-1;
  356.     if(i<0) i^= -1; //FIXME check if gcc does the right thing
  357. #else
  358.     i= 2*i-1;
  359.     i^= (i>>31);
  360. #endif
  361.     set_ue_golomb(pb, i);
  362. }
  363. /**
  364.  * write unsigned golomb rice code (ffv1).
  365.  */
  366. static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
  367.     int e;
  368.     
  369.     assert(i>=0);
  370.     
  371.     e= i>>k;
  372.     if(e<limit){
  373.         put_bits(pb, e + k + 1, (1<<k) + (i&((1<<k)-1)));
  374.     }else{
  375.         put_bits(pb, limit + esc_len, i - limit + 1);
  376.     }
  377. }
  378. /**
  379.  * write unsigned golomb rice code (jpegls).
  380.  */
  381. static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k, int limit, int esc_len){
  382.     int e;
  383.     
  384.     assert(i>=0);
  385.     
  386.     e= (i>>k) + 1;
  387.     if(e<limit){
  388.         put_bits(pb, e, 1);
  389.         if(k)
  390.             put_bits(pb, k, i&((1<<k)-1));
  391.     }else{
  392.         put_bits(pb, limit  , 1);
  393.         put_bits(pb, esc_len, i - 1);
  394.     }
  395. }
  396. /**
  397.  * write signed golomb rice code (ffv1).
  398.  */
  399. static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
  400.     int v;
  401.     v = -2*i-1;
  402.     v ^= (v>>31);
  403.     set_ur_golomb(pb, v, k, limit, esc_len);
  404. }
  405. /**
  406.  * write signed golomb rice code (flac).
  407.  */
  408. static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k, int limit, int esc_len){
  409.     int v;
  410.     v = -2*i-1;
  411.     v ^= (v>>31);
  412.     set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
  413. }