golomb.h
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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