Coverage Report

Created: 2026-09-13 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/libde265/libde265/cabac.cc
Line
Count
Source
1
/*
2
 * H.265 video codec.
3
 * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de>
4
 *
5
 * This file is part of libde265.
6
 *
7
 * libde265 is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU Lesser General Public License as
9
 * published by the Free Software Foundation, either version 3 of
10
 * the License, or (at your option) any later version.
11
 *
12
 * libde265 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
15
 * GNU Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public License
18
 * along with libde265.  If not, see <http://www.gnu.org/licenses/>.
19
 */
20
21
#include "cabac.h"
22
#include "util.h"
23
24
#include <stdint.h>
25
#include <stdio.h>
26
#include <stdlib.h>
27
#include <assert.h>
28
29
0
#define INITIAL_CABAC_BUFFER_CAPACITY 4096
30
31
32
static const uint8_t LPS_table[64][4] =
33
  {
34
    { 128, 176, 208, 240},
35
    { 128, 167, 197, 227},
36
    { 128, 158, 187, 216},
37
    { 123, 150, 178, 205},
38
    { 116, 142, 169, 195},
39
    { 111, 135, 160, 185},
40
    { 105, 128, 152, 175},
41
    { 100, 122, 144, 166},
42
    {  95, 116, 137, 158},
43
    {  90, 110, 130, 150},
44
    {  85, 104, 123, 142},
45
    {  81,  99, 117, 135},
46
    {  77,  94, 111, 128},
47
    {  73,  89, 105, 122},
48
    {  69,  85, 100, 116},
49
    {  66,  80,  95, 110},
50
    {  62,  76,  90, 104},
51
    {  59,  72,  86,  99},
52
    {  56,  69,  81,  94},
53
    {  53,  65,  77,  89},
54
    {  51,  62,  73,  85},
55
    {  48,  59,  69,  80},
56
    {  46,  56,  66,  76},
57
    {  43,  53,  63,  72},
58
    {  41,  50,  59,  69},
59
    {  39,  48,  56,  65},
60
    {  37,  45,  54,  62},
61
    {  35,  43,  51,  59},
62
    {  33,  41,  48,  56},
63
    {  32,  39,  46,  53},
64
    {  30,  37,  43,  50},
65
    {  29,  35,  41,  48},
66
    {  27,  33,  39,  45},
67
    {  26,  31,  37,  43},
68
    {  24,  30,  35,  41},
69
    {  23,  28,  33,  39},
70
    {  22,  27,  32,  37},
71
    {  21,  26,  30,  35},
72
    {  20,  24,  29,  33},
73
    {  19,  23,  27,  31},
74
    {  18,  22,  26,  30},
75
    {  17,  21,  25,  28},
76
    {  16,  20,  23,  27},
77
    {  15,  19,  22,  25},
78
    {  14,  18,  21,  24},
79
    {  14,  17,  20,  23},
80
    {  13,  16,  19,  22},
81
    {  12,  15,  18,  21},
82
    {  12,  14,  17,  20},
83
    {  11,  14,  16,  19},
84
    {  11,  13,  15,  18},
85
    {  10,  12,  15,  17},
86
    {  10,  12,  14,  16},
87
    {   9,  11,  13,  15},
88
    {   9,  11,  12,  14},
89
    {   8,  10,  12,  14},
90
    {   8,   9,  11,  13},
91
    {   7,   9,  11,  12},
92
    {   7,   9,  10,  12},
93
    {   7,   8,  10,  11},
94
    {   6,   8,   9,  11},
95
    {   6,   7,   9,  10},
96
    {   6,   7,   8,   9},
97
    {   2,   2,   2,   2}
98
  };
99
100
static const uint8_t renorm_table[32] =
101
  {
102
    6,  5,  4,  4,
103
    3,  3,  3,  3,
104
    2,  2,  2,  2,
105
    2,  2,  2,  2,
106
    1,  1,  1,  1,
107
    1,  1,  1,  1,
108
    1,  1,  1,  1,
109
    1,  1,  1,  1
110
  };
111
112
static const uint8_t next_state_MPS[64] =
113
  {
114
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
115
    17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
116
    33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
117
    49,50,51,52,53,54,55,56,57,58,59,60,61,62,62,63
118
  };
119
120
static const uint8_t next_state_LPS[64] =
121
  {
122
    0,0,1,2,2,4,4,5,6,7,8,9,9,11,11,12,
123
    13,13,15,15,16,16,18,18,19,19,21,21,22,22,23,24,
124
    24,25,26,26,27,27,28,29,29,30,30,30,31,32,32,33,
125
    33,33,34,34,35,35,35,36,36,36,37,37,37,38,38,63
126
  };
127
128
129
130
131
132
#ifdef DE265_LOG_TRACE
133
int logcnt=1;
134
#endif
135
136
void CABAC_decoder::init(uint8_t* bitstream, int length)
137
26.3k
{
138
26.3k
  assert(length >= 0);
139
140
26.3k
  bitstream_start = bitstream;
141
26.3k
  bitstream_curr  = bitstream;
142
26.3k
  bitstream_end   = bitstream+length;
143
26.3k
}
144
145
void CABAC_decoder::init_CABAC()
146
28.0k
{
147
28.0k
  int length = bitstream_end - bitstream_curr;
148
149
28.0k
  range = 510;
150
28.0k
  bits_needed = 8;
151
152
28.0k
  value = 0;
153
154
28.0k
  if (length>0) { value  = (*bitstream_curr++) << 8;  bits_needed-=8; }
155
28.0k
  if (length>1) { value |= (*bitstream_curr++);       bits_needed-=8; }
156
157
28.0k
  logtrace(LogCABAC,"[%3d] init_CABAC_decode_2 r:%x v:%x\n", logcnt, range, value);
158
28.0k
}
159
160
161
#if defined(__x86_64__) && defined(__GNUC__) && !defined(DE265_LOG_TRACE)
162
#define DE265_CABAC_ASM_X86_64 1
163
// Combined state-transition table (folds the MPS-flip at state 0), indexed by
164
// the packed context byte (state*2+MPSbit) for MPS and (packed ^ 0xFF) for LPS.
165
static const uint8_t cabac_transition[256] =
166
  {
167
      2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
168
     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
169
     34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
170
     50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
171
     66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
172
     82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
173
     98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,
174
    114,115,116,117,118,119,120,121,122,123,124,125,124,125,126,127,
175
    127,126, 77, 76, 77, 76, 75, 74, 75, 74, 75, 74, 73, 72, 73, 72,
176
     73, 72, 71, 70, 71, 70, 71, 70, 69, 68, 69, 68, 67, 66, 67, 66,
177
     67, 66, 65, 64, 65, 64, 63, 62, 61, 60, 61, 60, 61, 60, 59, 58,
178
     59, 58, 57, 56, 55, 54, 55, 54, 53, 52, 53, 52, 51, 50, 49, 48,
179
     49, 48, 47, 46, 45, 44, 45, 44, 43, 42, 43, 42, 39, 38, 39, 38,
180
     37, 36, 37, 36, 33, 32, 33, 32, 31, 30, 31, 30, 27, 26, 27, 26,
181
     25, 24, 23, 22, 23, 22, 19, 18, 19, 18, 17, 16, 15, 14, 13, 12,
182
     11, 10,  9,  8,  9,  8,  5,  4,  5,  4,  3,  2,  1,  0,  0,  1,
183
  };
