Coverage Report

Created: 2026-06-10 07:00

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