Coverage Report

Created: 2026-06-30 07:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/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
7.20k
{
138
7.20k
  assert(length >= 0);
139
140
7.20k
  bitstream_start = bitstream;
141
7.20k
  bitstream_curr  = bitstream;
142
7.20k
  bitstream_end   = bitstream+length;
143
7.20k
}
144
145
void CABAC_decoder::init_CABAC()
146
7.74k
{
147
7.74k
  int length = bitstream_end - bitstream_curr;
148
149
7.74k
  range = 510;
150
7.74k
  bits_needed = 8;
151
152
7.74k
  value = 0;
153
154
7.74k
  if (length>0) { value  = (*bitstream_curr++) << 8;  bits_needed-=8; }
155
7.74k
  if (length>1) { value |= (*bitstream_curr++);       bits_needed-=8; }
156
157
7.74k
  logtrace(LogCABAC,"[%3d] init_CABAC_decode_2 r:%x v:%x\n", logcnt, range, value);
158
7.74k
}
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
194M
{
188
194M
#ifdef DE265_CABAC_ASM_X86_64
189
  // x86-64 branchless arithmetic decoder. Bit-identical to the C fallback below.
190
194M
  uint32_t range_l = range, value_l = value;
191
194M
  int      bn_l    = bits_needed;
192
194M
  uint8_t* curr_l = bitstream_curr;
193
194M
  uint8_t* sp = reinterpret_cast<uint8_t*>(model);
194
194M
  int bit_l;
195
196
194M
  __asm__ (
197
194M
    "movzbl (%[sp]), %%eax            \n\t" // eax = b (state*2 + MPS)
198
194M
    "mov    %[range], %%ecx           \n\t"
199
194M
    "shr    $6, %%ecx                 \n\t"
200
194M
    "sub    $4, %%ecx                 \n\t" // ecx = (range>>6)-4
201
194M
    "mov    %%eax, %%edx              \n\t"
202
194M
    "shr    $1, %%edx                 \n\t" // edx = state
203
194M
    "lea    (%%rcx,%%rdx,4), %%rcx    \n\t" // rcx = state*4 + ridx
204
194M
    "lea    %[lps], %%rdx             \n\t" // rdx = &LPS_table[0][0]
205
194M
    "movzbl (%%rdx,%%rcx,1), %%edx    \n\t" // edx = RangeLPS
206
194M
    "sub    %%edx, %[range]           \n\t" // range = range - RangeLPS (MPS range)
207
194M
    "mov    %[range], %%r8d           \n\t"
208
194M
    "shl    $7, %%r8d                 \n\t" // r8d = scaled_range
209
194M
    "mov    %[value], %%r9d           \n\t"
210
194M
    "sub    %%r8d, %%r9d              \n\t"
211
194M
    "sar    $31, %%r9d                \n\t" // r9d = mps_mask (-1 if MPS)
212
194M
    "not    %%r9d                     \n\t" // r9d = lps_mask (-1 if LPS)
213
194M
    "mov    %%r8d, %%ecx              \n\t"
214
194M
    "and    %%r9d, %%ecx              \n\t"
215
194M
    "sub    %%ecx, %[value]           \n\t" // value -= scaled & lps_mask
216
194M
    "mov    %%edx, %%ecx              \n\t" // RangeLPS
217
194M
    "sub    %[range], %%ecx           \n\t"
218
194M
    "and    %%r9d, %%ecx              \n\t"
219
194M
    "add    %%ecx, %[range]           \n\t" // range = RangeLPS if LPS, else unchanged
220
194M
    "and    $0xFF, %%r9d              \n\t"
221
194M
    "xor    %%r9d, %%eax              \n\t" // eax = idx
222
194M
    "mov    %%eax, %[bit]             \n\t"
223
194M
    "and    $1, %[bit]                \n\t" // bit = idx & 1
224
194M
    "lea    %[trans], %%rcx           \n\t" // rcx = &cabac_transition[0]
225
194M
    "movzbl (%%rcx,%%rax,1), %%edx    \n\t"
226
194M
    "mov    %%dl, (%[sp])             \n\t" // *sp = cabac_transition[idx]
227
194M
    "bsr    %[range], %%ecx           \n\t" // ecx = MSB index
228
194M
    "mov    $8, %%edx                 \n\t"
229
194M
    "sub    %%ecx, %%edx              \n\t" // edx = renorm shift = 8 - bsr
230
194M
    "mov    %%edx, %%ecx              \n\t"
231
194M
    "shl    %%cl, %[value]            \n\t"
232
194M
    "shl    %%cl, %[range]            \n\t"
233
194M
    "add    %%edx, %[bn]              \n\t" // bits_needed += shift
234
194M
    "test   %[bn], %[bn]              \n\t"
235
194M
    "js     1f                        \n\t" // bits_needed < 0: no refill
236
194M
    "cmp    %[end], %[curr]           \n\t"
237
194M
    "jae    2f                        \n\t" // curr >= end: no read
238
194M
    "movzbl (%[curr]), %%eax          \n\t"
239
194M
    "mov    %[bn], %%ecx              \n\t"
240
194M
    "shl    %%cl, %%eax              \n\t"
241
194M
    "or     %%eax, %[value]           \n\t" // value |= (*curr) << bits_needed
242
194M
    "inc    %[curr]                   \n\t"
243
194M
    "2:                               \n\t"
244
194M
    "sub    $8, %[bn]                 \n\t"
245
194M
    "1:                               \n\t"
246
194M
    : [range]"+r"(range_l), [value]"+r"(value_l), [bn]"+r"(bn_l),
247
194M
      [curr]"+r"(curr_l), [bit]"=&r"(bit_l)
248
194M
    : [sp]"r"(sp), [end]"r"(bitstream_end),
249
194M
      [lps]"m"(LPS_table[0][0]), [trans]"m"(cabac_transition[0])
250
194M
    : "rax","rcx","rdx","r8","r9","cc","memory"
251
194M
  );
252
253
194M
  range = range_l; value = value_l; bits_needed = (int16_t)bn_l; bitstream_curr = curr_l;
254
194M
  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
194M
}
335
336
int  CABAC_decoder::decode_term_bit()
337
737k
{
338
737k
  logtrace(LogCABAC,"CABAC term: range=%x\n", range);
339
340
737k
  range -= 2;
341
737k
  uint32_t scaledRange = range << 7;
342
343
737k
  if (value >= scaledRange)
344
1.40k
    {
345
1.40k
      return 1;
346
1.40k
    }
347
735k
  else
348
735k
    {
349
      // there is a while loop in the standard, but it will always be executed only once
350
351
735k
      if (scaledRange < (256<<7))
352
11.0k
        {
353
11.0k
          range = scaledRange >> 6;
354
11.0k
          value *= 2;
355
356
11.0k
          bits_needed++;
357
11.0k
          if (bits_needed==0)
358
1.43k
            {
359
1.43k
              bits_needed = -8;
360
361
1.43k
              if (bitstream_curr < bitstream_end) {
362
498
                value += (*bitstream_curr++);
363
498
              }
364
1.43k
            }
365
11.0k
        }
366
367
735k
      return 0;
368
735k
    }
369
737k
}
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
72.3M
{
376
72.3M
#ifdef DE265_CABAC_ASM_X86_64
377
72.3M
  uint32_t value_l = value;
378
72.3M
  int      bn_l    = bits_needed;
379
72.3M
  uint8_t* curr_l  = bitstream_curr;
380
72.3M
  int bit_l;
381
382
72.3M
  __asm__ (
383
72.3M
    "add    %[value], %[value]        \n\t" // value <<= 1
384
72.3M
    "addl   $1, %[bn]                 \n\t" // bits_needed++
385
72.3M
    "js     1f                        \n\t" // bits_needed < 0: no refill
386
72.3M
    "cmp    %[end], %[curr]           \n\t"
387
72.3M
    "jae    2f                        \n\t" // curr >= end: no read
388
72.3M
    "movzbl (%[curr]), %%eax          \n\t"
389
72.3M
    "or     %%eax, %[value]           \n\t" // value |= *curr (bits_needed==0)
390
72.3M
    "inc    %[curr]                   \n\t"
391
72.3M
    "2:                               \n\t"
392
72.3M
    "movl   $-8, %[bn]                \n\t" // bits_needed = -8
393
72.3M
    "1:                               \n\t"
394
72.3M
    "mov    %[range], %%ecx           \n\t"
395
72.3M
    "shl    $7, %%ecx                 \n\t" // ecx = scaled_range
396
72.3M
    "mov    %[value], %%edx           \n\t"
397
72.3M
    "sub    %%ecx, %%edx              \n\t" // edx = value - scaled_range
398
72.3M
    "mov    %%edx, %%eax              \n\t"
399
72.3M
    "sar    $31, %%eax               \n\t"  // eax = mask (-1 if value<scaled -> bit 0)
400
72.3M
    "mov    %%eax, %[bit]             \n\t"
401
72.3M
    "add    $1, %[bit]                \n\t" // bit = mask + 1
402
72.3M
    "not    %%eax                     \n\t" // eax = ~mask
403
72.3M
    "and    %%eax, %%ecx              \n\t" // ecx = scaled & ~mask
404
72.3M
    "sub    %%ecx, %[value]           \n\t" // value -= scaled when bit==1
405
72.3M
    : [value]"+r"(value_l), [bn]"+r"(bn_l), [curr]"+r"(curr_l), [bit]"=&r"(bit_l)
406
72.3M
    : [range]"r"(range), [end]"r"(bitstream_end)
407
72.3M
    : "rax","rcx","rdx","cc","memory"
408
72.3M
  );
409
410
72.3M
  value = value_l; bits_needed = (int16_t)bn_l; bitstream_curr = curr_l;
411
72.3M
  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
72.3M
}
450
451
452
int  CABAC_decoder::decode_TU_bypass(int cMax)
453
3.22M
{
454
3.50M
  for (int i=0;i<cMax;i++)
455
3.46M
    {
456
3.46M
      int bit = decode_bypass();
457
3.46M
      if (bit==0)
458
3.18M
        return i;
459
3.46M
    }
460
461
42.6k
  return cMax;
462
3.22M
}
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
4.49M
{
479
4.49M
  logtrace(LogCABAC,"[%3d] bypass group r:%x v:%x (nBits=%d)\n",logcnt,
480
4.49M
           range, value, nBits);
481
482
4.49M
  value <<= nBits;
483
4.49M
  bits_needed+=nBits;
484
485
4.49M
  if (bits_needed >= 0)
486
2.30M
    {
487
2.30M
      if (bitstream_end > bitstream_curr) {
488
361k
        int input = *bitstream_curr++;
489
361k
        input <<= bits_needed;
490
491
361k
        bits_needed -= 8;
492
361k
        value |= input;
493
361k
      }
494
2.30M
    }
495
496
4.49M
  uint32_t scaled_range = range << 7;
497
4.49M
  int v = value / scaled_range;
498
4.49M
  if (unlikely(v>=(1<<nBits))) { v=(1<<nBits)-1; } // may happen with broken bitstreams
499
4.49M
  value -= v * scaled_range;
500
501
4.49M
  logtrace(LogCABAC,"[%3d] -> value %d  r:%x v:%x\n", logcnt+nBits-1,
502
4.49M
           v, range, value);
503
504
#ifdef DE265_LOG_TRACE
505
  logcnt+=nBits;
506
#endif
507
508
4.49M
  return v;
509
4.49M
}
510
511
512
uint32_t  CABAC_decoder::decode_FL_bypass(int nBits)
513
19.6M
{
514
19.6M
  uint32_t v=0;
515
516
19.6M
  if (likely(nBits<=8)) {
517
19.6M
    if (nBits==0) {
518
15.1M
      return 0;
519
15.1M
    }
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
4.49M
    else {
527
4.49M
      v = decode_FL_bypass_parallel(nBits);
528
4.49M
    }
529
19.6M
  }
530
3.70k
  else {
531
3.70k
    v = decode_FL_bypass_parallel(8);
532
3.70k
    nBits-=8;
533
534
19.4k
    while (nBits--) {
535
15.6k
      v <<= 1;
536
15.6k
      v |= decode_bypass();
537
15.6k
    }
538
3.70k
  }
539
4.49M
  logtrace(LogCABAC,"      -> FL: %d\n", v);
540
541
4.49M
  return v;
542
19.6M
}
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
381k
{
559
381k
  uint32_t base=0;
560
381k
  int n=k;
561
562
381k
  for (;;)
563
474k
    {
564
474k
      int bit = decode_bypass();
565
474k
      if (bit==0)
566
381k
        break;
567
93.0k
      else {
568
93.0k
        if (n >= 31) {
569
117
          return 0; // TODO: error
570
117
        }
571
92.9k
        base += 1u<<n;
572
92.9k
        n++;
573
92.9k
      }
574
474k
    }
575
576
381k
  uint32_t suffix = decode_FL_bypass(n);
577
381k
  return base + suffix;
578
381k
}
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