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