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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
  3.  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21. /**
  22.  * @file cabac.h
  23.  * Context Adaptive Binary Arithmetic Coder.
  24.  */
  25. #ifndef FFMPEG_CABAC_H
  26. #define FFMPEG_CABAC_H
  27. #include "bitstream.h"
  28. //#undef NDEBUG
  29. #include <assert.h>
  30. #ifdef ARCH_X86
  31. #include "libavutil/x86_cpu.h"
  32. #endif
  33. #define CABAC_BITS 16
  34. #define CABAC_MASK ((1<<CABAC_BITS)-1)
  35. #define BRANCHLESS_CABAC_DECODER 1
  36. //#define ARCH_X86_DISABLED 1
  37. typedef struct CABACContext{
  38.     int low;
  39.     int range;
  40.     int outstanding_count;
  41. #ifdef STRICT_LIMITS
  42.     int symCount;
  43. #endif
  44.     const uint8_t *bytestream_start;
  45.     const uint8_t *bytestream;
  46.     const uint8_t *bytestream_end;
  47.     PutBitContext pb;
  48. }CABACContext;
  49. extern uint8_t ff_h264_mlps_state[4*64];
  50. extern uint8_t ff_h264_lps_range[4*2*64];  ///< rangeTabLPS
  51. extern uint8_t ff_h264_mps_state[2*64];     ///< transIdxMPS
  52. extern uint8_t ff_h264_lps_state[2*64];     ///< transIdxLPS
  53. extern const uint8_t ff_h264_norm_shift[512];
  54. void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size);
  55. void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size);
  56. void ff_init_cabac_states(CABACContext *c);
  57. static inline void put_cabac_bit(CABACContext *c, int b){
  58.     put_bits(&c->pb, 1, b);
  59.     for(;c->outstanding_count; c->outstanding_count--){
  60.         put_bits(&c->pb, 1, 1-b);
  61.     }
  62. }
  63. static inline void renorm_cabac_encoder(CABACContext *c){
  64.     while(c->range < 0x100){
  65.         //FIXME optimize
  66.         if(c->low<0x100){
  67.             put_cabac_bit(c, 0);
  68.         }else if(c->low<0x200){
  69.             c->outstanding_count++;
  70.             c->low -= 0x100;
  71.         }else{
  72.             put_cabac_bit(c, 1);
  73.             c->low -= 0x200;
  74.         }
  75.         c->range+= c->range;
  76.         c->low += c->low;
  77.     }
  78. }
  79. #ifdef TEST
  80. static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
  81.     int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
  82.     if(bit == ((*state)&1)){
  83.         c->range -= RangeLPS;
  84.         *state= ff_h264_mps_state[*state];
  85.     }else{
  86.         c->low += c->range - RangeLPS;
  87.         c->range = RangeLPS;
  88.         *state= ff_h264_lps_state[*state];
  89.     }
  90.     renorm_cabac_encoder(c);
  91. #ifdef STRICT_LIMITS
  92.     c->symCount++;
  93. #endif
  94. }
  95. static void put_cabac_static(CABACContext *c, int RangeLPS, int bit){
  96.     assert(c->range > RangeLPS);
  97.     if(!bit){
  98.         c->range -= RangeLPS;
  99.     }else{
  100.         c->low += c->range - RangeLPS;
  101.         c->range = RangeLPS;
  102.     }
  103.     renorm_cabac_encoder(c);
  104. #ifdef STRICT_LIMITS
  105.     c->symCount++;
  106. #endif
  107. }
  108. /**
  109.  * @param bit 0 -> write zero bit, !=0 write one bit
  110.  */
  111. static void put_cabac_bypass(CABACContext *c, int bit){
  112.     c->low += c->low;
  113.     if(bit){
  114.         c->low += c->range;
  115.     }
  116. //FIXME optimize
  117.     if(c->low<0x200){
  118.         put_cabac_bit(c, 0);
  119.     }else if(c->low<0x400){
  120.         c->outstanding_count++;
  121.         c->low -= 0x200;
  122.     }else{
  123.         put_cabac_bit(c, 1);
  124.         c->low -= 0x400;
  125.     }
  126. #ifdef STRICT_LIMITS
  127.     c->symCount++;
  128. #endif
  129. }
  130. /**
  131.  *
  132.  * @return the number of bytes written
  133.  */
  134. static int put_cabac_terminate(CABACContext *c, int bit){
  135.     c->range -= 2;
  136.     if(!bit){
  137.         renorm_cabac_encoder(c);
  138.     }else{
  139.         c->low += c->range;
  140.         c->range= 2;
  141.         renorm_cabac_encoder(c);
  142.         assert(c->low <= 0x1FF);
  143.         put_cabac_bit(c, c->low>>9);
  144.         put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
  145.         flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
  146.     }
  147. #ifdef STRICT_LIMITS
  148.     c->symCount++;
  149. #endif
  150.     return (put_bits_count(&c->pb)+7)>>3;
  151. }
  152. /**
  153.  * put (truncated) unary binarization.
  154.  */
  155. static void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, int max_index, int truncated){
  156.     int i;
  157.     assert(v <= max);
  158. #if 1
  159.     for(i=0; i<v; i++){
  160.         put_cabac(c, state, 1);
  161.         if(i < max_index) state++;
  162.     }
  163.     if(truncated==0 || v<max)
  164.         put_cabac(c, state, 0);
  165. #else
  166.     if(v <= max_index){
  167.         for(i=0; i<v; i++){
  168.             put_cabac(c, state+i, 1);
  169.         }
  170.         if(truncated==0 || v<max)
  171.             put_cabac(c, state+i, 0);
  172.     }else{
  173.         for(i=0; i<=max_index; i++){
  174.             put_cabac(c, state+i, 1);
  175.         }
  176.         for(; i<v; i++){
  177.             put_cabac(c, state+max_index, 1);
  178.         }
  179.         if(truncated==0 || v<max)
  180.             put_cabac(c, state+max_index, 0);
  181.     }
  182. #endif
  183. }
  184. /**
  185.  * put unary exp golomb k-th order binarization.
  186.  */
  187. static void put_cabac_ueg(CABACContext *c, uint8_t * state, int v, int max, int is_signed, int k, int max_index){
  188.     int i;
  189.     if(v==0)
  190.         put_cabac(c, state, 0);
  191.     else{
  192.         const int sign= v < 0;
  193.         if(is_signed) v= FFABS(v);
  194.         if(v<max){
  195.             for(i=0; i<v; i++){
  196.                 put_cabac(c, state, 1);
  197.                 if(i < max_index) state++;
  198.             }
  199.             put_cabac(c, state, 0);
  200.         }else{
  201.             int m= 1<<k;
  202.             for(i=0; i<max; i++){
  203.                 put_cabac(c, state, 1);
  204.                 if(i < max_index) state++;
  205.             }
  206.             v -= max;
  207.             while(v >= m){ //FIXME optimize
  208.                 put_cabac_bypass(c, 1);
  209.                 v-= m;
  210.                 m+= m;
  211.             }
  212.             put_cabac_bypass(c, 0);
  213.             while(m>>=1){
  214.                 put_cabac_bypass(c, v&m);
  215.             }
  216.         }
  217.         if(is_signed)
  218.             put_cabac_bypass(c, sign);
  219.     }
  220. }
  221. #endif /* TEST */
  222. static void refill(CABACContext *c){
  223. #if CABAC_BITS == 16
  224.         c->low+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
  225. #else
  226.         c->low+= c->bytestream[0]<<1;
  227. #endif
  228.     c->low -= CABAC_MASK;
  229.     c->bytestream+= CABAC_BITS/8;
  230. }
  231. #if ! ( defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS) )
  232. static void refill2(CABACContext *c){
  233.     int i, x;
  234.     x= c->low ^ (c->low-1);
  235.     i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)];
  236.     x= -CABAC_MASK;
  237. #if CABAC_BITS == 16
  238.         x+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
  239. #else
  240.         x+= c->bytestream[0]<<1;
  241. #endif
  242.     c->low += x<<i;
  243.     c->bytestream+= CABAC_BITS/8;
  244. }
  245. #endif
  246. static inline void renorm_cabac_decoder(CABACContext *c){
  247.     while(c->range < 0x100){
  248.         c->range+= c->range;
  249.         c->low+= c->low;
  250.         if(!(c->low & CABAC_MASK))
  251.             refill(c);
  252.     }
  253. }
  254. static inline void renorm_cabac_decoder_once(CABACContext *c){
  255. #ifdef ARCH_X86_DISABLED
  256.     int temp;
  257. #if 0
  258.     //P3:683    athlon:475
  259.     asm(
  260.         "lea -0x100(%0), %2         nt"
  261.         "shr $31, %2                nt"  //FIXME 31->63 for x86-64
  262.         "shl %%cl, %0               nt"
  263.         "shl %%cl, %1               nt"
  264.         : "+r"(c->range), "+r"(c->low), "+c"(temp)
  265.     );
  266. #elif 0
  267.     //P3:680    athlon:474
  268.     asm(
  269.         "cmp $0x100, %0             nt"
  270.         "setb %%cl                  nt"  //FIXME 31->63 for x86-64
  271.         "shl %%cl, %0               nt"
  272.         "shl %%cl, %1               nt"
  273.         : "+r"(c->range), "+r"(c->low), "+c"(temp)
  274.     );
  275. #elif 1
  276.     int temp2;
  277.     //P3:665    athlon:517
  278.     asm(
  279.         "lea -0x100(%0), %%eax      nt"
  280.         "cltd                       nt"
  281.         "mov %0, %%eax              nt"
  282.         "and %%edx, %0              nt"
  283.         "and %1, %%edx              nt"
  284.         "add %%eax, %0              nt"
  285.         "add %%edx, %1              nt"
  286.         : "+r"(c->range), "+r"(c->low), "+a"(temp), "+d"(temp2)
  287.     );
  288. #elif 0
  289.     int temp2;
  290.     //P3:673    athlon:509
  291.     asm(
  292.         "cmp $0x100, %0             nt"
  293.         "sbb %%edx, %%edx           nt"
  294.         "mov %0, %%eax              nt"
  295.         "and %%edx, %0              nt"
  296.         "and %1, %%edx              nt"
  297.         "add %%eax, %0              nt"
  298.         "add %%edx, %1              nt"
  299.         : "+r"(c->range), "+r"(c->low), "+a"(temp), "+d"(temp2)
  300.     );
  301. #else
  302.     int temp2;
  303.     //P3:677    athlon:511
  304.     asm(
  305.         "cmp $0x100, %0             nt"
  306.         "lea (%0, %0), %%eax        nt"
  307.         "lea (%1, %1), %%edx        nt"
  308.         "cmovb %%eax, %0            nt"
  309.         "cmovb %%edx, %1            nt"
  310.         : "+r"(c->range), "+r"(c->low), "+a"(temp), "+d"(temp2)
  311.     );
  312. #endif
  313. #else
  314.     //P3:675    athlon:476
  315.     int shift= (uint32_t)(c->range - 0x100)>>31;
  316.     c->range<<= shift;
  317.     c->low  <<= shift;
  318. #endif
  319.     if(!(c->low & CABAC_MASK))
  320.         refill(c);
  321. }
  322. static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t * const state){
  323.     //FIXME gcc generates duplicate load/stores for c->low and c->range
  324. #define LOW          "0"
  325. #define RANGE        "4"
  326. #ifdef ARCH_X86_64
  327. #define BYTESTART   "16"
  328. #define BYTE        "24"
  329. #define BYTEEND     "32"
  330. #else
  331. #define BYTESTART   "12"
  332. #define BYTE        "16"
  333. #define BYTEEND     "20"
  334. #endif
  335. #if defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS)
  336.     int bit;
  337. #ifndef BRANCHLESS_CABAC_DECODER
  338.     asm volatile(
  339.         "movzbl (%1), %0                        nt"
  340.         "movl "RANGE    "(%2), %%ebx            nt"
  341.         "movl "RANGE    "(%2), %%edx            nt"
  342.         "andl $0xC0, %%ebx                      nt"
  343.         "movzbl "MANGLE(ff_h264_lps_range)"(%0, %%ebx, 2), %%esint"
  344.         "movl "LOW      "(%2), %%ebx            nt"
  345. //eax:state ebx:low, edx:range, esi:RangeLPS
  346.         "subl %%esi, %%edx                      nt"
  347.         "movl %%edx, %%ecx                      nt"
  348.         "shll $17, %%ecx                        nt"
  349.         "cmpl %%ecx, %%ebx                      nt"
  350.         " ja 1f                                 nt"
  351. #if 1
  352.         //athlon:4067 P3:4110
  353.         "lea -0x100(%%edx), %%ecx               nt"
  354.         "shr $31, %%ecx                         nt"
  355.         "shl %%cl, %%edx                        nt"
  356.         "shl %%cl, %%ebx                        nt"
  357. #else
  358.         //athlon:4057 P3:4130
  359.         "cmp $0x100, %%edx                      nt" //FIXME avoidable
  360.         "setb %%cl                              nt"
  361.         "shl %%cl, %%edx                        nt"
  362.         "shl %%cl, %%ebx                        nt"
  363. #endif
  364.         "movzbl "MANGLE(ff_h264_mps_state)"(%0), %%ecx   nt"
  365.         "movb %%cl, (%1)                        nt"
  366. //eax:state ebx:low, edx:range, esi:RangeLPS
  367.         "test %%bx, %%bx                        nt"
  368.         " jnz 2f                                nt"
  369.         "mov  "BYTE     "(%2), %%"REG_S"        nt"
  370.         "subl $0xFFFF, %%ebx                    nt"
  371.         "movzwl (%%"REG_S"), %%ecx              nt"
  372.         "bswap %%ecx                            nt"
  373.         "shrl $15, %%ecx                        nt"
  374.         "add  $2, %%"REG_S"                     nt"
  375.         "addl %%ecx, %%ebx                      nt"
  376.         "mov  %%"REG_S", "BYTE    "(%2)         nt"
  377.         "jmp 2f                                 nt"
  378.         "1:                                     nt"
  379. //eax:state ebx:low, edx:range, esi:RangeLPS
  380.         "subl %%ecx, %%ebx                      nt"
  381.         "movl %%esi, %%edx                      nt"
  382.         "movzbl " MANGLE(ff_h264_norm_shift) "(%%esi), %%ecx   nt"
  383.         "shll %%cl, %%ebx                       nt"
  384.         "shll %%cl, %%edx                       nt"
  385.         "movzbl "MANGLE(ff_h264_lps_state)"(%0), %%ecx   nt"
  386.         "movb %%cl, (%1)                        nt"
  387.         "add  $1, %0                            nt"
  388.         "test %%bx, %%bx                        nt"
  389.         " jnz 2f                                nt"
  390.         "mov  "BYTE     "(%2), %%"REG_c"        nt"
  391.         "movzwl (%%"REG_c"), %%esi              nt"
  392.         "bswap %%esi                            nt"
  393.         "shrl $15, %%esi                        nt"
  394.         "subl $0xFFFF, %%esi                    nt"
  395.         "add  $2, %%"REG_c"                     nt"
  396.         "mov  %%"REG_c", "BYTE    "(%2)         nt"
  397.         "leal -1(%%ebx), %%ecx                  nt"
  398.         "xorl %%ebx, %%ecx                      nt"
  399.         "shrl $15, %%ecx                        nt"
  400.         "movzbl " MANGLE(ff_h264_norm_shift) "(%%ecx), %%ecx   nt"
  401.         "neg %%ecx                              nt"
  402.         "add $7, %%ecx                          nt"
  403.         "shll %%cl , %%esi                      nt"
  404.         "addl %%esi, %%ebx                      nt"
  405.         "2:                                     nt"
  406.         "movl %%edx, "RANGE    "(%2)            nt"
  407.         "movl %%ebx, "LOW      "(%2)            nt"
  408.         :"=&a"(bit) //FIXME this is fragile gcc either runs out of registers or miscompiles it (for example if "+a"(bit) or "+m"(*state) is used
  409.         :"r"(state), "r"(c)
  410.         : "%"REG_c, "%ebx", "%edx", "%"REG_S, "memory"
  411.     );
  412.     bit&=1;
  413. #else /* BRANCHLESS_CABAC_DECODER */
  414. #if defined HAVE_FAST_CMOV
  415. #define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp, tmpbyte)
  416.         "mov    "tmp"       , %%ecx                                     nt"
  417.         "shl    $17         , "tmp"                                     nt"
  418.         "cmp    "low"       , "tmp"                                     nt"
  419.         "cmova  %%ecx       , "range"                                   nt"
  420.         "sbb    %%ecx       , %%ecx                                     nt"
  421.         "and    %%ecx       , "tmp"                                     nt"
  422.         "sub    "tmp"       , "low"                                     nt"
  423.         "xor    %%ecx       , "ret"                                     nt"
  424. #else /* HAVE_FAST_CMOV */
  425. #define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp, tmpbyte)
  426.         "mov    "tmp"       , %%ecx                                     nt"
  427.         "shl    $17         , "tmp"                                     nt"
  428.         "sub    "low"       , "tmp"                                     nt"
  429.         "sar    $31         , "tmp"                                     nt" /*lps_mask*/
  430.         "sub    %%ecx       , "range"                                   nt" /*RangeLPS - range*/
  431.         "and    "tmp"       , "range"                                   nt" /*(RangeLPS - range)&lps_mask*/
  432.         "add    %%ecx       , "range"                                   nt" /*new range*/
  433.         "shl    $17         , %%ecx                                     nt"
  434.         "and    "tmp"       , %%ecx                                     nt"
  435.         "sub    %%ecx       , "low"                                     nt"
  436.         "xor    "tmp"       , "ret"                                     nt"
  437. #endif /* HAVE_FAST_CMOV */
  438. #define BRANCHLESS_GET_CABAC(ret, cabac, statep, low, lowword, range, tmp, tmpbyte)
  439.         "movzbl "statep"    , "ret"                                     nt"
  440.         "mov    "range"     , "tmp"                                     nt"
  441.         "and    $0xC0       , "range"                                   nt"
  442.         "movzbl "MANGLE(ff_h264_lps_range)"("ret", "range", 2), "range" nt"
  443.         "sub    "range"     , "tmp"                                     nt"
  444.         BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp, tmpbyte)
  445.         "movzbl " MANGLE(ff_h264_norm_shift) "("range"), %%ecx          nt"
  446.         "shl    %%cl        , "range"                                   nt"
  447.         "movzbl "MANGLE(ff_h264_mlps_state)"+128("ret"), "tmp"          nt"
  448.         "mov    "tmpbyte"   , "statep"                                  nt"
  449.         "shl    %%cl        , "low"                                     nt"
  450.         "test   "lowword"   , "lowword"                                 nt"
  451.         " jnz   1f                                                      nt"
  452.         "mov "BYTE"("cabac"), %%"REG_c"                                 nt"
  453.         "movzwl (%%"REG_c")     , "tmp"                                 nt"
  454.         "bswap  "tmp"                                                   nt"
  455.         "shr    $15         , "tmp"                                     nt"
  456.         "sub    $0xFFFF     , "tmp"                                     nt"
  457.         "add    $2          , %%"REG_c"                                 nt"
  458.         "mov    %%"REG_c"   , "BYTE    "("cabac")                       nt"
  459.         "lea    -1("low")   , %%ecx                                     nt"
  460.         "xor    "low"       , %%ecx                                     nt"
  461.         "shr    $15         , %%ecx                                     nt"
  462.         "movzbl " MANGLE(ff_h264_norm_shift) "(%%ecx), %%ecx            nt"
  463.         "neg    %%ecx                                                   nt"
  464.         "add    $7          , %%ecx                                     nt"
  465.         "shl    %%cl        , "tmp"                                     nt"
  466.         "add    "tmp"       , "low"                                     nt"
  467.         "1:                                                             nt"
  468.     asm volatile(
  469.         "movl "RANGE    "(%2), %%esi            nt"
  470.         "movl "LOW      "(%2), %%ebx            nt"
  471.         BRANCHLESS_GET_CABAC("%0", "%2", "(%1)", "%%ebx", "%%bx", "%%esi", "%%edx", "%%dl")
  472.         "movl %%esi, "RANGE    "(%2)            nt"
  473.         "movl %%ebx, "LOW      "(%2)            nt"
  474.         :"=&a"(bit)
  475.         :"r"(state), "r"(c)
  476.         : "%"REG_c, "%ebx", "%edx", "%esi", "memory"
  477.     );
  478.     bit&=1;
  479. #endif /* BRANCHLESS_CABAC_DECODER */
  480. #else /* defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS) */
  481.     int s = *state;
  482.     int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s];
  483.     int bit, lps_mask av_unused;
  484.     c->range -= RangeLPS;
  485. #ifndef BRANCHLESS_CABAC_DECODER
  486.     if(c->low < (c->range<<(CABAC_BITS+1))){
  487.         bit= s&1;
  488.         *state= ff_h264_mps_state[s];
  489.         renorm_cabac_decoder_once(c);
  490.     }else{
  491.         bit= ff_h264_norm_shift[RangeLPS];
  492.         c->low -= (c->range<<(CABAC_BITS+1));
  493.         *state= ff_h264_lps_state[s];
  494.         c->range = RangeLPS<<bit;
  495.         c->low <<= bit;
  496.         bit= (s&1)^1;
  497.         if(!(c->low & CABAC_MASK)){
  498.             refill2(c);
  499.         }
  500.     }
  501. #else /* BRANCHLESS_CABAC_DECODER */
  502.     lps_mask= ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
  503.     c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
  504.     c->range += (RangeLPS - c->range) & lps_mask;
  505.     s^=lps_mask;
  506.     *state= (ff_h264_mlps_state+128)[s];
  507.     bit= s&1;
  508.     lps_mask= ff_h264_norm_shift[c->range];
  509.     c->range<<= lps_mask;
  510.     c->low  <<= lps_mask;
  511.     if(!(c->low & CABAC_MASK))
  512.         refill2(c);
  513. #endif /* BRANCHLESS_CABAC_DECODER */
  514. #endif /* defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS) */
  515.     return bit;
  516. }
  517. static int av_noinline get_cabac_noinline(CABACContext *c, uint8_t * const state){
  518.     return get_cabac_inline(c,state);
  519. }
  520. static int get_cabac(CABACContext *c, uint8_t * const state){
  521.     return get_cabac_inline(c,state);
  522. }
  523. static int get_cabac_bypass(CABACContext *c){
  524. #if 0 //not faster
  525.     int bit;
  526.     asm volatile(
  527.         "movl "RANGE    "(%1), %%ebx            nt"
  528.         "movl "LOW      "(%1), %%eax            nt"
  529.         "shl $17, %%ebx                         nt"
  530.         "add %%eax, %%eax                       nt"
  531.         "sub %%ebx, %%eax                       nt"
  532.         "cltd                                   nt"
  533.         "and %%edx, %%ebx                       nt"
  534.         "add %%ebx, %%eax                       nt"
  535.         "test %%ax, %%ax                        nt"
  536.         " jnz 1f                                nt"
  537.         "movl "BYTE     "(%1), %%"REG_b"        nt"
  538.         "subl $0xFFFF, %%eax                    nt"
  539.         "movzwl (%%"REG_b"), %%ecx              nt"
  540.         "bswap %%ecx                            nt"
  541.         "shrl $15, %%ecx                        nt"
  542.         "addl $2, %%"REG_b"                     nt"
  543.         "addl %%ecx, %%eax                      nt"
  544.         "movl %%"REG_b", "BYTE     "(%1)        nt"
  545.         "1:                                     nt"
  546.         "movl %%eax, "LOW      "(%1)            nt"
  547.         :"=&d"(bit)
  548.         :"r"(c)
  549.         : "%eax", "%"REG_b, "%ecx", "memory"
  550.     );
  551.     return bit+1;
  552. #else
  553.     int range;
  554.     c->low += c->low;
  555.     if(!(c->low & CABAC_MASK))
  556.         refill(c);
  557.     range= c->range<<(CABAC_BITS+1);
  558.     if(c->low < range){
  559.         return 0;
  560.     }else{
  561.         c->low -= range;
  562.         return 1;
  563.     }
  564. #endif
  565. }
  566. static av_always_inline int get_cabac_bypass_sign(CABACContext *c, int val){
  567. #if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
  568.     asm volatile(
  569.         "movl "RANGE    "(%1), %%ebx            nt"
  570.         "movl "LOW      "(%1), %%eax            nt"
  571.         "shl $17, %%ebx                         nt"
  572.         "add %%eax, %%eax                       nt"
  573.         "sub %%ebx, %%eax                       nt"
  574.         "cltd                                   nt"
  575.         "and %%edx, %%ebx                       nt"
  576.         "add %%ebx, %%eax                       nt"
  577.         "xor %%edx, %%ecx                       nt"
  578.         "sub %%edx, %%ecx                       nt"
  579.         "test %%ax, %%ax                        nt"
  580.         " jnz 1f                                nt"
  581.         "mov  "BYTE     "(%1), %%"REG_b"        nt"
  582.         "subl $0xFFFF, %%eax                    nt"
  583.         "movzwl (%%"REG_b"), %%edx              nt"
  584.         "bswap %%edx                            nt"
  585.         "shrl $15, %%edx                        nt"
  586.         "add  $2, %%"REG_b"                     nt"
  587.         "addl %%edx, %%eax                      nt"
  588.         "mov  %%"REG_b", "BYTE     "(%1)        nt"
  589.         "1:                                     nt"
  590.         "movl %%eax, "LOW      "(%1)            nt"
  591.         :"+c"(val)
  592.         :"r"(c)
  593.         : "%eax", "%"REG_b, "%edx", "memory"
  594.     );
  595.     return val;
  596. #else
  597.     int range, mask;
  598.     c->low += c->low;
  599.     if(!(c->low & CABAC_MASK))
  600.         refill(c);
  601.     range= c->range<<(CABAC_BITS+1);
  602.     c->low -= range;
  603.     mask= c->low >> 31;
  604.     range &= mask;
  605.     c->low += range;
  606.     return (val^mask)-mask;
  607. #endif
  608. }
  609. /**
  610.  *
  611.  * @return the number of bytes read or 0 if no end
  612.  */
  613. static int get_cabac_terminate(CABACContext *c){
  614.     c->range -= 2;
  615.     if(c->low < c->range<<(CABAC_BITS+1)){
  616.         renorm_cabac_decoder_once(c);
  617.         return 0;
  618.     }else{
  619.         return c->bytestream - c->bytestream_start;
  620.     }
  621. }
  622. #if 0
  623. /**
  624.  * Get (truncated) unary binarization.
  625.  */
  626. static int get_cabac_u(CABACContext *c, uint8_t * state, int max, int max_index, int truncated){
  627.     int i;
  628.     for(i=0; i<max; i++){
  629.         if(get_cabac(c, state)==0)
  630.             return i;
  631.         if(i< max_index) state++;
  632.     }
  633.     return truncated ? max : -1;
  634. }
  635. /**
  636.  * get unary exp golomb k-th order binarization.
  637.  */
  638. static int get_cabac_ueg(CABACContext *c, uint8_t * state, int max, int is_signed, int k, int max_index){
  639.     int i, v;
  640.     int m= 1<<k;
  641.     if(get_cabac(c, state)==0)
  642.         return 0;
  643.     if(0 < max_index) state++;
  644.     for(i=1; i<max; i++){
  645.         if(get_cabac(c, state)==0){
  646.             if(is_signed && get_cabac_bypass(c)){
  647.                 return -i;
  648.             }else
  649.                 return i;
  650.         }
  651.         if(i < max_index) state++;
  652.     }
  653.     while(get_cabac_bypass(c)){
  654.         i+= m;
  655.         m+= m;
  656.     }
  657.     v=0;
  658.     while(m>>=1){
  659.         v+= v + get_cabac_bypass(c);
  660.     }
  661.     i += v;
  662.     if(is_signed && get_cabac_bypass(c)){
  663.         return -i;
  664.     }else
  665.         return i;
  666. }
  667. #endif /* 0 */
  668. #endif /* FFMPEG_CABAC_H */