184
#endif
185
186
int  CABAC_decoder::decode_bit(context_model* model)
187
502M
{
188
502M
#ifdef DE265_CABAC_ASM_X86_64
189
  // x86-64 branchless arithmetic decoder. Bit-identical to the C fallback below.
190
502M
  uint32_t range_l = range, value_l = value;
191
502M
  int      bn_l    = bits_needed;
192
502M
  uint8_t* curr_l = bitstream_curr;
193
502M
  uint8_t* sp = reinterpret_cast<uint8_t*>(model);
194
502M
  int bit_l;
195
196
502M
  __asm__ (
197
502M
    "movzbl (%[sp]), %%eax            \n\t" // eax = b (state*2 + MPS)
198
502M
    "mov    %[range], %%ecx           \n\t"
199
502M
    "shr    $6, %%ecx                 \n\t"
200
502M
    "sub    $4, %%ecx                 \n\t" // ecx = (range>>6)-4
201
502M
    "mov    %%eax, %%edx              \n\t"
202
502M
    "shr    $1, %%edx                 \n\t" // edx = state
203
502M
    "lea    (%%rcx,%%rdx,4), %%rcx    \n\t" // rcx = state*4 + ridx
204
502M
    "lea    %[lps], %%rdx             \n\t" // rdx = &LPS_table[0][0]
205
502M
    "movzbl (%%rdx,%%rcx,1), %%edx    \n\t" // edx = RangeLPS
206
502M
    "sub    %%edx, %[range]           \n\t" // range = range - RangeLPS (MPS range)
207
502M
    "mov    %[range], %%r8d           \n\t"
208
502M
    "shl    $7, %%r8d                 \n\t" // r8d = scaled_range
209
502M
    "mov    %[value], %%r9d           \n\t"
210
502M
    "sub    %%r8d, %%r9d              \n\t"
211
502M
    "sar    $31, %%r9d                \n\t" // r9d = mps_mask (-1 if MPS)
212
502M
    "not    %%r9d                     \n\t" // r9d = lps_mask (-1 if LPS)
213
502M
    "mov    %%r8d, %%ecx              \n\t"
214
502M
    "and    %%r9d, %%ecx              \n\t"
215
502M
    "sub    %%ecx, %[value]           \n\t" // value -= scaled & lps_mask
216
502M
    "mov    %%edx, %%ecx              \n\t" // RangeLPS
217
502M
    "sub    %[range], %%ecx           \n\t"
218
502M
    "and    %%r9d, %%ecx              \n\t"
219
502M
    "add    %%ecx, %[range]           \n\t" // range = RangeLPS if LPS, else unchanged
220
502M
    "and    $0xFF, %%r9d              \n\t"
221
502M
    "xor    %%r9d, %%eax              \n\t" // eax = idx
222
502M
    "mov    %%eax, %[bit]             \n\t"
223
502M
    "and    $1, %[bit]                \n\t" // bit = idx & 1
224
502M
    "lea    %[trans], %%rcx           \n\t" // rcx = &cabac_transition[0]
225
502M
    "movzbl (%%rcx,%%rax,1), %%edx    \n\t"
226
502M
    "mov    %%dl, (%[sp])             \n\t" // *sp = cabac_transition[idx]
227
502M
    "bsr    %[range], %%ecx           \n\t" // ecx = MSB index
228
502M
    "mov    $8, %%edx                 \n\t"
229
502M
    "sub    %%ecx, %%edx              \n\t" // edx = renorm shift = 8 - bsr
230
502M
    "mov    %%edx, %%ecx              \n\t"
231
502M
    "shl    %%cl, %[value]            \n\t"
232
502M
    "shl    %%cl, %[range]            \n\t"
233
502M
    "add    %%edx, %[bn]              \n\t" // bits_needed += shift
234
502M
    "test   %[bn], %[bn]              \n\t"
235
502M
    "js     1f                        \n\t" // bits_needed < 0: no refill
236
502M
    "cmp    %[end], %[curr]           \n\t"
237
502M
    "jae    2f                        \n\t" // curr >= end: no read
238
502M
    "movzbl (%[curr]), %%eax          \n\t"
239
502M
    "mov    %[bn], %%ecx              \n\t"
240
502M
    "shl    %%cl, %%eax              \n\t"
241
502M
    "or     %%eax, %[value]           \n\t" // value |= (*curr) << bits_needed
242
502M
    "inc    %[curr]                   \n\t"
243
502M
    "2:                               \n\t"
244
502M
    "sub    $8, %[bn]                 \n\t"
245
502M
    "1:                               \n\t"
246
502M
    : [range]"+r"(range_l), [value]"+r"(value_l), [bn]"+r"(bn_l),
247
502M
      [curr]"+r"(curr_l), [bit]"=&r"(bit_l)
248
502M
    : [sp]"r"(sp), [end]"r"(bitstream_end),
249
502M
      [lps]"m"(LPS_table[0][0]), [trans]"m"(cabac_transition[0])
250
502M
    : "rax","rcx","rdx","r8","r9","cc","memory"
251
502M
  );
252
253
502M
  range = range_l; value = value_l; bits_needed = (int16_t)bn_l; bitstream_curr = curr_l;
254
502M
  return bit_l;
255
#else
256
  logtrace(LogCABAC,"[%3d] decodeBin r:%x v:%x state:%d\n",logcnt,range, value, model->state);
257
258
  int decoded_bit;
259
  int LPS = LPS_table[model->state][ ( range >> 6 ) - 4 ];
260
  range -= LPS;
261
262
  uint32_t scaled_range = range << 7;
263
264
  logtrace(LogCABAC,"[%3d] sr:%x v:%x\n",logcnt,scaled_range, value);
265
266
  if (value < scaled_range)
267
    {
268
      logtrace(LogCABAC,"[%3d] MPS\n",logcnt);
269
270
      // MPS path
271
272
      decoded_bit = model->MPSbit;
273
      model->state = next_state_MPS[model->state];
274
275
      if (scaled_range < ( 256 << 7 ) )
276
        {
277
          // scaled range, highest bit (15) not set
278
279
          range = scaled_range >> 6; // shift range by one bit
280
          value <<= 1;               // shift value by one bit
281
          bits_needed++;
282
283
          if (bits_needed == 0)
284
            {
285
              bits_needed = -8;
286
              if (bitstream_curr < bitstream_end)
287
                { value |= *bitstream_curr++; }
288
            }
289
        }
290
    }
291
  else
292
    {
293
      logtrace(LogCABAC,"[%3d] LPS\n",logcnt);
294
      //printf("%d %d\n", model->state, 0);
295
296
      // LPS path
297
298
      value = (value - scaled_range);
299
300
      uint8_t num_bits = renorm_table[ LPS >> 3 ];
301
      value <<= num_bits;
302
      range   = LPS << num_bits;  /* this is always >= 0x100 except for state 63,
303
                                              but state 63 is never used */
304
305
#ifndef NDEBUG
306
      int num_bitsTab = renorm_table[ LPS >> 3 ];
307
      assert(num_bits == num_bitsTab);
308
#endif
309
310
      decoded_bit      = 1 - model->MPSbit;
311
312
      if (model->state==0) { model->MPSbit = 1-model->MPSbit; }
313
      model->state = next_state_LPS[model->state];
314
315
      bits_needed += num_bits;
316
317
      if (bits_needed >= 0)
318
        {
319
          logtrace(LogCABAC,"bits_needed: %d\n", bits_needed);
320
          if (bitstream_curr < bitstream_end)
321
            { value |= (*bitstream_curr++) << bits_needed; }
322
323
          bits_needed -= 8;
324
        }
325
    }
326
327
  logtrace(LogCABAC,"[%3d] -> bit %d  r:%x v:%x\n", logcnt, decoded_bit, range, value);
328
#ifdef DE265_LOG_TRACE
329
  logcnt++;
330
#endif
331
332
  return decoded_bit;
333
#endif
334
502M
}
335
336
int  CABAC_decoder::decode_term_bit()
337
635k
{
338
635k
  logtrace(LogCABAC,"CABAC term: range=%x\n", range);
339
340
635k
  range -= 2;
341
635k
  uint32_t scaledRange = range << 7;
342
343
635k
  if (value >= scaledRange)
344
2.36k
    {
345
2.36k
      return 1;
346
2.36k
    }
347
633k
  else
348
633k
    {
349
      // there is a while loop in the standard, but it will always be executed only once
350
351
633k
      if (scaledRange < (256<<7))
352
10.7k
        {
353
10.7k
          range = scaledRange >> 6;
354
10.7k
          value *= 2;
355
356
10.7k
          bits_needed++;
357
10.7k
          if (bits_needed==0)
358
1.44k
            {
359
1.44k
              bits_needed = -8;
360
361
1.44k
              if (bitstream_curr < bitstream_end) {
362
231
                value += (*bitstream_curr++);
363
231
              }
364
1.44k
            }
365
10.7k
        }
366
367
633k
      return 0;
368
633k
    }
369
635k
}
370
371
372
// When we read past the end of the bitstream (which should only happen on faulty bitstreams),
373
// we will eventually only return zeros.
374
int  CABAC_decoder::decode_bypass()
375
308M
{
376
308M
#ifdef DE265_CABAC_ASM_X86_64
377
308M
  uint32_t value_l = value;
378
308M
  int      bn_l    = bits_needed;
379
308M
  uint8_t* curr_l  = bitstream_curr;
380
308M
  int bit_l;
381
382
308M
  __asm__ (
383
308M
    "add    %[value], %[value]        \n\t" // value <<= 1
384
308M
    "addl   $1, %[bn]                 \n\t" // bits_needed++
385
308M
    "js     1f                        \n\t" // bits_needed < 0: no refill
386
308M
    "cmp    %[end], %[curr]           \n\t"
387
308M
    "jae    2f                        \n\t" // curr >= end: no read
388
308M
    "movzbl (%[curr]), %%eax          \n\t"
389
308M
    "or     %%eax, %[value]           \n\t" // value |= *curr (bits_needed==0)
390
308M
    "inc    %[curr]                   \n\t"
391
308M
    "2:                               \n\t"
392
308M
    "movl   $-8, %[bn]                \n\t" // bits_needed = -8
393
308M
    "1:                               \n\t"
394
308M
    "mov    %[range], %%ecx           \n\t"
395
308M
    "shl    $7, %%ecx                 \n\t" // ecx = scaled_range
396
308M
    "mov    %[value], %%edx           \n\t"
397
308M
    "sub    %%ecx, %%edx              \n\t" // edx = value - scaled_range
398
308M
    "mov    %%edx, %%eax              \n\t"
399
308M
    "sar    $31, %%eax               \n\t"  // eax = mask (-1 if value<scaled -> bit 0)
400
308M
    "mov    %%eax, %[bit]             \n\t"
401
308M
    "add    $1, %[bit]                \n\t" // bit = mask + 1
402
308M
    "not    %%eax                     \n\t" // eax = ~mask
403
308M
    "and    %%eax, %%ecx              \n\t" // ecx = scaled & ~mask
404
308M
    "sub    %%ecx, %[value]           \n\t" // value -= scaled when bit==1
405
308M
    : [value]"+r"(value_l), [bn]"+r"(bn_l), [curr]"+r"(curr_l), [bit]"=&r"(bit_l)
406
308M
    : [range]"r"(range), [end]"r"(bitstream_end)
407
308M
    : "rax","rcx","rdx","cc","memory"
408
308M
  );
409
410
308M
  value = value_l; bits_needed = (int16_t)bn_l; bitstream_curr = curr_l;
411
308M
  return bit_l;
412
#else
413
  logtrace(LogCABAC,"[%3d] bypass r:%x v:%x\n",logcnt,range, value);
414
415
  value <<= 1;
416
  bits_needed++;
417
418
  if (bits_needed >= 0)
419
    {
420
      if (bitstream_end > bitstream_curr) {
421
        bits_needed = -8;
422
        value |= *bitstream_curr++;
423
      }
424
      else {
425
        // we read past the end of the bitstream, fill with 0
426
        bits_needed = -8;
427
      }
428
    }
429
430
  int bit;
431
  uint32_t scaled_range = range << 7;
432
  if (value >= scaled_range)
433
    {
434
      value -= scaled_range;
435
      bit=1;
436
    }
437
  else
438
    {
439
      bit=0;
440
    }
441
442
  logtrace(LogCABAC,"[%3d] -> bit %d  r:%x v:%x\n", logcnt, bit, range, value);
443
#ifdef DE265_LOG_TRACE
444
  logcnt++;
445
#endif
446
447
  return bit;
448
#endif
449
308M
}
450
451
452
int  CABAC_decoder::decode_TU_bypass(int cMax)
453
6.73M
{
454
7.02M
  for (int i=0;i<cMax;i++)
455
6.98M
    {
456
6.98M
      int bit = decode_bypass();
457
6.98M
      if (bit==0)
458
6.69M
        return i;
459
6.98M
    }
460
461
41.8k
  return cMax;
462
6.73M
}
463
464
int  CABAC_decoder::decode_TU(int cMax, context_model* model)
465
0
{
466
0
  for (int i=0;i<cMax;i++)
467
0
    {
468
0
      int bit = decode_bit(model);
469
0
      if (bit==0)
470
0
        return i;
471
0
    }
472
473
0
  return cMax;
474
0
}
475
476
477
int  CABAC_decoder::decode_FL_bypass_parallel(int nBits)
478
13.2M
{
479
13.2M
  logtrace(LogCABAC,"[%3d] bypass group r:%x v:%x (nBits=%d)\n",logcnt,
480
13.2M
           range, value, nBits);
481
482
13.2M
  value <<= nBits;
483
13.2M
  bits_needed+=nBits;
484
485
13.2M
  if (bits_needed >= 0)
486
9.75M
    {
487
9.75M
      if (bitstream_end > bitstream_curr) {
488
101k
        int input = *bitstream_curr++;
489
101k
        input <<= bits_needed;
490
491
101k
        bits_needed -= 8;
492
101k
        value |= input;
493
101k
      }
494
9.75M
    }
495
496
13.2M
  uint32_t scaled_range = range << 7;
497
13.2M
  int v = value / scaled_range;
498
13.2M
  if (unlikely(v>=(1<<nBits))) { v=(1<<nBits)-1; } // may happen with broken bitstreams
499
13.2M
  value -= v * scaled_range;
500
501
13.2M
  logtrace(LogCABAC,"[%3d] -> value %d  r:%x v:%x\n", logcnt+nBits-1,
502
13.2M
           v, range, value);
503
504
#ifdef DE265_LOG_TRACE
505
  logcnt+=nBits;
506
#endif
507
508
13.2M
  return v;
509
13.2M
}
510
511
512
uint32_t  CABAC_decoder::decode_FL_bypass(int nBits)
513
116M
{
514
116M
  uint32_t v=0;
515
516
116M
  if (likely(nBits<=8)) {
517
115M
    if (nBits==0) {
518
103M
      return 0;
519
103M
    }
520
    // we could use decode_bypass() for a single bit, but this seems to be slower
521
#if 0
522
    else if (nBits==1) {
523
      v = decode_bypass();
524
    }
525
#endif
526
12.7M
    else {
527
12.7M
      v = decode_FL_bypass_parallel(nBits);
528
12.7M
    }
529
115M
  }
530
22.6k
  else {
531
22.6k
    v = decode_FL_bypass_parallel(8);
532
22.6k
    nBits-=8;
533
534
28.6k
    while (nBits--) {
535
5.94k
      v <<= 1;
536
5.94k
      v |= decode_bypass();
537
5.94k
    }
538
22.6k
  }
539
12.7M
  logtrace(LogCABAC,"      -> FL: %d\n", v);
540
541
12.7M
  return v;
542
116M
}
543
544
int  CABAC_decoder::decode_TR_bypass(int cRiceParam, int cTRMax)
545
0
{
546
0
  int prefix = decode_TU_bypass(cTRMax>>cRiceParam);
547
0
  if (prefix==4) { // TODO check: constant 4 only works for coefficient decoding
548
0
    return cTRMax;
549
0
  }
550
551
0
  int suffix = decode_FL_bypass(cRiceParam);
552
553
0
  return (prefix << cRiceParam) | suffix;
554
0
}
555
556
557
uint32_t  CABAC_decoder::decode_EGk_bypass(int k)
558
2.09M
{
559
2.09M
  uint32_t base=0;
560
2.09M
  int n=k;
561
562
2.09M
  for (;;)
563
2.15M
    {
564
2.15M
      int bit = decode_bypass();
565
2.15M
      if (bit==0)
566
2.09M
        break;
567
56.0k
      else {
568
56.0k
        if (n >= 31) {
569
77
          return 0; // TODO: error
570
77
        }
571
55.9k
        base += 1u<<n;
572
55.9k
        n++;
573
55.9k
      }
574
2.15M
    }
575
576
2.09M
  uint32_t suffix = decode_FL_bypass(n);
577
2.09M
  return base + suffix;
578
2.09M
}
579
580
581
// ---------------------------------------------------------------------------
582
583
void CABAC_encoder::add_trailing_bits()
584
0
{
585
0
  write_bit(1);
586
0
  int nZeros = number_free_bits_in_byte();
587
0
  write_bits(0, nZeros);
588
0
}
589
590
591
592
CABAC_encoder_bitstream::CABAC_encoder_bitstream()
593
0
{
594
0
  init_CABAC();
595
0
}
596
597
CABAC_encoder_bitstream::~CABAC_encoder_bitstream()
598
0
{
599
0
  free(data_mem);
600
0
}
601
602
void CABAC_encoder_bitstream::reset()
603
0
{
604
0
  data_size = 0;
605
0
  state = 0;
606
607
0
  vlc_buffer_len = 0;
608
609
0
  init_CABAC();
610
0
}
611
612
void CABAC_encoder_bitstream::write_bits(uint32_t bits,int n)
613
0
{
614
0
  vlc_buffer <<= n;
615
0
  vlc_buffer |= bits;
616
0
  vlc_buffer_len += n;
617
618
  // TODO: errors returned by append_byte() are ignored, resulting in a broken output.
619
620
0
  while (vlc_buffer_len>=8) {
621
0
    append_byte((vlc_buffer >> (vlc_buffer_len-8)) & 0xFF);
622
0
    vlc_buffer_len -= 8;
623
0
  }
624
0
}
625
626
void CABAC_encoder::write_uvlc(int value)
627
0
{
628
0
  assert(value>=0);
629
630
0
  int nLeadingZeros=0;
631
0
  int base=0;
632
0
  int range=1;
633
634
0
  while (value>=base+range) {
635
0
    base += range;
636
0
    range <<= 1;
637
0
    nLeadingZeros++;
638
0
  }
639
640
0
  write_bits((1<<nLeadingZeros) | (value-base),2*nLeadingZeros+1);
641
0
}
642
643
void CABAC_encoder::write_svlc(int value)
644
0
{
645
0
  if      (value==0) write_bits(1,1);
646
0
  else if (value>0)  write_uvlc(2*value-1);
647
0
  else               write_uvlc(-2*value);
648
0
}
649
650
void CABAC_encoder_bitstream::flush_VLC()
651
0
{
652
  // TODO: errors returned by append_byte() are ignored, resulting in a broken output.
653
654
0
  while (vlc_buffer_len>=8) {
655
0
    append_byte((vlc_buffer >> (vlc_buffer_len-8)) & 0xFF);
656
0
    vlc_buffer_len -= 8;
657
0
  }
658
659
0
  if (vlc_buffer_len>0) {
660
0
    append_byte(vlc_buffer << (8-vlc_buffer_len));
661
0
    vlc_buffer_len = 0;
662
0
  }
663
664
0
  vlc_buffer = 0;
665
0
}
666
667
void CABAC_encoder_bitstream::skip_bits(int nBits)
668
0
{
669
0
  while (nBits>=8) {
670
0
    write_bits(0,8);
671
0
    nBits-=8;
672
0
  }
673
674
0
  if (nBits>0) {
675
0
    write_bits(0,nBits);
676
0
  }
677
0
}
678
679
680
int  CABAC_encoder_bitstream::number_free_bits_in_byte() const
681
0
{
682
0
  if ((vlc_buffer_len % 8)==0) return 0;
683
0
  return 8- (vlc_buffer_len % 8);
684
0
}
685
686
687
bool CABAC_encoder_bitstream::check_size_and_resize(int nBytes)
688
0
{
689
0
  if (data_size+nBytes > data_capacity) { // 1 extra byte for stuffing
690
0
    if (data_capacity==0) {
691
0
      data_capacity = INITIAL_CABAC_BUFFER_CAPACITY;
692
0
    } else {
693
0
      data_capacity *= 2;
694
0
    }
695
696
0
    uint8_t* new_data_mem = (uint8_t*)realloc(data_mem,data_capacity);
697
0
    if (new_data_mem) {
698
0
      data_mem = new_data_mem;
699
0
    }
700
0
    else {
701
0
      return false;
702
0
    }
703
0
  }
704
705
0
  return true;
706
0
}
707
708
709
bool CABAC_encoder_bitstream::append_byte(int byte)
710
0
{
711
0
  if (!check_size_and_resize(2)) {
712
0
    return false;
713
0
  }
714
715
  // --- emulation prevention ---
716
717
  /* These byte sequences may never occur in the bitstream:
718
     0x000000 / 0x000001 / 0x000002
719
720
     Hence, we have to add a 0x03 before the third byte.
721
     We also have to add a 0x03 for this sequence: 0x000003, because
722
     the escape byte itself also has to be escaped.
723
  */
724
725
  // S0 --(0)--> S1 --(0)--> S2 --(0,1,2,3)--> add stuffing
726
727
0
  if (byte<=3) {
728
0
    /**/ if (state< 2 && byte==0) { state++; }
729
0
    else if (state==2 && byte<=3) {
730
0
      data_mem[ data_size++ ] = 3;
731
732
0
      if (byte==0) state=1;
733
0
      else         state=0;
734
0
    }
735
0
    else { state=0; }
736
0
  }
737
0
  else { state=0; }
738
739
740
  // write actual data byte
741
742
0
  data_mem[ data_size++ ] = byte;
743
744
0
  return true;
745
0
}
746
747
748
bool CABAC_encoder_bitstream::write_startcode()
749
0
{
750
0
  if (!check_size_and_resize(3)) {
751
0
    return false;
752
0
  }
753
754
0
  data_mem[ data_size+0 ] = 0;
755
0
  data_mem[ data_size+1 ] = 0;
756
0
  data_mem[ data_size+2 ] = 1;
757
0
  data_size+=3;
758
759
0
  return true;
760
0
}
761
762
void CABAC_encoder_bitstream::init_CABAC()
763
0
{
764
0
  range = 510;
765
0
  low = 0;
766
767
0
  bits_left = 23;
768
0
  buffered_byte = 0xFF;
769
0
  num_buffered_bytes = 0;
770
0
}
771
772
void CABAC_encoder_bitstream::flush_CABAC()
773
0
{
774
  // TODO: errors returned by append_byte() are ignored, resulting in a broken output.
775
776
0
  if (low >> (32 - bits_left))
777
0
    {
778
0
      append_byte(buffered_byte + 1);
779
0
      while (num_buffered_bytes > 1)
780
0
        {
781
0
          append_byte(0x00);
782
0
          num_buffered_bytes--;
783
0
        }
784
785
0
      low -= 1 << (32 - bits_left);
786
0
    }
787
0
  else
788
0
    {
789
0
      if (num_buffered_bytes > 0)
790
0
        {
791
0
          append_byte(buffered_byte);
792
0
        }
793
794
0
      while (num_buffered_bytes > 1)
795
0
        {
796
0
          append_byte(0xff);
797
0
          num_buffered_bytes--;
798
0
        }
799
0
    }
800
801
  // printf("low: %08x  nbits left:%d  filled:%d\n",low,bits_left,32-bits_left);
802
803
0
  write_bits(low >> 8, 24-bits_left);
804
0
}
805
806
807
void CABAC_encoder_bitstream::write_out()
808
0
{
809
  // TODO: errors returned by append_byte() are ignored, resulting in a broken output.
810
  
811
  //logtrace(LogCABAC,"low = %08x (bits_left=%d)\n",low,bits_left);
812
0
  int leadByte = low >> (24 - bits_left);
813
0
  bits_left += 8;
814
0
  low &= 0xffffffffu >> bits_left;
815
816
  //logtrace(LogCABAC,"write byte %02x\n",leadByte);
817
  //logtrace(LogCABAC,"-> low = %08x\n",low);
818
819
0
  if (leadByte == 0xff)
820
0
    {
821
0
      num_buffered_bytes++;
822
0
    }
823
0
  else
824
0
    {
825
0
      if (num_buffered_bytes > 0)
826
0
        {
827
0
          int carry = leadByte >> 8;
828
0
          int byte = buffered_byte + carry;
829
0
          buffered_byte = leadByte & 0xff;
830
0
          append_byte(byte);
831
832
0
          byte = ( 0xff + carry ) & 0xff;
833
0
          while ( num_buffered_bytes > 1 )
834
0
            {
835
0
              append_byte(byte);
836
0
              num_buffered_bytes--;
837
0
            }
838
0
        }
839
0
      else
840
0
        {
841
0
          num_buffered_bytes = 1;
842
0
          buffered_byte = leadByte;
843
0
        }
844
0
    }
845
0
}
846
847
void CABAC_encoder_bitstream::testAndWriteOut()
848
0
{
849
  // logtrace(LogCABAC,"bits_left = %d\n",bits_left);
850
851
0
  if (bits_left < 12)
852
0
    {
853
0
      write_out();
854
0
    }
855
0
}
856
857
858
#ifdef DE265_LOG_TRACE
859
int encBinCnt=1;
860
#endif
861
862
void CABAC_encoder_bitstream::write_CABAC_bit(int modelIdx, int bin)
863
0
{
864
0
  context_model* model = &(*mCtxModels)[modelIdx];
865
  //m_uiBinsCoded += m_binCountIncrement;
866
  //rcCtxModel.setBinsCoded( 1 );
867
868
0
  logtrace(LogCABAC,"[%d] range=%x low=%x state=%d, bin=%d\n",
869
0
           encBinCnt, range,low, model->state,bin);
870
871
  /*
872
  printf("[%d] range=%x low=%x state=%d, bin=%d\n",
873
         encBinCnt, range,low, model->state,bin);
874
875
  printf("%d %d X\n",model->state,bin != model->MPSbit);
876
  */
877
878
#ifdef DE265_LOG_TRACE
879
  encBinCnt++;
880
#endif
881
882
0
  uint32_t LPS = LPS_table[model->state][ ( range >> 6 ) - 4 ];
883
0
  range -= LPS;
884
885
0
  if (bin != model->MPSbit)
886
0
    {
887
      //logtrace(LogCABAC,"LPS\n");
888
889
0
      int num_bits = renorm_table[ LPS >> 3 ];
890
0
      low = (low + range) << num_bits;
891
0
      range   = LPS << num_bits;
892
893
0
      if (model->state==0) { model->MPSbit = 1-model->MPSbit; }
894
895
0
      model->state = next_state_LPS[model->state];
896
897
0
      bits_left -= num_bits;
898
0
    }
899
0
  else
900
0
    {
901
      //logtrace(LogCABAC,"MPS\n");
902
903
0
      model->state = next_state_MPS[model->state];
904
905
906
      // renorm
907
908
0
      if (range >= 256) { return; }
909
910
0
      low <<= 1;
911
0
      range <<= 1;
912
0
      bits_left--;
913
0
    }
914
915
0
  testAndWriteOut();
916
0
}
917
918
void CABAC_encoder_bitstream::write_CABAC_bypass(int bin)
919
0
{
920
0
  logtrace(LogCABAC,"[%d] bypass = %d, range=%x\n",encBinCnt,bin,range);
921
  /*
922
  printf("[%d] bypass = %d, range=%x\n",encBinCnt,bin,range);
923
  printf("%d %d X\n",64, -1);
924
  */
925
926
#ifdef DE265_LOG_TRACE
927
  encBinCnt++;
928
#endif
929
930
  // BinsCoded += m_binCountIncrement;
931
0
  low <<= 1;
932
933
0
  if (bin)
934
0
    {
935
0
      low += range;
936
0
    }
937
0
  bits_left--;
938
939
0
  testAndWriteOut();
940
0
}
941
942
void CABAC_encoder::write_CABAC_TU_bypass(int value, int cMax)
943
0
{
944
0
  for (int i=0;i<value;i++) {
945
0
    write_CABAC_bypass(1);
946
0
  }
947
948
0
  if (value<cMax) {
949
0
    write_CABAC_bypass(0);
950
0
  }
951
0
}
952
953
void CABAC_encoder::write_CABAC_FL_bypass(int value, int n)
954
0
{
955
0
  while (n>0) {
956
0
    n--;
957
0
    write_CABAC_bypass(value & (1<<n));
958
0
  }
959
0
}
960
961
void CABAC_encoder_bitstream::write_CABAC_term_bit(int bit)
962
0
{
963
0
  logtrace(LogCABAC,"CABAC term: range=%x\n", range);
964
965
0
  range -= 2;
966
967
0
  if (bit) {
968
0
    low += range;
969
970
0
    low <<= 7;
971
0
    range = 2 << 7;
972
0
    bits_left -= 7;
973
0
  }
974
0
  else if (range >= 256)
975
0
    {
976
0
      return;
977
0
    }
978
0
  else
979
0
    {
980
0
      low   <<= 1;
981
0
      range <<= 1;
982
0
      bits_left--;
983
0
    }
984
985
0
  testAndWriteOut();
986
0
}
987
988
989
990
991
static const uint32_t entropy_table[128] = {
992
  // -------------------- 200 --------------------
993
  /* state= 0 */  0x07d13 /* 0.977164 */,  0x08255 /* 1.018237 */,
994
  /* state= 1 */  0x07738 /* 0.931417 */,  0x086ef /* 1.054179 */,
995
  /* state= 2 */  0x0702b /* 0.876323 */,  0x0935a /* 1.151195 */,
996
  /* state= 3 */  0x069e6 /* 0.827333 */,  0x09c7f /* 1.222650 */,
997
  /* state= 4 */  0x062e8 /* 0.772716 */,  0x0a2c7 /* 1.271708 */,
998
  /* state= 5 */  0x05c18 /* 0.719488 */,  0x0ae25 /* 1.360532 */,
999
  /* state= 6 */  0x05632 /* 0.673414 */,  0x0b724 /* 1.430793 */,
1000
  /* state= 7 */  0x05144 /* 0.634904 */,  0x0c05d /* 1.502850 */,
1001
  /* state= 8 */  0x04bdf /* 0.592754 */,  0x0ccf2 /* 1.601145 */,
1002
  /* state= 9 */  0x0478d /* 0.559012 */,  0x0d57b /* 1.667843 */,
1003
  /* state=10 */  0x042ad /* 0.520924 */,  0x0de81 /* 1.738336 */,
1004
  /* state=11 */  0x03f4d /* 0.494564 */,  0x0e4b8 /* 1.786871 */,
1005
  /* state=12 */  0x03a9d /* 0.457945 */,  0x0f471 /* 1.909721 */,
1006
  /* state=13 */  0x037d5 /* 0.436201 */,  0x0fc56 /* 1.971385 */,
1007
  /* state=14 */  0x034c2 /* 0.412177 */,  0x10236 /* 2.017284 */,
1008
  /* state=15 */  0x031a6 /* 0.387895 */,  0x10d5c /* 2.104394 */,
1009
  /* state=16 */  0x02e62 /* 0.362383 */,  0x11b34 /* 2.212552 */,
1010
  /* state=17 */  0x02c20 /* 0.344752 */,  0x120b4 /* 2.255512 */,
1011
  /* state=18 */  0x029b8 /* 0.325943 */,  0x1294d /* 2.322672 */,
1012
  /* state=19 */  0x02791 /* 0.309143 */,  0x135e1 /* 2.420959 */,
1013
  /* state=20 */  0x02562 /* 0.292057 */,  0x13e37 /* 2.486077 */,
1014
  /* state=21 */  0x0230d /* 0.273846 */,  0x144fd /* 2.539000 */,
1015
  /* state=22 */  0x02193 /* 0.262308 */,  0x150c9 /* 2.631150 */,
1016
  /* state=23 */  0x01f5d /* 0.245026 */,  0x15ca0 /* 2.723641 */,
1017
  /* state=24 */  0x01de7 /* 0.233617 */,  0x162f9 /* 2.773246 */,
1018
  /* state=25 */  0x01c2f /* 0.220208 */,  0x16d99 /* 2.856259 */,
1019
  /* state=26 */  0x01a8e /* 0.207459 */,  0x17a93 /* 2.957634 */,
1020
  /* state=27 */  0x0195a /* 0.198065 */,  0x18051 /* 3.002477 */,
1021
  /* state=28 */  0x01809 /* 0.187778 */,  0x18764 /* 3.057759 */,
1022
  /* state=29 */  0x0164a /* 0.174144 */,  0x19460 /* 3.159206 */,
1023
  /* state=30 */  0x01539 /* 0.165824 */,  0x19f20 /* 3.243181 */,
1024
  /* state=31 */  0x01452 /* 0.158756 */,  0x1a465 /* 3.284334 */,
1025
  /* state=32 */  0x0133b /* 0.150261 */,  0x1b422 /* 3.407303 */,
1026
  /* state=33 */  0x0120c /* 0.140995 */,  0x1bce5 /* 3.475767 */,
1027
  /* state=34 */  0x01110 /* 0.133315 */,  0x1c394 /* 3.527962 */,
1028
  /* state=35 */  0x0104d /* 0.127371 */,  0x1d059 /* 3.627736 */,
1029
  /* state=36 */  0x00f8b /* 0.121451 */,  0x1d74b /* 3.681983 */,
1030
  /* state=37 */  0x00ef4 /* 0.116829 */,  0x1dfd0 /* 3.748540 */,
1031
  /* state=38 */  0x00e10 /* 0.109864 */,  0x1e6d3 /* 3.803335 */,
1032
  /* state=39 */  0x00d3f /* 0.103507 */,  0x1f925 /* 3.946462 */,
1033
  /* state=40 */  0x00cc4 /* 0.099758 */,  0x1fda7 /* 3.981667 */,
1034
  /* state=41 */  0x00c42 /* 0.095792 */,  0x203f8 /* 4.031012 */,
1035
  /* state=42 */  0x00b78 /* 0.089610 */,  0x20f7d /* 4.121014 */,
1036
  /* state=43 */  0x00afc /* 0.085830 */,  0x21dd6 /* 4.233102 */,
1037
  /* state=44 */  0x00a5e /* 0.081009 */,  0x22419 /* 4.282016 */,
1038
  /* state=45 */  0x00a1b /* 0.078950 */,  0x22a5e /* 4.331015 */,
1039
  /* state=46 */  0x00989 /* 0.074514 */,  0x23756 /* 4.432323 */,
1040
  /* state=47 */  0x0091b /* 0.071166 */,  0x24225 /* 4.516775 */,
1041
  /* state=48 */  0x008cf /* 0.068837 */,  0x2471a /* 4.555487 */,
1042
  /* state=49 */  0x00859 /* 0.065234 */,  0x25313 /* 4.649048 */,
1043
  /* state=50 */  0x00814 /* 0.063140 */,  0x25d67 /* 4.729721 */,
1044
  /* state=51 */  0x007b6 /* 0.060272 */,  0x2651f /* 4.790028 */,
1045
  /* state=52 */  0x0076e /* 0.058057 */,  0x2687c /* 4.816294 */,
1046
  /* state=53 */  0x00707 /* 0.054924 */,  0x27da7 /* 4.981661 */,
1047
  /* state=54 */  0x006d5 /* 0.053378 */,  0x28172 /* 5.011294 */,
1048
  /* state=55 */  0x00659 /* 0.049617 */,  0x28948 /* 5.072512 */,
1049
  /* state=56 */  0x00617 /* 0.047598 */,  0x297c5 /* 5.185722 */,
1050
  /* state=57 */  0x005dd /* 0.045814 */,  0x2a2df /* 5.272434 */,
1051
  /* state=58 */  0x005c1 /* 0.044965 */,  0x2a581 /* 5.293019 */,
1052
  /* state=59 */  0x00574 /* 0.042619 */,  0x2ad59 /* 5.354304 */,
1053
  /* state=60 */  0x0053b /* 0.040882 */,  0x2bba5 /* 5.465973 */,
1054
  /* state=61 */  0x0050c /* 0.039448 */,  0x2c596 /* 5.543651 */,
1055
  /* state=62 */  0x004e9 /* 0.038377 */,  0x2cd88 /* 5.605741 */,
1056
  0x00400 ,  0x2d000 /* dummy, should never be used */
1057
};
1058
1059
1060
#if 0
1061
static const uint32_t entropy_table_orig[128] = {
1062
  0x07b23, 0x085f9, 0x074a0, 0x08cbc, 0x06ee4, 0x09354, 0x067f4, 0x09c1b,
1063
  0x060b0, 0x0a62a, 0x05a9c, 0x0af5b, 0x0548d, 0x0b955, 0x04f56, 0x0c2a9,
1064
  0x04a87, 0x0cbf7, 0x045d6, 0x0d5c3, 0x04144, 0x0e01b, 0x03d88, 0x0e937,
1065
  0x039e0, 0x0f2cd, 0x03663, 0x0fc9e, 0x03347, 0x10600, 0x03050, 0x10f95,
1066
  0x02d4d, 0x11a02, 0x02ad3, 0x12333, 0x0286e, 0x12cad, 0x02604, 0x136df,
1067
  0x02425, 0x13f48, 0x021f4, 0x149c4, 0x0203e, 0x1527b, 0x01e4d, 0x15d00,
1068
  0x01c99, 0x166de, 0x01b18, 0x17017, 0x019a5, 0x17988, 0x01841, 0x18327,
1069
  0x016df, 0x18d50, 0x015d9, 0x19547, 0x0147c, 0x1a083, 0x0138e, 0x1a8a3,
1070
  0x01251, 0x1b418, 0x01166, 0x1bd27, 0x01068, 0x1c77b, 0x00f7f, 0x1d18e,
1071
  0x00eda, 0x1d91a, 0x00e19, 0x1e254, 0x00d4f, 0x1ec9a, 0x00c90, 0x1f6e0,
1072
  0x00c01, 0x1fef8, 0x00b5f, 0x208b1, 0x00ab6, 0x21362, 0x00a15, 0x21e46,
1073
  0x00988, 0x2285d, 0x00934, 0x22ea8, 0x008a8, 0x239b2, 0x0081d, 0x24577,
1074
  0x007c9, 0x24ce6, 0x00763, 0x25663, 0x00710, 0x25e8f, 0x006a0, 0x26a26,
1075
  0x00672, 0x26f23, 0x005e8, 0x27ef8, 0x005ba, 0x284b5, 0x0055e, 0x29057,
1076
  0x0050c, 0x29bab, 0x004c1, 0x2a674, 0x004a7, 0x2aa5e, 0x0046f, 0x2b32f,
1077
  0x0041f, 0x2c0ad, 0x003e7, 0x2ca8d, 0x003ba, 0x2d323, 0x0010c, 0x3bfbb
1078
};
1079
1080
1081
const uint32_t entropy_table_theory[128] =
1082
  {
1083
    0x08000, 0x08000, 0x076da, 0x089a0, 0x06e92, 0x09340, 0x0670a, 0x09cdf, 0x06029, 0x0a67f, 0x059dd, 0x0b01f, 0x05413, 0x0b9bf, 0x04ebf, 0x0c35f,
1084
    0x049d3, 0x0ccff, 0x04546, 0x0d69e, 0x0410d, 0x0e03e, 0x03d22, 0x0e9de, 0x0397d, 0x0f37e, 0x03619, 0x0fd1e, 0x032ee, 0x106be, 0x02ffa, 0x1105d,
1085
    0x02d37, 0x119fd, 0x02aa2, 0x1239d, 0x02836, 0x12d3d, 0x025f2, 0x136dd, 0x023d1, 0x1407c, 0x021d2, 0x14a1c, 0x01ff2, 0x153bc, 0x01e2f, 0x15d5c,
1086
    0x01c87, 0x166fc, 0x01af7, 0x1709b, 0x0197f, 0x17a3b, 0x0181d, 0x183db, 0x016d0, 0x18d7b, 0x01595, 0x1971b, 0x0146c, 0x1a0bb, 0x01354, 0x1aa5a,
1087
    0x0124c, 0x1b3fa, 0x01153, 0x1bd9a, 0x01067, 0x1c73a, 0x00f89, 0x1d0da, 0x00eb7, 0x1da79, 0x00df0, 0x1e419, 0x00d34, 0x1edb9, 0x00c82, 0x1f759,
1088
    0x00bda, 0x200f9, 0x00b3c, 0x20a99, 0x00aa5, 0x21438, 0x00a17, 0x21dd8, 0x00990, 0x22778, 0x00911, 0x23118, 0x00898, 0x23ab8, 0x00826, 0x24458,
1089
    0x007ba, 0x24df7, 0x00753, 0x25797, 0x006f2, 0x26137, 0x00696, 0x26ad7, 0x0063f, 0x27477, 0x005ed, 0x27e17, 0x0059f, 0x287b6, 0x00554, 0x29156,
1090
    0x0050e, 0x29af6, 0x004cc, 0x2a497, 0x0048d, 0x2ae35, 0x00451, 0x2b7d6, 0x00418, 0x2c176, 0x003e2, 0x2cb15, 0x003af, 0x2d4b5, 0x0037f, 0x2de55
1091
};
1092
#endif
1093
1094
1095
void CABAC_encoder_estim::write_CABAC_bit(int modelIdx, int bit)
1096
0
{
1097
0
  context_model* model = &(*mCtxModels)[modelIdx];
1098
  //printf("[%d] state=%d, bin=%d\n", encBinCnt, model->state,bit);
1099
  //encBinCnt++;
1100
1101
0
  int idx = model->state<<1;
1102
1103
0
  if (bit==model->MPSbit) {
1104
0
    model->state = next_state_MPS[model->state];
1105
0
  }
1106
0
  else {
1107
0
    idx++;
1108
0
    if (model->state==0) { model->MPSbit = 1-model->MPSbit; }
1109
0
    model->state = next_state_LPS[model->state];
1110
0
  }
1111
1112
0
  mFracBits += entropy_table[idx];
1113
1114
  //printf("-> %08lx %f\n",entropy_table[idx], entropy_table[idx] / float(1<<15));
1115
0
}
1116
1117
1118
float CABAC_encoder::RDBits_for_CABAC_bin(int modelIdx, int bit)
1119
0
{
1120
0
  context_model* model = &(*mCtxModels)[modelIdx];
1121
0
  int idx = model->state<<1;
1122
1123
0
  if (bit!=model->MPSbit) {
1124
0
    idx++;
1125
0
  }
1126
1127
0
  return entropy_table[idx] / float(1<<15);
1128
0
}
1129
1130
1131
void CABAC_encoder::write_CABAC_EGk(int val, int k)
1132
0
{
1133
0
  while (val  >=  ( 1 << k ) ) {
1134
0
    write_CABAC_bypass(1);
1135
0
    val = val - ( 1 << k );
1136
0
    k++;
1137
0
  }
1138
1139
0
  write_CABAC_bypass(0);
1140
1141
0
  while (k)  {
1142
0
    k--;
1143
0
    write_CABAC_bypass((val >> k) & 1);
1144
0
  }
1145
0
}
1146
1147
1148
1149
void CABAC_encoder_estim_constant::write_CABAC_bit(int modelIdx, int bit)
1150
0
{
1151
0
  context_model* model = &(*mCtxModels)[modelIdx];
1152
0
  int idx = model->state<<1;
1153
1154
0
  if (bit!=model->MPSbit) {
1155
0
    idx++;
1156
0
  }
1157
1158
0
  mFracBits += entropy_table[idx];
1159
0
}
1160
1161
1162
1163
#if 0
1164
void printtab(int idx,int s)
1165
{
1166
  printf("%d %f %f %f\n", s,
1167
         double(entropy_table[idx])/0x8000,
1168
         double(entropy_table_orig[idx])/0x8000,
1169
         double(entropy_table_f265[idx])/0x8000);
1170
}
1171
1172
1173
void plot_tables()
1174
{
1175
  for (int i=-62;i<=0;i++) {
1176
    int idx = -i *2;
1177
    int s = i;
1178
    printtab(idx,s);
1179
  }
1180
1181
  for (int i=0;i<=62;i++) {
1182
    int idx = 2*i +1;
1183
    int s = i;
1184
    printtab(idx,s);
1185
  }
1186
}
1187
#endif