Coverage Report

Created: 2026-02-26 06:24

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