Coverage Report

Created: 2026-03-08 06:41

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