Coverage Report

Created: 2026-05-16 06:27

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