Coverage Report

Created: 2026-10-28 06:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/libde265/libde265/slice.cc
Line
Count
Source
1
/*
2
 * H.265 video codec.
3
 * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de>
4
 *
5
 * Authors: struktur AG, Dirk Farin <farin@struktur.de>
6
 *          Min Chen <chenm003@163.com>
7
 *
8
 * This file is part of libde265.
9
 *
10
 * libde265 is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU Lesser General Public License as
12
 * published by the Free Software Foundation, either version 3 of
13
 * the License, or (at your option) any later version.
14
 *
15
 * libde265 is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU Lesser General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Lesser General Public License
21
 * along with libde265.  If not, see <http://www.gnu.org/licenses/>.
22
 */
23
24
#include "slice.h"
25
#include "motion.h"
26
#include "util.h"
27
#include "scan.h"
28
#include "intrapred.h"
29
#include "transform.h"
30
#include "threads.h"
31
#include "image.h"
32
33
#include <assert.h>
34
#include <string.h>
35
#include <stdlib.h>
36
37
38
#define LOCK de265_mutex_lock(&ctx->thread_pool.mutex)
39
#define UNLOCK de265_mutex_unlock(&ctx->thread_pool.mutex)
40
41
extern bool read_short_term_ref_pic_set(error_queue* errqueue,
42
                                        const seq_parameter_set* sps,
43
                                        bitreader* br,
44
                                        ref_pic_set* out_set,
45
                                        uint32_t idxRps, // index of the set to be read
46
                                        const std::vector<ref_pic_set>& sets,
47
                                        bool sliceRefPicSet);
48
49
50
void read_coding_tree_unit(thread_context* tctx);
51
52
void read_coding_quadtree(thread_context* tctx,
53
                          int xCtb, int yCtb,
54
                          int Log2CtbSizeY,
55
                          int ctDepth);
56
57
/*
58
void decode_inter_block(decoder_context* ctx,thread_context* tctx,
59
                        int xC, int yC, int log2CbSize);
60
*/
61
62
void slice_segment_header::set_defaults()
63
0
{
64
0
  slice_index = 0;
65
66
0
  first_slice_segment_in_pic_flag = 1;
67
0
  no_output_of_prior_pics_flag = 0;
68
0
  slice_pic_parameter_set_id = 0;
69
0
  dependent_slice_segment_flag = 0;
70
0
  slice_segment_address = 0;
71
72
0
  slice_type = SLICE_TYPE_I;
73
0
  pic_output_flag = 1;
74
0
  colour_plane_id = 0;
75
0
  slice_pic_order_cnt_lsb = 0;
76
0
  short_term_ref_pic_set_sps_flag = 1;
77
  // ref_pic_set slice_ref_pic_set;
78
79
0
  short_term_ref_pic_set_idx = 0;
80
0
  num_long_term_sps = 0;
81
0
  num_long_term_pics = 0;
82
83
  //uint8_t lt_idx_sps[MAX_NUM_REF_PICS];
84
  //int     poc_lsb_lt[MAX_NUM_REF_PICS];
85
  //char    used_by_curr_pic_lt_flag[MAX_NUM_REF_PICS];
86
87
  //char delta_poc_msb_present_flag[MAX_NUM_REF_PICS];
88
  //int delta_poc_msb_cycle_lt[MAX_NUM_REF_PICS];
89
90
0
  slice_temporal_mvp_enabled_flag = 0;
91
0
  slice_sao_luma_flag = 0;
92
0
  slice_sao_chroma_flag = 0;
93
94
0
  num_ref_idx_active_override_flag = 0;
95
0
  num_ref_idx_l0_active = 1; // [1;16]
96
0
  num_ref_idx_l1_active = 1; // [1;16]
97
98
0
  ref_pic_list_modification_flag_l0 = 0;
99
0
  ref_pic_list_modification_flag_l1 = 0;
100
  //uint8_t list_entry_l0[16];
101
  //uint8_t list_entry_l1[16];
102
103
0
  mvd_l1_zero_flag = 0;
104
0
  cabac_init_flag = 0;
105
0
  collocated_from_l0_flag = 0;
106
0
  collocated_ref_idx = 0;
107
108
  // --- pred_weight_table ---
109
110
0
  luma_log2_weight_denom = 0; // [0;7]
111
0
  ChromaLog2WeightDenom = 0; // [0;7]
112
113
  // first index is L0/L1
114
  /*
115
  uint8_t luma_weight_flag[2][16];   // bool
116
  uint8_t chroma_weight_flag[2][16]; // bool
117
  int16_t LumaWeight[2][16];
118
  int8_t  luma_offset[2][16];
119
  int16_t ChromaWeight[2][16][2];
120
  int8_t  ChromaOffset[2][16][2];
121
  */
122
123
124
0
  five_minus_max_num_merge_cand = 0;
125
0
  slice_qp_delta = 0;
126
127
0
  slice_cb_qp_offset = 0;
128
0
  slice_cr_qp_offset = 0;
129
130
0
  cu_chroma_qp_offset_enabled_flag = 0;
131
132
0
  deblocking_filter_override_flag = 0;
133
0
  slice_deblocking_filter_disabled_flag = 0;
134
0
  slice_beta_offset = 0; // = pps->beta_offset if undefined
135
0
  slice_tc_offset = 0; // = pps->tc_offset if undefined
136
137
0
  slice_loop_filter_across_slices_enabled_flag = 0;
138
139
0
  num_entry_point_offsets = 0;
140
  //int  offset_len;
141
  //std::vector<int> entry_point_offset;
142
143
0
  slice_segment_header_extension_length = 0;
144
145
0
  SliceAddrRS = slice_segment_address;
146
0
}
147
148
149
de265_error read_pred_weight_table(bitreader* br, slice_segment_header* shdr, decoder_context* ctx)
150
0
{
151
0
  uint32_t uvlc;
152
0
  int32_t svlc;
153
154
0
  pic_parameter_set* pps = ctx->get_pps((int) shdr->slice_pic_parameter_set_id);
155
0
  assert(pps);
156
0
  seq_parameter_set* sps = ctx->get_sps((int) pps->seq_parameter_set_id);
157
0
  assert(sps);
158
159
0
  uvlc = br->get_uvlc();
160
0
  if (uvlc > 7) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
161
0
  shdr->luma_log2_weight_denom = uvlc;
162
163
0
  if (sps->chroma_format_idc != 0) {
164
0
    svlc = br->get_svlc();
165
0
    svlc += shdr->luma_log2_weight_denom;
166
0
    if (svlc < 0 || svlc > 7) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
167
0
    shdr->ChromaLog2WeightDenom = svlc;
168
0
  }
169
170
0
  int sumWeightFlags[2]{};
171
172
0
  for (int l = 0; l <= 1; l++)
173
0
    if (l == 0 || (l == 1 && shdr->slice_type == SLICE_TYPE_B)) {
174
0
      int num_ref = (l == 0 ? shdr->num_ref_idx_l0_active - 1 : shdr->num_ref_idx_l1_active - 1);
175
176
0
      for (int i = 0; i <= num_ref; i++) {
177
0
        shdr->luma_weight_flag[l][i] = br->get_bits(1);
178
0
        if (shdr->luma_weight_flag[l][i]) sumWeightFlags[l]++;
179
0
      }
180
181
0
      if (sps->chroma_format_idc != 0) {
182
0
        for (int i = 0; i <= num_ref; i++) {
183
0
          shdr->chroma_weight_flag[l][i] = br->get_bits(1);
184
0
          if (shdr->chroma_weight_flag[l][i]) sumWeightFlags[l] += 2;
185
0
        }
186
0
      }
187
188
0
      for (int i = 0; i <= num_ref; i++) {
189
0
        if (shdr->luma_weight_flag[l][i]) {
190
          // delta_luma_weight
191
192
0
          svlc = br->get_svlc();
193
0
          if (svlc < -128 || svlc > 127) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
194
195
0
          shdr->LumaWeight[l][i] = (1 << shdr->luma_log2_weight_denom) + svlc;
196
197
          // luma_offset
198
199
0
          svlc = br->get_svlc();
200
0
          if (svlc < -sps->WpOffsetHalfRangeY || svlc > sps->WpOffsetHalfRangeY - 1) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
201
0
          shdr->luma_offset[l][i] = svlc;
202
0
        }
203
0
        else {
204
0
          shdr->LumaWeight[l][i] = 1 << shdr->luma_log2_weight_denom;
205
0
          shdr->luma_offset[l][i] = 0;
206
0
        }
207
208
0
        if (shdr->chroma_weight_flag[l][i])
209
0
          for (int j = 0; j < 2; j++) {
210
            // delta_chroma_weight
211
212
0
            svlc = br->get_svlc();
213
0
            if (svlc < -128 || svlc > 127) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
214
215
0
            shdr->ChromaWeight[l][i][j] = (1 << shdr->ChromaLog2WeightDenom) + svlc;
216
217
            // delta_chroma_offset
218
219
0
            svlc = br->get_svlc();
220
0
            if (svlc < -4 * sps->WpOffsetHalfRangeC ||
221
0
                svlc > 4 * sps->WpOffsetHalfRangeC - 1)
222
0
              return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
223
224
0
            svlc = Clip3(-sps->WpOffsetHalfRangeC,
225
0
                         sps->WpOffsetHalfRangeC-1,
226
0
                         (sps->WpOffsetHalfRangeC
227
0
                           +svlc
228
0
                           -((sps->WpOffsetHalfRangeC*shdr->ChromaWeight[l][i][j])
229
0
                             >> shdr->ChromaLog2WeightDenom)));
230
231
0
            shdr->ChromaOffset[l][i][j] = svlc;
232
0
          }
233
0
        else {
234
0
          for (int j = 0; j < 2; j++) {
235
0
            shdr->ChromaWeight[l][i][j] = 1 << shdr->ChromaLog2WeightDenom;
236
0
            shdr->ChromaOffset[l][i][j] = 0;
237
0
          }
238
0
        }
239
0
      }
240
0
    }
241
242
  // check sumWeightFlags against limits (H.265, Section 7.4.7.3)
243
244
0
  if (shdr->slice_type == SLICE_TYPE_P && sumWeightFlags[0] > 24) {
245
0
    return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
246
0
  }
247
248
0
  if (shdr->slice_type == SLICE_TYPE_B && sumWeightFlags[0] + sumWeightFlags[1] > 24) {
249
0
    return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
250
0
  }
251
252
0
  return DE265_OK;
253
0
}
254
255
256
void slice_segment_header::reset()
257
0
{
258
0
  pps = nullptr;
259
260
0
  slice_index = 0;
261
262
0
  first_slice_segment_in_pic_flag = 0;
263
0
  no_output_of_prior_pics_flag = 0;
264
0
  slice_pic_parameter_set_id = 0;
265
0
  dependent_slice_segment_flag = 0;
266
0
  slice_segment_address = 0;
267
268
0
  slice_type = 0;
269
0
  pic_output_flag = 0;
270
0
  colour_plane_id = 0;
271
0
  slice_pic_order_cnt_lsb = 0;
272
0
  short_term_ref_pic_set_sps_flag = 0;
273
0
  slice_ref_pic_set.reset();
274
275
0
  short_term_ref_pic_set_idx = 0;
276
0
  num_long_term_sps = 0;
277
0
  num_long_term_pics = 0;
278
279
0
  for (int i = 0; i < MAX_NUM_REF_PICS; i++) {
280
0
    lt_idx_sps[i] = 0;
281
0
    poc_lsb_lt[i] = 0;
282
0
    used_by_curr_pic_lt_flag[i] = 0;
283
0
    delta_poc_msb_present_flag[i] = 0;
284
0
    delta_poc_msb_cycle_lt[i] = 0;
285
0
  }
286
287
0
  slice_temporal_mvp_enabled_flag = 0;
288
0
  slice_sao_luma_flag = 0;
289
0
  slice_sao_chroma_flag = 0;
290
291
0
  num_ref_idx_active_override_flag = 0;
292
0
  num_ref_idx_l0_active = 0;
293
0
  num_ref_idx_l1_active = 0;
294
295
0
  ref_pic_list_modification_flag_l0 = 0;
296
0
  ref_pic_list_modification_flag_l1 = 0;
297
0
  for (int i = 0; i < 16; i++) {
298
0
    list_entry_l0[i] = 0;
299
0
    list_entry_l1[i] = 0;
300
0
  }
301
302
0
  mvd_l1_zero_flag = 0;
303
0
  cabac_init_flag = 0;
304
0
  collocated_from_l0_flag = 0;
305
0
  collocated_ref_idx = 0;
306
307
0
  luma_log2_weight_denom = 0;
308
0
  ChromaLog2WeightDenom = 0;
309
310
0
  for (int i = 0; i < 2; i++)
311
0
    for (int j = 0; j < 16; j++) {
312
0
      luma_weight_flag[i][j] = 0;
313
0
      chroma_weight_flag[i][j] = 0;
314
0
      LumaWeight[i][j] = 0;
315
0
      luma_offset[i][j] = 0;
316
0
      ChromaWeight[i][j][0] = ChromaWeight[i][j][1] = 0;
317
0
      ChromaOffset[i][j][0] = ChromaOffset[i][j][1] = 0;
318
0
    }
319
320
0
  five_minus_max_num_merge_cand = 0;
321
0
  slice_qp_delta = 0;
322
323
0
  slice_cb_qp_offset = 0;
324
0
  slice_cr_qp_offset = 0;
325
326
0
  cu_chroma_qp_offset_enabled_flag = 0;
327
328
0
  deblocking_filter_override_flag = 0;
329
0
  slice_deblocking_filter_disabled_flag = 0;
330
0
  slice_beta_offset = 0;
331
0
  slice_tc_offset = 0;
332
333
0
  slice_loop_filter_across_slices_enabled_flag = 0;
334
335
0
  num_entry_point_offsets = 0;
336
0
  offset_len = 0;
337
0
  entry_point_offset.clear();
338
339
0
  slice_segment_header_extension_length = 0;
340
341
0
  SliceAddrRS = 0;
342
0
  SliceQPY = 0;
343
344
0
  initType = 0;
345
346
0
  MaxNumMergeCand = 0;
347
0
  CurrRpsIdx = 0;
348
0
  CurrRps.reset();
349
0
  NumPocTotalCurr = 0;
350
351
0
  for (int i = 0; i < 2; i++)
352
0
    for (int j = 0; j < MAX_NUM_REF_PICS; j++) {
353
0
      RefPicList[i][j] = 0;
354
0
      RefPicList_POC[i][j] = 0;
355
0
      RefPicList_PicState[i][j] = 0;
356
0
      LongTermRefPic[i][j] = 0;
357
0
    }
358
359
  //context_model ctx_model_storage[CONTEXT_MODEL_TABLE_LENGTH];
360
361
0
  RemoveReferencesList.clear();
362
363
0
  for (int i = 0; i < 4; i++) {
364
0
    ctx_model_storage_StatCoeff[i] = 0;
365
0
  }
366
0
  ctx_model_storage_defined = false;
367
0
}
368
369
370
de265_error slice_segment_header::read(bitreader* br, decoder_context* ctx,
371
                                       bool* continueDecoding)
372
0
{
373
0
  *continueDecoding = false;
374
0
  reset();
375
376
0
  uint32_t uvlc;
377
0
  int32_t svlc;
378
379
  // set defaults
380
381
0
  dependent_slice_segment_flag = 0;
382
383
384
  // read bitstream
385
386
0
  first_slice_segment_in_pic_flag = br->get_bits(1);
387
388
0
  if (ctx->get_RapPicFlag()) {
389
    // TODO: is this still correct ? Should we drop RapPicFlag ?
390
0
    no_output_of_prior_pics_flag = br->get_bits(1);
391
0
  }
392
393
0
  if ((uvlc = br->get_uvlc()) == UVLC_ERROR ||
394
0
      uvlc >= DE265_MAX_PPS_SETS) {
395
0
    ctx->add_warning(DE265_WARNING_NONEXISTING_PPS_REFERENCED, false);
396
0
    return DE265_OK;
397
0
  }
398
0
  slice_pic_parameter_set_id = uvlc;
399
400
0
  if (!ctx->has_pps(slice_pic_parameter_set_id)) {
401
0
    ctx->add_warning(DE265_WARNING_NONEXISTING_PPS_REFERENCED, false);
402
0
    return DE265_OK;
403
0
  }
404
405
0
  pps = ctx->get_shared_pps(slice_pic_parameter_set_id);
406
407
0
  const seq_parameter_set* sps = pps->sps.get();
408
0
  if (!sps->sps_read) {
409
0
    ctx->add_warning(DE265_WARNING_NONEXISTING_SPS_REFERENCED, false);
410
0
    *continueDecoding = false;
411
0
    return DE265_OK;
412
0
  }
413
414
0
  if (!first_slice_segment_in_pic_flag) {
415
0
    if (pps->dependent_slice_segments_enabled_flag) {
416
0
      dependent_slice_segment_flag = br->get_bits(1);
417
0
    }
418
0
    else {
419
0
      dependent_slice_segment_flag = 0;
420
0
    }
421
422
0
    uint32_t slice_segment_address = br->get_bits(ceil_log2(sps->PicSizeInCtbsY));
423
424
0
    if (dependent_slice_segment_flag) {
425
0
      if (slice_segment_address == 0) {
426
0
        *continueDecoding = false;
427
0
        ctx->add_warning(DE265_WARNING_DEPENDENT_SLICE_WITH_ADDRESS_ZERO, false);
428
0
        return DE265_OK;
429
0
      }
430
431
0
      if (ctx->previous_slice_header == nullptr) {
432
0
        return DE265_ERROR_NO_INITIAL_SLICE_HEADER;
433
0
      }
434
435
0
      *this = *ctx->previous_slice_header;
436
437
0
      first_slice_segment_in_pic_flag = 0;
438
0
      dependent_slice_segment_flag = 1;
439
0
    }
440
441
0
    this->slice_segment_address = slice_segment_address;
442
0
  }
443
0
  else {
444
0
    dependent_slice_segment_flag = 0;
445
0
    slice_segment_address = 0;
446
0
  }
447
448
0
  if (slice_segment_address >= sps->PicSizeInCtbsY) {
449
0
    ctx->add_warning(DE265_WARNING_SLICE_SEGMENT_ADDRESS_INVALID, false);
450
0
    return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
451
0
  }
452
453
  //printf("SLICE %d (%d)\n",slice_segment_address, sps->PicSizeInCtbsY);
454
455
456
0
  if (!dependent_slice_segment_flag) {
457
0
    for (int i = 0; i < pps->num_extra_slice_header_bits; i++) {
458
      //slice_reserved_undetermined_flag[i]
459
0
      br->skip_bits(1);
460
0
    }
461
462
0
    if ((uvlc = br->get_uvlc()) == UVLC_ERROR ||
463
0
        uvlc > 2) {
464
0
      ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
465
0
      *continueDecoding = false;
466
0
      return DE265_OK;
467
0
    }
468
0
    slice_type = uvlc;
469
470
0
    if (pps->output_flag_present_flag) {
471
0
      pic_output_flag = br->get_bits(1);
472
0
    }
473
0
    else {
474
0
      pic_output_flag = 1;
475
0
    }
476
477
0
    if (sps->separate_colour_plane_flag == 1) {
478
0
      colour_plane_id = br->get_bits(2);
479
0
    }
480
481
482
0
    slice_pic_order_cnt_lsb = 0;
483
0
    short_term_ref_pic_set_sps_flag = 0;
484
485
0
    int NumLtPics = 0;
486
487
0
    if (ctx->get_nal_unit_type() != NAL_UNIT_IDR_W_RADL &&
488
0
        ctx->get_nal_unit_type() != NAL_UNIT_IDR_N_LP) {
489
0
      slice_pic_order_cnt_lsb = br->get_bits(sps->log2_max_pic_order_cnt_lsb);
490
0
      short_term_ref_pic_set_sps_flag = br->get_bits(1);
491
492
0
      if (!short_term_ref_pic_set_sps_flag) {
493
0
        read_short_term_ref_pic_set(ctx, sps,
494
0
                                    br, &slice_ref_pic_set,
495
0
                                    sps->num_short_term_ref_pic_sets(),
496
0
                                    sps->ref_pic_sets,
497
0
                                    true);
498
499
0
        CurrRpsIdx = sps->num_short_term_ref_pic_sets();
500
0
        CurrRps = slice_ref_pic_set;
501
0
      }
502
0
      else {
503
0
        int nBits = ceil_log2(sps->num_short_term_ref_pic_sets());
504
0
        if (nBits > 0) short_term_ref_pic_set_idx = br->get_bits(nBits);
505
0
        else short_term_ref_pic_set_idx = 0;
506
507
0
        if (short_term_ref_pic_set_idx >= sps->num_short_term_ref_pic_sets()) {
508
0
          ctx->add_warning(DE265_WARNING_SHORT_TERM_REF_PIC_SET_OUT_OF_RANGE, false);
509
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
510
0
        }
511
512
0
        CurrRpsIdx = short_term_ref_pic_set_idx;
513
0
        CurrRps = sps->ref_pic_sets[CurrRpsIdx];
514
0
      }
515
516
517
      // --- long-term MC ---
518
519
0
      if (sps->long_term_ref_pics_present_flag) {
520
0
        if (sps->num_long_term_ref_pics_sps > 0) {
521
0
          if ((uvlc = br->get_uvlc()) == UVLC_ERROR ||
522
0
              uvlc > sps->num_long_term_ref_pics_sps) {
523
0
            return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
524
0
          }
525
0
          num_long_term_sps = uvlc;
526
0
        }
527
0
        else {
528
0
          num_long_term_sps = 0;
529
0
        }
530
531
0
        if ((uvlc = br->get_uvlc()) == UVLC_ERROR || uvlc > MAX_NUM_LT_REF_PICS_SPS) {
532
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
533
0
        }
534
0
        num_long_term_pics = uvlc;
535
536
        // check maximum number of reference frames
537
538
0
        if (num_long_term_sps +
539
0
            num_long_term_pics +
540
0
            CurrRps.NumNegativePics +
541
0
            CurrRps.NumPositivePics
542
0
            > sps->sps_max_dec_pic_buffering[sps->sps_max_sub_layers - 1]) {
543
0
          ctx->add_warning(DE265_WARNING_MAX_NUM_REF_PICS_EXCEEDED, false);
544
0
          *continueDecoding = false;
545
0
          return DE265_OK;
546
0
        }
547
548
0
        for (int i = 0; i < num_long_term_sps + num_long_term_pics; i++) {
549
0
          if (i < num_long_term_sps) {
550
0
            int nBits = ceil_log2(sps->num_long_term_ref_pics_sps);
551
0
            lt_idx_sps[i] = br->get_bits(nBits);
552
553
            // check that the referenced lt-reference really exists
554
555
0
            if (lt_idx_sps[i] >= sps->num_long_term_ref_pics_sps) {
556
0
              ctx->add_warning(DE265_NON_EXISTING_LT_REFERENCE_CANDIDATE_IN_SLICE_HEADER, false);
557
0
              *continueDecoding = false;
558
0
              return DE265_OK;
559
0
            }
560
561
            // delta_poc_msb_present_flag[i] = 0; // TODO ?
562
563
0
            ctx->PocLsbLt[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps[i]];
564
0
            ctx->UsedByCurrPicLt[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps[i]];
565
0
          }
566
0
          else {
567
0
            int nBits = sps->log2_max_pic_order_cnt_lsb;
568
0
            poc_lsb_lt[i] = br->get_bits(nBits);
569
0
            used_by_curr_pic_lt_flag[i] = br->get_bits(1);
570
571
0
            ctx->PocLsbLt[i] = poc_lsb_lt[i];
572
0
            ctx->UsedByCurrPicLt[i] = used_by_curr_pic_lt_flag[i];
573
0
          }
574
575
0
          if (ctx->UsedByCurrPicLt[i]) {
576
0
            NumLtPics++;
577
0
          }
578
579
0
          delta_poc_msb_present_flag[i] = br->get_bits(1);
580
0
          if (delta_poc_msb_present_flag[i]) {
581
0
            if ((uvlc = br->get_uvlc()) == UVLC_ERROR) {
582
0
              return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
583
0
            }
584
0
            delta_poc_msb_cycle_lt[i] = uvlc;
585
0
          }
586
0
          else {
587
0
            delta_poc_msb_cycle_lt[i] = 0;
588
0
          }
589
590
0
          if (i == 0 || i == num_long_term_sps) {
591
0
            ctx->DeltaPocMsbCycleLt[i] = delta_poc_msb_cycle_lt[i];
592
0
          }
593
0
          else {
594
0
            if (delta_poc_msb_cycle_lt[i] > UINT32_MAX - ctx->DeltaPocMsbCycleLt[i - 1]) {
595
0
              ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
596
0
              return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
597
0
            }
598
0
            ctx->DeltaPocMsbCycleLt[i] = (delta_poc_msb_cycle_lt[i] +
599
0
                                          ctx->DeltaPocMsbCycleLt[i - 1]);
600
0
          }
601
0
        }
602
0
      }
603
0
      else {
604
0
        num_long_term_sps = 0;
605
0
        num_long_term_pics = 0;
606
0
      }
607
608
0
      if (sps->sps_temporal_mvp_enabled_flag) {
609
0
        slice_temporal_mvp_enabled_flag = br->get_bits(1);
610
0
      }
611
0
      else {
612
0
        slice_temporal_mvp_enabled_flag = 0;
613
0
      }
614
0
    }
615
0
    else {
616
0
      slice_pic_order_cnt_lsb = 0;
617
0
      num_long_term_sps = 0;
618
0
      num_long_term_pics = 0;
619
0
    }
620
621
622
    // --- SAO ---
623
624
0
    if (sps->sample_adaptive_offset_enabled_flag) {
625
0
      slice_sao_luma_flag = br->get_bits(1);
626
627
0
      if (sps->ChromaArrayType != CHROMA_MONO) {
628
0
        slice_sao_chroma_flag = br->get_bits(1);
629
0
      }
630
0
      else {
631
0
        slice_sao_chroma_flag = 0;
632
0
      }
633
0
    }
634
0
    else {
635
0
      slice_sao_luma_flag = 0;
636
0
      slice_sao_chroma_flag = 0;
637
0
    }
638
639
0
    num_ref_idx_l0_active = 0;
640
0
    num_ref_idx_l1_active = 0;
641
642
0
    if (slice_type == SLICE_TYPE_P ||
643
0
        slice_type == SLICE_TYPE_B) {
644
0
      num_ref_idx_active_override_flag = br->get_bits(1);
645
0
      if (num_ref_idx_active_override_flag) {
646
0
        if ((uvlc = br->get_uvlc()) == UVLC_ERROR || uvlc > 15) {
647
0
          ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
648
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
649
0
        }
650
0
        num_ref_idx_l0_active = uvlc + 1;
651
652
0
        if (slice_type == SLICE_TYPE_B) {
653
0
          if ((uvlc = br->get_uvlc()) == UVLC_ERROR || uvlc > 15) {
654
0
            ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
655
0
            return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
656
0
          }
657
0
          num_ref_idx_l1_active = uvlc + 1;
658
0
        }
659
0
      }
660
0
      else {
661
0
        num_ref_idx_l0_active = pps->num_ref_idx_l0_default_active;
662
0
        num_ref_idx_l1_active = pps->num_ref_idx_l1_default_active;
663
0
      }
664
665
0
      NumPocTotalCurr = CurrRps.NumPocTotalCurr_shortterm_only + NumLtPics;
666
667
0
      if (pps->lists_modification_present_flag && NumPocTotalCurr > 1) {
668
0
        int nBits = ceil_log2(NumPocTotalCurr);
669
670
0
        ref_pic_list_modification_flag_l0 = br->get_bits(1);
671
0
        if (ref_pic_list_modification_flag_l0) {
672
0
          for (int i = 0; i < num_ref_idx_l0_active; i++) {
673
0
            list_entry_l0[i] = br->get_bits(nBits);
674
0
          }
675
0
        }
676
677
0
        if (slice_type == SLICE_TYPE_B) {
678
0
          ref_pic_list_modification_flag_l1 = br->get_bits(1);
679
0
          if (ref_pic_list_modification_flag_l1) {
680
0
            for (int i = 0; i < num_ref_idx_l1_active; i++) {
681
0
              list_entry_l1[i] = br->get_bits(nBits);
682
0
            }
683
0
          }
684
0
        }
685
0
        else {
686
0
          ref_pic_list_modification_flag_l1 = 0;
687
0
        }
688
0
      }
689
0
      else {
690
0
        ref_pic_list_modification_flag_l0 = 0;
691
0
        ref_pic_list_modification_flag_l1 = 0;
692
0
      }
693
694
0
      if (slice_type == SLICE_TYPE_B) {
695
0
        mvd_l1_zero_flag = br->get_bits(1);
696
0
      }
697
698
0
      if (pps->cabac_init_present_flag) {
699
0
        cabac_init_flag = br->get_bits(1);
700
0
      }
701
0
      else {
702
0
        cabac_init_flag = 0;
703
0
      }
704
705
0
      if (slice_temporal_mvp_enabled_flag) {
706
0
        if (slice_type == SLICE_TYPE_B)
707
0
          collocated_from_l0_flag = br->get_bits(1);
708
0
        else
709
0
          collocated_from_l0_flag = 1;
710
711
0
        if ((collocated_from_l0_flag && num_ref_idx_l0_active > 1) ||
712
0
            (!collocated_from_l0_flag && num_ref_idx_l1_active > 1)) {
713
0
          if ((uvlc = br->get_uvlc()) == UVLC_ERROR || uvlc > 15) {
714
0
            ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
715
0
            return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
716
0
          }
717
0
          collocated_ref_idx = uvlc;
718
0
        }
719
0
        else {
720
0
          collocated_ref_idx = 0;
721
0
        }
722
723
        // check whether collocated_ref_idx points to a valid index
724
725
0
        if ((collocated_from_l0_flag && collocated_ref_idx >= num_ref_idx_l0_active) ||
726
0
            (!collocated_from_l0_flag && collocated_ref_idx >= num_ref_idx_l1_active)) {
727
0
          ctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
728
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
729
0
        }
730
0
      }
731
732
733
0
      if ((pps->weighted_pred_flag && slice_type == SLICE_TYPE_P) ||
734
0
          (pps->weighted_bipred_flag && slice_type == SLICE_TYPE_B)) {
735
0
        de265_error err = read_pred_weight_table(br, this, ctx);
736
0
        if (err) {
737
0
          ctx->add_warning(err, false);
738
0
          return err;
739
0
        }
740
0
      }
741
742
0
      if ((uvlc = br->get_uvlc()) == UVLC_ERROR || uvlc > 5) {
743
0
        ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
744
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
745
0
      }
746
747
0
      five_minus_max_num_merge_cand = uvlc;
748
0
      MaxNumMergeCand = 5 - five_minus_max_num_merge_cand;
749
0
    }
750
751
0
    if ((svlc = br->get_svlc()) == SVLC_ERROR) {
752
0
      ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
753
0
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
754
0
    }
755
756
0
    slice_qp_delta = svlc;
757
    //logtrace(LogSlice,"slice_qp_delta: %d\n",shdr->slice_qp_delta);
758
759
0
    if (pps->pps_slice_chroma_qp_offsets_present_flag) {
760
0
      if ((svlc = br->get_svlc()) == SVLC_ERROR) {
761
0
        ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
762
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
763
0
      }
764
765
0
      slice_cb_qp_offset = svlc;
766
767
0
      if ((svlc = br->get_svlc()) == SVLC_ERROR) {
768
0
        ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
769
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
770
0
      }
771
772
0
      slice_cr_qp_offset = svlc;
773
0
    }
774
0
    else {
775
0
      slice_cb_qp_offset = 0;
776
0
      slice_cr_qp_offset = 0;
777
0
    }
778
779
0
    if (pps->range_extension.chroma_qp_offset_list_enabled_flag) {
780
0
      cu_chroma_qp_offset_enabled_flag = br->get_bits(1);
781
0
    }
782
783
0
    if (pps->deblocking_filter_override_enabled_flag) {
784
0
      deblocking_filter_override_flag = br->get_bits(1);
785
0
    }
786
0
    else {
787
0
      deblocking_filter_override_flag = 0;
788
0
    }
789
790
0
    slice_beta_offset = pps->beta_offset;
791
0
    slice_tc_offset = pps->tc_offset;
792
793
0
    if (deblocking_filter_override_flag) {
794
0
      slice_deblocking_filter_disabled_flag = br->get_bits(1);
795
0
      if (!slice_deblocking_filter_disabled_flag) {
796
        // slice_beta_offset_div2 shall be in [-6, 6] (Sec. 7.4.7.1)
797
0
        if ((svlc = br->get_svlc()) == SVLC_ERROR || svlc < -6 || svlc > 6) {
798
0
          ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
799
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
800
0
        }
801
0
        slice_beta_offset = svlc * 2;
802
803
        // slice_tc_offset_div2 shall be in [-6, 6] (Sec. 7.4.7.1)
804
0
        if ((svlc = br->get_svlc()) == SVLC_ERROR || svlc < -6 || svlc > 6) {
805
0
          ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
806
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
807
0
        }
808
0
        slice_tc_offset = svlc * 2;
809
0
      }
810
0
    }
811
0
    else {
812
0
      slice_deblocking_filter_disabled_flag = pps->pic_disable_deblocking_filter_flag;
813
0
    }
814
815
0
    if (pps->pps_loop_filter_across_slices_enabled_flag &&
816
0
        (slice_sao_luma_flag || slice_sao_chroma_flag ||
817
0
         !slice_deblocking_filter_disabled_flag)) {
818
0
      slice_loop_filter_across_slices_enabled_flag = br->get_bits(1);
819
0
    }
820
0
    else {
821
0
      slice_loop_filter_across_slices_enabled_flag =
822
0
          pps->pps_loop_filter_across_slices_enabled_flag;
823
0
    }
824
0
  }
825
826
0
  if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
827
828
    // compute the spec limit for num_entry_point_offsets
829
830
0
    int maxEntryPointOffsets;
831
0
    if (!pps->tiles_enabled_flag && pps->entropy_coding_sync_enabled_flag) {
832
0
      maxEntryPointOffsets = sps->PicHeightInCtbsY - 1;
833
0
    }
834
0
    else if (pps->tiles_enabled_flag && !pps->entropy_coding_sync_enabled_flag) {
835
0
      maxEntryPointOffsets = pps->num_tile_columns * pps->num_tile_rows - 1;
836
0
    }
837
0
    else {
838
0
      maxEntryPointOffsets = pps->num_tile_columns * sps->PicHeightInCtbsY - 1;
839
0
    }
840
841
0
    if ((uvlc = br->get_uvlc()) == UVLC_ERROR ||
842
0
        uvlc > static_cast<uint32_t>(maxEntryPointOffsets)) {
843
0
      ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
844
0
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
845
0
    }
846
0
    num_entry_point_offsets = uvlc;
847
848
0
    entry_point_offset.resize(num_entry_point_offsets);
849
850
0
    if (num_entry_point_offsets > 0) {
851
0
      if ((uvlc = br->get_uvlc()) == UVLC_ERROR || uvlc > 31) {
852
0
        ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
853
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
854
0
      }
855
0
      offset_len = uvlc + 1;
856
857
0
      for (uint32_t i = 0; i < num_entry_point_offsets; i++) {
858
0
        {
859
0
          uint32_t offset_minus1 = br->get_bits(offset_len);
860
0
          if (offset_minus1 == UINT32_MAX) {
861
0
            ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
862
0
            return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
863
0
          }
864
0
          entry_point_offset[i] = offset_minus1 + 1;
865
0
        }
866
867
0
        if (i > 0) {
868
0
          if (entry_point_offset[i] > UINT32_MAX - entry_point_offset[i - 1]) {
869
0
            ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
870
0
            return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
871
0
          }
872
0
          entry_point_offset[i] += entry_point_offset[i - 1];
873
0
        }
874
0
      }
875
0
    }
876
0
  }
877
0
  else {
878
0
    num_entry_point_offsets = 0;
879
0
  }
880
881
0
  if (pps->slice_segment_header_extension_present_flag) {
882
0
    if ((uvlc = br->get_uvlc()) == UVLC_ERROR ||
883
0
        uvlc > 1000) {
884
      // TODO: safety check against too large values
885
0
      ctx->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
886
0
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
887
0
    }
888
0
    slice_segment_header_extension_length = uvlc;
889
890
0
    for (int i = 0; i < slice_segment_header_extension_length; i++) {
891
      //slice_segment_header_extension_data_byte[i]
892
0
      br->get_bits(8);
893
0
    }
894
0
  }
895
896
897
0
  compute_derived_values(pps.get());
898
899
  // SliceQpY shall be in [-QpBdOffsetY, 51] (Sec. 7.4.7.1)
900
0
  if (SliceQPY < -sps->QpBdOffset_Y || SliceQPY > 51) {
901
0
    ctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
902
0
    return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
903
0
  }
904
905
0
  *continueDecoding = true;
906
0
  return DE265_OK;
907
0
}
908
909
910
de265_error slice_segment_header::write(error_queue* errqueue, CABAC_encoder& out,
911
                                        const seq_parameter_set* sps,
912
                                        const pic_parameter_set* pps,
913
                                        uint8_t nal_unit_type)
914
0
{
915
0
  out.write_bit(first_slice_segment_in_pic_flag);
916
917
0
  if (isRapPic(nal_unit_type)) {
918
    // TODO: is this still correct ? Should we drop RapPicFlag ?
919
0
    out.write_bit(no_output_of_prior_pics_flag);
920
0
  }
921
922
0
  if (slice_pic_parameter_set_id > DE265_MAX_PPS_SETS) {
923
0
    errqueue->add_warning(DE265_WARNING_NONEXISTING_PPS_REFERENCED, false);
924
0
    return DE265_OK;
925
0
  }
926
0
  out.write_uvlc(slice_pic_parameter_set_id);
927
928
0
  if (!first_slice_segment_in_pic_flag) {
929
0
    if (pps->dependent_slice_segments_enabled_flag) {
930
0
      out.write_bit(dependent_slice_segment_flag);
931
0
    }
932
933
0
    out.write_bits(slice_segment_address, ceil_log2(sps->PicSizeInCtbsY));
934
935
0
    if (dependent_slice_segment_flag) {
936
0
      if (slice_segment_address == 0) {
937
0
        errqueue->add_warning(DE265_WARNING_DEPENDENT_SLICE_WITH_ADDRESS_ZERO, false);
938
0
        return DE265_OK;
939
0
      }
940
0
    }
941
0
  }
942
943
0
  if (slice_segment_address > sps->PicSizeInCtbsY) {
944
0
    errqueue->add_warning(DE265_WARNING_SLICE_SEGMENT_ADDRESS_INVALID, false);
945
0
    return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
946
0
  }
947
948
949
0
  if (!dependent_slice_segment_flag) {
950
0
    for (int i = 0; i < pps->num_extra_slice_header_bits; i++) {
951
      //slice_reserved_undetermined_flag[i]
952
0
      out.skip_bits(1);
953
0
    }
954
955
0
    if (slice_type > 2) {
956
0
      errqueue->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
957
0
      return DE265_OK;
958
0
    }
959
0
    out.write_uvlc(slice_type);
960
961
0
    if (pps->output_flag_present_flag) {
962
0
      out.write_bit(pic_output_flag);
963
0
    }
964
965
0
    if (sps->separate_colour_plane_flag == 1) {
966
0
      out.write_bits(colour_plane_id, 2);
967
0
    }
968
969
970
0
    int NumLtPics = 0;
971
972
0
    if (nal_unit_type != NAL_UNIT_IDR_W_RADL &&
973
0
        nal_unit_type != NAL_UNIT_IDR_N_LP) {
974
0
      out.write_bits(slice_pic_order_cnt_lsb, sps->log2_max_pic_order_cnt_lsb);
975
0
      out.write_bit(short_term_ref_pic_set_sps_flag);
976
977
0
      if (!short_term_ref_pic_set_sps_flag) {
978
        /* TODO
979
        read_short_term_ref_pic_set(ctx, sps,
980
                                    br, &slice_ref_pic_set,
981
                                    sps->num_short_term_ref_pic_sets,
982
                                    sps->ref_pic_sets,
983
                                    true);
984
        */
985
        //CurrRpsIdx = sps->num_short_term_ref_pic_sets;
986
        //CurrRps    = slice_ref_pic_set;
987
0
      }
988
0
      else {
989
0
        int nBits = ceil_log2(sps->num_short_term_ref_pic_sets());
990
0
        if (nBits > 0) out.write_bits(short_term_ref_pic_set_idx, nBits);
991
0
        else { assert(short_term_ref_pic_set_idx==0); }
992
993
0
        if (short_term_ref_pic_set_idx > sps->num_short_term_ref_pic_sets()) {
994
0
          errqueue->add_warning(DE265_WARNING_SHORT_TERM_REF_PIC_SET_OUT_OF_RANGE, false);
995
0
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
996
0
        }
997
998
        //CurrRpsIdx = short_term_ref_pic_set_idx;
999
        //CurrRps    = sps->ref_pic_sets[CurrRpsIdx];
1000
0
      }
1001
1002
1003
      // --- long-term MC ---
1004
1005
0
      if (sps->long_term_ref_pics_present_flag) {
1006
0
        if (sps->num_long_term_ref_pics_sps > 0) {
1007
0
          out.write_uvlc(num_long_term_sps);
1008
0
        }
1009
0
        else {
1010
0
          assert(num_long_term_sps == 0);
1011
0
        }
1012
1013
0
        out.write_uvlc(num_long_term_pics);
1014
1015
1016
        // check maximum number of reference frames
1017
1018
0
        if (num_long_term_sps +
1019
0
            num_long_term_pics +
1020
0
            CurrRps.NumNegativePics +
1021
0
            CurrRps.NumPositivePics
1022
0
            > sps->sps_max_dec_pic_buffering[sps->sps_max_sub_layers - 1]) {
1023
0
          errqueue->add_warning(DE265_WARNING_MAX_NUM_REF_PICS_EXCEEDED, false);
1024
0
          return DE265_OK;
1025
0
        }
1026
1027
0
        for (int i = 0; i < num_long_term_sps + num_long_term_pics; i++) {
1028
0
          if (i < num_long_term_sps) {
1029
0
            int nBits = ceil_log2(sps->num_long_term_ref_pics_sps);
1030
0
            out.write_bits(lt_idx_sps[i], nBits);
1031
1032
            // check that the referenced lt-reference really exists
1033
1034
0
            if (lt_idx_sps[i] >= sps->num_long_term_ref_pics_sps) {
1035
0
              errqueue->add_warning(DE265_NON_EXISTING_LT_REFERENCE_CANDIDATE_IN_SLICE_HEADER, false);
1036
0
              return DE265_OK;
1037
0
            }
1038
1039
            //ctx->PocLsbLt[i] = sps->lt_ref_pic_poc_lsb_sps[ lt_idx_sps[i] ];
1040
            //ctx->UsedByCurrPicLt[i] = sps->used_by_curr_pic_lt_sps_flag[ lt_idx_sps[i] ];
1041
0
          }
1042
0
          else {
1043
0
            int nBits = sps->log2_max_pic_order_cnt_lsb;
1044
0
            out.write_bits(poc_lsb_lt[i], nBits);
1045
0
            out.write_bit(used_by_curr_pic_lt_flag[i]);
1046
1047
            //ctx->PocLsbLt[i] = poc_lsb_lt[i];
1048
            //ctx->UsedByCurrPicLt[i] = used_by_curr_pic_lt_flag[i];
1049
0
          }
1050
1051
          //if (ctx->UsedByCurrPicLt[i]) {
1052
          //NumLtPics++;
1053
          //}
1054
1055
0
          out.write_bit(delta_poc_msb_present_flag[i]);
1056
0
          if (delta_poc_msb_present_flag[i]) {
1057
0
            out.write_uvlc(delta_poc_msb_cycle_lt[i]);
1058
0
          }
1059
0
          else {
1060
0
            assert(delta_poc_msb_cycle_lt[i] == 0);
1061
0
          }
1062
1063
          /*
1064
          if (i==0 || i==num_long_term_sps) {
1065
            ctx->DeltaPocMsbCycleLt[i] = delta_poc_msb_cycle_lt[i];
1066
          }
1067
          else {
1068
            ctx->DeltaPocMsbCycleLt[i] = (delta_poc_msb_cycle_lt[i] +
1069
                                          ctx->DeltaPocMsbCycleLt[i-1]);
1070
          }
1071
          */
1072
0
        }
1073
0
      }
1074
0
      else {
1075
0
        assert(num_long_term_sps == 0);
1076
0
        assert(num_long_term_pics== 0);
1077
0
      }
1078
1079
0
      if (sps->sps_temporal_mvp_enabled_flag) {
1080
0
        out.write_bit(slice_temporal_mvp_enabled_flag);
1081
0
      }
1082
0
      else {
1083
0
        assert(slice_temporal_mvp_enabled_flag == 0);
1084
0
      }
1085
0
    }
1086
0
    else {
1087
0
      assert(slice_pic_order_cnt_lsb == 0);
1088
0
      assert(num_long_term_sps == 0);
1089
0
      assert(num_long_term_pics== 0);
1090
0
    }
1091
1092
1093
    // --- SAO ---
1094
1095
0
    if (sps->sample_adaptive_offset_enabled_flag) {
1096
0
      out.write_bit(slice_sao_luma_flag);
1097
0
      out.write_bit(slice_sao_chroma_flag);
1098
0
    }
1099
0
    else {
1100
0
      assert(slice_sao_luma_flag == 0);
1101
0
      assert(slice_sao_chroma_flag== 0);
1102
0
    }
1103
1104
0
    if (slice_type == SLICE_TYPE_P ||
1105
0
        slice_type == SLICE_TYPE_B) {
1106
0
      out.write_bit(num_ref_idx_active_override_flag);
1107
1108
0
      if (num_ref_idx_active_override_flag) {
1109
0
        out.write_uvlc(num_ref_idx_l0_active);
1110
0
        num_ref_idx_l0_active++;;
1111
1112
0
        if (slice_type == SLICE_TYPE_B) {
1113
0
          out.write_uvlc(num_ref_idx_l1_active);
1114
0
          num_ref_idx_l1_active++;
1115
0
        }
1116
0
      }
1117
0
      else {
1118
0
        assert(num_ref_idx_l0_active == pps->num_ref_idx_l0_default_active);
1119
0
        assert(num_ref_idx_l1_active == pps->num_ref_idx_l1_default_active);
1120
0
      }
1121
1122
0
      NumPocTotalCurr = CurrRps.NumPocTotalCurr_shortterm_only + NumLtPics;
1123
1124
0
      if (pps->lists_modification_present_flag && NumPocTotalCurr > 1) {
1125
0
        int nBits = ceil_log2(NumPocTotalCurr);
1126
1127
0
        out.write_bit(ref_pic_list_modification_flag_l0);
1128
0
        if (ref_pic_list_modification_flag_l0) {
1129
0
          for (int i = 0; i < num_ref_idx_l0_active; i++) {
1130
0
            out.write_bits(list_entry_l0[i], nBits);
1131
0
          }
1132
0
        }
1133
1134
0
        if (slice_type == SLICE_TYPE_B) {
1135
0
          out.write_bit(ref_pic_list_modification_flag_l1);
1136
0
          if (ref_pic_list_modification_flag_l1) {
1137
0
            for (int i = 0; i < num_ref_idx_l1_active; i++) {
1138
0
              out.write_bits(list_entry_l1[i], nBits);
1139
0
            }
1140
0
          }
1141
0
        }
1142
0
        else {
1143
0
          assert(ref_pic_list_modification_flag_l1 == 0);
1144
0
        }
1145
0
      }
1146
0
      else {
1147
0
        assert(ref_pic_list_modification_flag_l0 == 0);
1148
0
        assert(ref_pic_list_modification_flag_l1 == 0);
1149
0
      }
1150
1151
0
      if (slice_type == SLICE_TYPE_B) {
1152
0
        out.write_bit(mvd_l1_zero_flag);
1153
0
      }
1154
1155
0
      if (pps->cabac_init_present_flag) {
1156
0
        out.write_bit(cabac_init_flag);
1157
0
      }
1158
0
      else {
1159
0
        assert(cabac_init_flag == 0);
1160
0
      }
1161
1162
0
      if (slice_temporal_mvp_enabled_flag) {
1163
0
        if (slice_type == SLICE_TYPE_B)
1164
0
          out.write_bit(collocated_from_l0_flag);
1165
0
        else { assert(collocated_from_l0_flag == 1); }
1166
1167
0
        if ((collocated_from_l0_flag && num_ref_idx_l0_active > 1) ||
1168
0
            (!collocated_from_l0_flag && num_ref_idx_l1_active > 1)) {
1169
0
          out.write_uvlc(collocated_ref_idx);
1170
0
        }
1171
0
        else {
1172
0
          assert(collocated_ref_idx == 0);
1173
0
        }
1174
0
      }
1175
1176
0
      if ((pps->weighted_pred_flag && slice_type == SLICE_TYPE_P) ||
1177
0
          (pps->weighted_bipred_flag && slice_type == SLICE_TYPE_B)) {
1178
0
        assert(0);
1179
        /* TODO
1180
        if (read_pred_weight_table(br,this,ctx) != DE265_OK)
1181
          {
1182
      ctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
1183
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
1184
          }
1185
        */
1186
0
      }
1187
1188
0
      out.write_uvlc(five_minus_max_num_merge_cand);
1189
      //MaxNumMergeCand = 5-five_minus_max_num_merge_cand;
1190
0
    }
1191
1192
0
    out.write_svlc(slice_qp_delta);
1193
1194
0
    if (pps->pps_slice_chroma_qp_offsets_present_flag) {
1195
0
      out.write_svlc(slice_cb_qp_offset);
1196
0
      out.write_svlc(slice_cr_qp_offset);
1197
0
    }
1198
0
    else {
1199
0
      assert(slice_cb_qp_offset == 0);
1200
0
      assert(slice_cr_qp_offset == 0);
1201
0
    }
1202
1203
0
    if (pps->deblocking_filter_override_enabled_flag) {
1204
0
      out.write_bit(deblocking_filter_override_flag);
1205
0
    }
1206
0
    else {
1207
0
      assert(deblocking_filter_override_flag == 0);
1208
0
    }
1209
1210
    //slice_beta_offset = pps->beta_offset;
1211
    //slice_tc_offset   = pps->tc_offset;
1212
1213
0
    if (deblocking_filter_override_flag) {
1214
0
      out.write_bit(slice_deblocking_filter_disabled_flag);
1215
0
      if (!slice_deblocking_filter_disabled_flag) {
1216
0
        out.write_svlc(slice_beta_offset / 2);
1217
0
        out.write_svlc(slice_tc_offset / 2);
1218
0
      }
1219
0
    }
1220
0
    else {
1221
0
      assert(slice_deblocking_filter_disabled_flag == pps->pic_disable_deblocking_filter_flag);
1222
0
    }
1223
1224
0
    if (pps->pps_loop_filter_across_slices_enabled_flag &&
1225
0
        (slice_sao_luma_flag || slice_sao_chroma_flag ||
1226
0
         !slice_deblocking_filter_disabled_flag)) {
1227
0
      out.write_bit(slice_loop_filter_across_slices_enabled_flag);
1228
0
    }
1229
0
    else {
1230
0
      assert(slice_loop_filter_across_slices_enabled_flag ==
1231
0
             pps->pps_loop_filter_across_slices_enabled_flag);
1232
0
    }
1233
0
  }
1234
1235
0
  if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
1236
0
    out.write_uvlc(num_entry_point_offsets);
1237
1238
0
    if (num_entry_point_offsets > 0) {
1239
0
      out.write_uvlc(offset_len - 1);
1240
1241
0
      for (uint32_t i = 0; i < num_entry_point_offsets; i++) {
1242
0
        {
1243
0
          uint32_t prev = 0;
1244
0
          if (i > 0) prev = entry_point_offset[i - 1];
1245
0
          out.write_bits(entry_point_offset[i] - prev - 1, offset_len);
1246
0
        }
1247
0
      }
1248
0
    }
1249
0
  }
1250
0
  else {
1251
0
    assert(num_entry_point_offsets == 0);
1252
0
  }
1253
1254
0
  if (pps->slice_segment_header_extension_present_flag) {
1255
0
    out.write_uvlc(slice_segment_header_extension_length);
1256
0
    if (slice_segment_header_extension_length > 1000) {
1257
      // TODO: safety check against too large values
1258
0
      errqueue->add_warning(DE265_WARNING_SLICEHEADER_INVALID, false);
1259
0
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
1260
0
    }
1261
1262
0
    for (int i = 0; i < slice_segment_header_extension_length; i++) {
1263
      //slice_segment_header_extension_data_byte[i]
1264
0
      out.skip_bits(8);
1265
0
    }
1266
0
  }
1267
1268
0
  return DE265_OK;
1269
0
}
1270
1271
void slice_segment_header::compute_derived_values(const pic_parameter_set* pps)
1272
0
{
1273
  // --- init variables ---
1274
1275
0
  SliceQPY = pps->pic_init_qp + slice_qp_delta;
1276
1277
0
  switch (slice_type) {
1278
0
    case SLICE_TYPE_I: initType = 0;
1279
0
      break;
1280
0
    case SLICE_TYPE_P: initType = cabac_init_flag + 1;
1281
0
      break;
1282
0
    case SLICE_TYPE_B: initType = 2 - cabac_init_flag;
1283
0
      break;
1284
0
  }
1285
1286
0
  MaxNumMergeCand = 5 - five_minus_max_num_merge_cand;
1287
0
}
1288
1289
1290
//-----------------------------------------------------------------------
1291
1292
1293
void slice_segment_header::dump_slice_segment_header(const decoder_context* ctx, int fd) const
1294
0
{
1295
0
  FILE* fh;
1296
0
  if (fd == 1) fh = stdout;
1297
0
  else if (fd == 2) fh = stderr;
1298
0
  else { return; }
1299
1300
0
#define LOG0(t) log2fh(fh, t)
1301
0
#define LOG1(t,d) log2fh(fh, t,d)
1302
0
#define LOG2(t,d1,d2) log2fh(fh, t,d1,d2)
1303
0
#define LOG3(t,d1,d2,d3) log2fh(fh, t,d1,d2,d3)
1304
0
#define LOG4(t,d1,d2,d3,d4) log2fh(fh, t,d1,d2,d3,d4)
1305
1306
0
  LOG0("----------------- SLICE -----------------\n");
1307
1308
0
  const pic_parameter_set* pps = ctx->get_pps(slice_pic_parameter_set_id);
1309
0
  if (!pps) {
1310
0
    LOG0("invalid PPS referenced\n");
1311
0
    return;
1312
0
  }
1313
0
  assert(pps->pps_read); // TODO: error handling
1314
1315
0
  const seq_parameter_set* sps = ctx->get_sps((int) pps->seq_parameter_set_id);
1316
0
  if (!sps) {
1317
0
    LOG0("invalid SPS referenced\n");
1318
0
    return;
1319
0
  }
1320
0
  assert(sps->sps_read); // TODO: error handling
1321
1322
1323
0
  LOG1("first_slice_segment_in_pic_flag      : %d\n", first_slice_segment_in_pic_flag);
1324
0
  if (ctx->get_nal_unit_type() >= NAL_UNIT_BLA_W_LP &&
1325
0
      ctx->get_nal_unit_type() <= NAL_UNIT_RESERVED_IRAP_VCL23) {
1326
0
    LOG1("no_output_of_prior_pics_flag         : %d\n", no_output_of_prior_pics_flag);
1327
0
  }
1328
1329
0
  LOG1("slice_pic_parameter_set_id           : %d\n", slice_pic_parameter_set_id);
1330
1331
0
  if (!first_slice_segment_in_pic_flag) {
1332
    //if (pps->dependent_slice_segments_enabled_flag) {
1333
0
    LOG1("dependent_slice_segment_flag         : %d\n", dependent_slice_segment_flag);
1334
    //}
1335
0
    LOG1("slice_segment_address                : %d\n", slice_segment_address);
1336
0
  }
1337
1338
  //if (!dependent_slice_segment_flag)
1339
0
  {
1340
    //for (int i=0; i<pps->num_extra_slice_header_bits; i++) {
1341
    //slice_reserved_flag[i]
1342
1343
0
    LOG1("slice_type                           : %c\n",
1344
0
         slice_type == 0 ? 'B' :
1345
0
         slice_type == 1 ? 'P' : 'I');
1346
1347
0
    if (pps->output_flag_present_flag) {
1348
0
      LOG1("pic_output_flag                      : %d\n", pic_output_flag);
1349
0
    }
1350
1351
0
    if (sps->separate_colour_plane_flag == 1) {
1352
0
      LOG1("colour_plane_id                      : %d\n", colour_plane_id);
1353
0
    }
1354
1355
0
    LOG1("slice_pic_order_cnt_lsb              : %d\n", slice_pic_order_cnt_lsb);
1356
1357
0
    if (ctx->get_nal_unit_type() != NAL_UNIT_IDR_W_RADL &&
1358
0
        ctx->get_nal_unit_type() != NAL_UNIT_IDR_N_LP) {
1359
0
      LOG1("short_term_ref_pic_set_sps_flag      : %d\n", short_term_ref_pic_set_sps_flag);
1360
1361
0
      if (!short_term_ref_pic_set_sps_flag) {
1362
0
        LOG1("ref_pic_set[ %2d ]: ", sps->num_short_term_ref_pic_sets());
1363
0
        dump_compact_short_term_ref_pic_set(&slice_ref_pic_set, 16, fh);
1364
0
      }
1365
0
      else if (sps->num_short_term_ref_pic_sets() > 1) {
1366
0
        LOG1("short_term_ref_pic_set_idx           : %d\n", short_term_ref_pic_set_idx);
1367
0
        dump_compact_short_term_ref_pic_set(&sps->ref_pic_sets[short_term_ref_pic_set_idx], 16, fh);
1368
0
      }
1369
1370
0
      if (sps->long_term_ref_pics_present_flag) {
1371
0
        if (sps->num_long_term_ref_pics_sps > 0) {
1372
0
          LOG1("num_long_term_sps                        : %d\n", num_long_term_sps);
1373
0
        }
1374
1375
0
        LOG1("num_long_term_pics                       : %d\n", num_long_term_pics);
1376
1377
#if 0
1378
        for (int i = 0; i < num_long_term_sps + num_long_term_pics; i++) {
1379
          LOG2("PocLsbLt[%d]            : %d\n", i, ctx->PocLsbLt[i]);
1380
          LOG2("UsedByCurrPicLt[%d]     : %d\n", i, ctx->UsedByCurrPicLt[i]);
1381
          LOG2("DeltaPocMsbCycleLt[%d]  : %d\n", i, ctx->DeltaPocMsbCycleLt[i]);
1382
        }
1383
#endif
1384
0
      }
1385
1386
0
      if (sps->sps_temporal_mvp_enabled_flag) {
1387
0
        LOG1("slice_temporal_mvp_enabled_flag : %d\n", slice_temporal_mvp_enabled_flag);
1388
0
      }
1389
0
    }
1390
1391
1392
0
    if (sps->sample_adaptive_offset_enabled_flag) {
1393
0
      LOG1("slice_sao_luma_flag             : %d\n", slice_sao_luma_flag);
1394
0
      LOG1("slice_sao_chroma_flag           : %d\n", slice_sao_chroma_flag);
1395
0
    }
1396
1397
1398
0
    if (slice_type == SLICE_TYPE_P || slice_type == SLICE_TYPE_B) {
1399
0
      LOG1("num_ref_idx_active_override_flag : %d\n", num_ref_idx_active_override_flag);
1400
1401
0
      LOG2("num_ref_idx_l0_active          : %d %s\n", num_ref_idx_l0_active,
1402
0
           num_ref_idx_active_override_flag ? "" : "(from PPS)");
1403
1404
0
      if (slice_type == SLICE_TYPE_B) {
1405
0
        LOG2("num_ref_idx_l1_active          : %d %s\n", num_ref_idx_l1_active,
1406
0
             num_ref_idx_active_override_flag ? "" : "(from PPS)");
1407
0
      }
1408
1409
0
      if (pps->lists_modification_present_flag && NumPocTotalCurr > 1) {
1410
0
        LOG1("ref_pic_list_modification_flag_l0 : %d\n", ref_pic_list_modification_flag_l0);
1411
0
        if (ref_pic_list_modification_flag_l0) {
1412
0
          for (int i = 0; i < num_ref_idx_l0_active; i++) {
1413
0
            LOG2("  %d: %d\n", i, list_entry_l0[i]);
1414
0
          }
1415
0
        }
1416
1417
0
        LOG1("ref_pic_list_modification_flag_l1 : %d\n", ref_pic_list_modification_flag_l1);
1418
0
        if (ref_pic_list_modification_flag_l1) {
1419
0
          for (int i = 0; i < num_ref_idx_l1_active; i++) {
1420
0
            LOG2("  %d: %d\n", i, list_entry_l1[i]);
1421
0
          }
1422
0
        }
1423
0
      }
1424
1425
0
      if (slice_type == SLICE_TYPE_B) {
1426
0
        LOG1("mvd_l1_zero_flag               : %d\n", mvd_l1_zero_flag);
1427
0
      }
1428
1429
0
      LOG1("cabac_init_flag                : %d\n", cabac_init_flag);
1430
1431
0
      if (slice_temporal_mvp_enabled_flag) {
1432
0
        LOG1("collocated_from_l0_flag        : %d\n", collocated_from_l0_flag);
1433
0
        LOG1("collocated_ref_idx             : %d\n", collocated_ref_idx);
1434
0
      }
1435
1436
0
      if ((pps->weighted_pred_flag && slice_type == SLICE_TYPE_P) ||
1437
0
          (pps->weighted_bipred_flag && slice_type == SLICE_TYPE_B)) {
1438
0
        LOG1("luma_log2_weight_denom         : %d\n", luma_log2_weight_denom);
1439
0
        if (sps->chroma_format_idc != 0) {
1440
0
          LOG1("ChromaLog2WeightDenom          : %d\n", ChromaLog2WeightDenom);
1441
0
        }
1442
1443
0
        for (int l = 0; l <= 1; l++)
1444
0
          if (l == 0 || (l == 1 && slice_type == SLICE_TYPE_B)) {
1445
0
            int num_ref = (l == 0 ? num_ref_idx_l0_active - 1 : num_ref_idx_l1_active - 1);
1446
1447
0
            if (false) {
1448
              // do not show these flags
1449
0
              for (int i = 0; i <= num_ref; i++) {
1450
0
                LOG3("luma_weight_flag_l%d[%d]        : %d\n", l, i, luma_weight_flag[l][i]);
1451
0
              }
1452
1453
0
              if (sps->chroma_format_idc != 0) {
1454
0
                for (int i = 0; i <= num_ref; i++) {
1455
0
                  LOG3("chroma_weight_flag_l%d[%d]      : %d\n", l, i, chroma_weight_flag[l][i]);
1456
0
                }
1457
0
              }
1458
0
            }
1459
1460
0
            for (int i = 0; i <= num_ref; i++) {
1461
0
              LOG3("LumaWeight_L%d[%d]             : %d\n", l, i, LumaWeight[l][i]);
1462
0
              LOG3("luma_offset_l%d[%d]            : %d\n", l, i, luma_offset[l][i]);
1463
1464
0
              for (int j = 0; j < 2; j++) {
1465
0
                LOG4("ChromaWeight_L%d[%d][%d]        : %d\n", l, i, j, ChromaWeight[l][i][j]);
1466
0
                LOG4("ChromaOffset_L%d[%d][%d]        : %d\n", l, i, j, ChromaOffset[l][i][j]);
1467
0
              }
1468
0
            }
1469
0
          }
1470
0
      }
1471
1472
0
      LOG1("five_minus_max_num_merge_cand  : %d\n", five_minus_max_num_merge_cand);
1473
0
    }
1474
1475
1476
0
    LOG1("slice_qp_delta         : %d\n", slice_qp_delta);
1477
0
    if (pps->pps_slice_chroma_qp_offsets_present_flag) {
1478
0
      LOG1("slice_cb_qp_offset     : %d\n", slice_cb_qp_offset);
1479
0
      LOG1("slice_cr_qp_offset     : %d\n", slice_cr_qp_offset);
1480
0
    }
1481
1482
0
    if (pps->deblocking_filter_override_enabled_flag) {
1483
0
      LOG1("deblocking_filter_override_flag : %d\n", deblocking_filter_override_flag);
1484
0
    }
1485
1486
0
    LOG2("slice_deblocking_filter_disabled_flag : %d %s\n",
1487
0
         slice_deblocking_filter_disabled_flag,
1488
0
         (deblocking_filter_override_flag ? "(override)" : "(from pps)"));
1489
1490
0
    if (deblocking_filter_override_flag) {
1491
0
      if (!slice_deblocking_filter_disabled_flag) {
1492
0
        LOG1("slice_beta_offset  : %d\n", slice_beta_offset);
1493
0
        LOG1("slice_tc_offset    : %d\n", slice_tc_offset);
1494
0
      }
1495
0
    }
1496
1497
0
    if (pps->pps_loop_filter_across_slices_enabled_flag &&
1498
0
        (slice_sao_luma_flag || slice_sao_chroma_flag ||
1499
0
         !slice_deblocking_filter_disabled_flag)) {
1500
0
      LOG1("slice_loop_filter_across_slices_enabled_flag : %d\n",
1501
0
           slice_loop_filter_across_slices_enabled_flag);
1502
0
    }
1503
0
  }
1504
1505
0
  if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
1506
0
    LOG1("num_entry_point_offsets    : %d\n", num_entry_point_offsets);
1507
1508
0
    if (num_entry_point_offsets > 0) {
1509
0
      LOG1("offset_len                 : %d\n", offset_len);
1510
1511
0
      for (uint32_t i = 0; i < num_entry_point_offsets; i++) {
1512
0
        LOG2("entry point [%i] : %d\n", i, entry_point_offset[i]);
1513
0
      }
1514
0
    }
1515
0
  }
1516
1517
  /*
1518
    if( slice_segment_header_extension_present_flag ) {
1519
    slice_segment_header_extension_length
1520
    for( i = 0; i < slice_segment_header_extension_length; i++)
1521
    slice_segment_header_extension_data_byte[i]
1522
    }
1523
    byte_alignment()
1524
    }
1525
  */
1526
1527
0
#undef LOG0
1528
0
#undef LOG1
1529
0
#undef LOG2
1530
0
#undef LOG3
1531
0
#undef LOG4
1532
  //#endif
1533
0
}
1534
1535
1536
void initialize_CABAC_models(thread_context* tctx)
1537
0
{
1538
0
  const int QPY = tctx->shdr->SliceQPY;
1539
0
  const int initType = tctx->shdr->initType;
1540
0
  assert(initType >= 0 && initType <= 2);
1541
1542
0
  tctx->ctx_model.init(initType, QPY);
1543
1544
0
  for (int i = 0; i < 4; i++) {
1545
0
    tctx->StatCoeff[i] = 0;
1546
0
  }
1547
0
}
1548
1549
1550
static int decode_transform_skip_flag(thread_context* tctx, int cIdx)
1551
0
{
1552
0
  const int context = (cIdx == 0) ? 0 : 1;
1553
1554
0
  logtrace(LogSlice, "# transform_skip_flag (context=%d)\n", context);
1555
1556
0
  int bit = tctx->cabac_decoder.decode_bit(
1557
0
                             &tctx->ctx_model[CONTEXT_MODEL_TRANSFORM_SKIP_FLAG + context]);
1558
1559
0
  logtrace(LogSymbols, "$1 transform_skip_flag=%d\n", bit);
1560
1561
0
  return bit;
1562
0
}
1563
1564
1565
static int decode_sao_merge_flag(thread_context* tctx)
1566
0
{
1567
0
  logtrace(LogSlice, "# sao_merge_left/up_flag\n");
1568
0
  int bit = tctx->cabac_decoder.decode_bit(
1569
0
                             &tctx->ctx_model[CONTEXT_MODEL_SAO_MERGE_FLAG]);
1570
1571
0
  logtrace(LogSymbols, "$1 sao_merge_flag=%d\n", bit);
1572
1573
0
  return bit;
1574
0
}
1575
1576
1577
static uint8_t decode_sao_type_idx(thread_context* tctx)
1578
0
{
1579
0
  logtrace(LogSlice, "# sao_type_idx_luma/chroma\n");
1580
1581
0
  int bit0 = tctx->cabac_decoder.decode_bit(
1582
0
                              &tctx->ctx_model[CONTEXT_MODEL_SAO_TYPE_IDX]);
1583
1584
0
  if (bit0 == 0) {
1585
0
    logtrace(LogSymbols, "$1 sao_type_idx=%d\n", 0);
1586
0
    return 0;
1587
0
  }
1588
0
  else {
1589
0
    int bit1 = tctx->cabac_decoder.decode_bypass();
1590
0
    if (bit1 == 0) {
1591
0
      logtrace(LogSymbols, "$1 sao_type_idx=%d\n", 1);
1592
0
      return 1;
1593
0
    }
1594
0
    else {
1595
0
      logtrace(LogSymbols, "$1 sao_type_idx=%d\n", 2);
1596
0
      return 2;
1597
0
    }
1598
0
  }
1599
0
}
1600
1601
1602
static uint8_t decode_sao_offset_abs(thread_context* tctx, int bitDepth)
1603
0
{
1604
0
  logtrace(LogSlice, "# sao_offset_abs\n");
1605
0
  int cMax = (1 << (std::min(bitDepth, 10) - 5)) - 1;
1606
0
  assert(cMax >= 7 && cMax<=31);
1607
0
  uint8_t value = static_cast<uint8_t>(tctx->cabac_decoder.decode_TU_bypass( cMax));
1608
0
  logtrace(LogSymbols, "$1 sao_offset_abs=%d\n", value);
1609
0
  return value;
1610
0
}
1611
1612
1613
static int decode_sao_class(thread_context* tctx)
1614
0
{
1615
0
  logtrace(LogSlice, "# sao_class\n");
1616
0
  int value = tctx->cabac_decoder.decode_FL_bypass( 2);
1617
0
  logtrace(LogSymbols, "$1 sao_class=%d\n", value);
1618
0
  return value;
1619
0
}
1620
1621
1622
static int decode_sao_offset_sign(thread_context* tctx)
1623
0
{
1624
0
  logtrace(LogSlice, "# sao_offset_sign\n");
1625
0
  int value = tctx->cabac_decoder.decode_bypass();
1626
0
  logtrace(LogSymbols, "$1 sao_offset_sign=%d\n", value);
1627
0
  return value;
1628
0
}
1629
1630
1631
static int decode_sao_band_position(thread_context* tctx)
1632
0
{
1633
0
  logtrace(LogSlice, "# sao_band_position\n");
1634
0
  int value = tctx->cabac_decoder.decode_FL_bypass( 5);
1635
0
  logtrace(LogSymbols, "$1 sao_band_position=%d\n", value);
1636
0
  return value;
1637
0
}
1638
1639
1640
static int decode_transquant_bypass_flag(thread_context* tctx)
1641
0
{
1642
0
  logtrace(LogSlice, "# cu_transquant_bypass_enable_flag\n");
1643
0
  int value = tctx->cabac_decoder.decode_bit(
1644
0
                               &tctx->ctx_model[CONTEXT_MODEL_CU_TRANSQUANT_BYPASS_FLAG]);
1645
0
  logtrace(LogSymbols, "$1 transquant_bypass_flag=%d\n", value);
1646
0
  return value;
1647
0
}
1648
1649
1650
#include <sys/types.h>
1651
#include <signal.h>
1652
1653
static int decode_split_cu_flag(thread_context* tctx,
1654
                                int x0, int y0, int ctDepth)
1655
0
{
1656
  // check if neighbors are available
1657
1658
0
  int availableL = check_CTB_available(tctx->img, x0, y0, x0 - 1, y0);
1659
0
  int availableA = check_CTB_available(tctx->img, x0, y0, x0, y0 - 1);
1660
1661
0
  int condL = 0;
1662
0
  int condA = 0;
1663
1664
0
  if (availableL && tctx->img->get_ctDepth(x0 - 1, y0) > ctDepth) condL = 1;
1665
0
  if (availableA && tctx->img->get_ctDepth(x0, y0 - 1) > ctDepth) condA = 1;
1666
1667
0
  int contextOffset = condL + condA;
1668
0
  int context = contextOffset;
1669
1670
  // decode bit
1671
1672
0
  logtrace(LogSlice, "# split_cu_flag context=%d R=%x\n", context, tctx->cabac_decoder.range);
1673
1674
0
  int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_SPLIT_CU_FLAG + context]);
1675
1676
0
  logtrace(LogSlice, "> split_cu_flag R=%x, ctx=%d, bit=%d\n", tctx->cabac_decoder.range, context, bit);
1677
1678
0
  logtrace(LogSymbols, "$1 split_cu_flag=%d\n", bit);
1679
1680
0
  return bit;
1681
0
}
1682
1683
1684
static int decode_cu_skip_flag(thread_context* tctx,
1685
                               int x0, int y0, int ctDepth)
1686
0
{
1687
  // check if neighbors are available
1688
1689
0
  int availableL = check_CTB_available(tctx->img, x0, y0, x0 - 1, y0);
1690
0
  int availableA = check_CTB_available(tctx->img, x0, y0, x0, y0 - 1);
1691
1692
0
  int condL = 0;
1693
0
  int condA = 0;
1694
1695
0
  if (availableL && tctx->img->get_cu_skip_flag(x0 - 1, y0)) condL = 1;
1696
0
  if (availableA && tctx->img->get_cu_skip_flag(x0, y0 - 1)) condA = 1;
1697
1698
0
  int contextOffset = condL + condA;
1699
0
  int context = contextOffset;
1700
1701
  // decode bit
1702
1703
0
  logtrace(LogSlice, "# cu_skip_flag context=%d R=%x\n", context, tctx->cabac_decoder.range);
1704
1705
0
  int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_CU_SKIP_FLAG + context]);
1706
1707
0
  logtrace(LogSlice, "> cu_skip_flag R=%x, ctx=%d, bit=%d\n", tctx->cabac_decoder.range, context, bit);
1708
1709
0
  logtrace(LogSymbols, "$1 cu_skip_flag=%d\n", bit);
1710
1711
0
  return bit;
1712
0
}
1713
1714
1715
static enum PartMode decode_part_mode(thread_context* tctx,
1716
                                      enum PredMode pred_mode, int cLog2CbSize)
1717
0
{
1718
0
  de265_image* img = tctx->img;
1719
1720
0
  if (pred_mode == MODE_INTRA) {
1721
0
    logtrace(LogSlice, "# part_mode (INTRA)\n");
1722
1723
0
    int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_PART_MODE]);
1724
1725
0
    logtrace(LogSlice, "> %s\n", bit ? "2Nx2N" : "NxN");
1726
1727
0
    logtrace(LogSymbols, "$1 part_mode=%d\n", bit ? PART_2Nx2N : PART_NxN);
1728
1729
0
    return bit ? PART_2Nx2N : PART_NxN;
1730
0
  }
1731
0
  else {
1732
0
    const seq_parameter_set& sps = img->get_sps();
1733
1734
0
    int bit0 = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_PART_MODE + 0]);
1735
0
    if (bit0) {
1736
0
      logtrace(LogSymbols, "$1 part_mode=%d\n", PART_2Nx2N);
1737
0
      return PART_2Nx2N;
1738
0
    }
1739
1740
    // CHECK_ME: I optimize code and fix bug here, need more VERIFY!
1741
0
    int bit1 = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_PART_MODE + 1]);
1742
0
    if (cLog2CbSize > sps.Log2MinCbSizeY) {
1743
0
      if (!sps.amp_enabled_flag) {
1744
0
        logtrace(LogSymbols, "$1 part_mode=%d\n", bit1 ? PART_2NxN : PART_Nx2N);
1745
0
        return bit1 ? PART_2NxN : PART_Nx2N;
1746
0
      }
1747
0
      else {
1748
0
        int bit3 = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_PART_MODE + 3]);
1749
0
        if (bit3) {
1750
0
          logtrace(LogSymbols, "$1 part_mode=%d\n", bit1 ? PART_2NxN : PART_Nx2N);
1751
0
          return bit1 ? PART_2NxN : PART_Nx2N;
1752
0
        }
1753
1754
0
        int bit4 = tctx->cabac_decoder.decode_bypass();
1755
0
        if (bit1 && bit4) {
1756
0
          logtrace(LogSymbols, "$1 part_mode=%d\n", PART_2NxnD);
1757
0
          return PART_2NxnD;
1758
0
        }
1759
0
        if (bit1 && !bit4) {
1760
0
          logtrace(LogSymbols, "$1 part_mode=%d\n", PART_2NxnU);
1761
0
          return PART_2NxnU;
1762
0
        }
1763
0
        if (!bit1 && !bit4) {
1764
0
          logtrace(LogSymbols, "$1 part_mode=%d\n", PART_nLx2N);
1765
0
          return PART_nLx2N;
1766
0
        }
1767
0
        if (!bit1 && bit4) {
1768
0
          logtrace(LogSymbols, "$1 part_mode=%d\n", PART_nRx2N);
1769
0
          return PART_nRx2N;
1770
0
        }
1771
0
      }
1772
0
    }
1773
0
    else {
1774
      // TODO, we could save one if here when first decoding the next bin and then
1775
      // checkcLog2CbSize==3 when it is '0'
1776
1777
0
      if (bit1) {
1778
0
        logtrace(LogSymbols, "$1 part_mode=%d\n", PART_2NxN);
1779
0
        return PART_2NxN;
1780
0
      }
1781
1782
0
      if (cLog2CbSize == 3) {
1783
0
        logtrace(LogSymbols, "$1 part_mode=%d\n", PART_Nx2N);
1784
0
        return PART_Nx2N;
1785
0
      }
1786
0
      else {
1787
0
        int bit2 = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_PART_MODE + 2]);
1788
0
        logtrace(LogSymbols, "$1 part_mode=%d\n", PART_NxN - bit2);
1789
0
        return (enum PartMode) ((int) PART_NxN - bit2)/*bit2 ? PART_Nx2N : PART_NxN*/;
1790
0
      }
1791
0
    }
1792
0
  }
1793
1794
0
  assert(false); // should never be reached
1795
0
  return PART_2Nx2N;
1796
0
}
1797
1798
1799
static inline int decode_prev_intra_luma_pred_flag(thread_context* tctx)
1800
0
{
1801
0
  logtrace(LogSlice, "# prev_intra_luma_pred_flag\n");
1802
0
  int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_PREV_INTRA_LUMA_PRED_FLAG]);
1803
0
  logtrace(LogSymbols, "$1 prev_intra_luma_pred_flag=%d\n", bit);
1804
0
  return bit;
1805
0
}
1806
1807
1808
static inline int decode_mpm_idx(thread_context* tctx)
1809
0
{
1810
0
  logtrace(LogSlice, "# mpm_idx (TU:2)\n");
1811
0
  int mpm = tctx->cabac_decoder.decode_TU_bypass( 2);
1812
0
  logtrace(LogSlice, "> mpm_idx = %d\n", mpm);
1813
0
  logtrace(LogSymbols, "$1 mpm_idx=%d\n", mpm);
1814
0
  return mpm;
1815
0
}
1816
1817
1818
static inline int decode_rem_intra_luma_pred_mode(thread_context* tctx)
1819
0
{
1820
0
  logtrace(LogSlice, "# rem_intra_luma_pred_mode (5 bits)\n");
1821
0
  int value = tctx->cabac_decoder.decode_FL_bypass( 5);
1822
0
  logtrace(LogSymbols, "$1 rem_intra_luma_pred_mode=%d\n", value);
1823
0
  return value;
1824
0
}
1825
1826
1827
static int decode_intra_chroma_pred_mode(thread_context* tctx)
1828
0
{
1829
0
  logtrace(LogSlice, "# intra_chroma_pred_mode\n");
1830
1831
0
  int prefix = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_INTRA_CHROMA_PRED_MODE]);
1832
1833
0
  int mode;
1834
0
  if (prefix == 0) {
1835
0
    mode = 4;
1836
0
  }
1837
0
  else {
1838
0
    mode = tctx->cabac_decoder.decode_FL_bypass( 2);
1839
0
  }
1840
1841
0
  logtrace(LogSlice, "> intra_chroma_pred_mode = %d\n", mode);
1842
0
  logtrace(LogSymbols, "$1 intra_chroma_pred_mode=%d\n", mode);
1843
1844
0
  return mode;
1845
0
}
1846
1847
1848
static int decode_split_transform_flag(thread_context* tctx,
1849
                                       int log2TrafoSize)
1850
0
{
1851
0
  logtrace(LogSlice, "# split_transform_flag (log2TrafoSize=%d)\n", log2TrafoSize);
1852
1853
0
  int context = 5 - log2TrafoSize;
1854
0
  assert(context >= 0 && context <= 2);
1855
1856
0
  logtrace(LogSlice, "# context: %d\n", context);
1857
1858
0
  int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_SPLIT_TRANSFORM_FLAG + context]);
1859
0
  logtrace(LogSymbols, "$1 split_transform_flag=%d\n", bit);
1860
0
  return bit;
1861
0
}
1862
1863
1864
static int decode_cbf_chroma(thread_context* tctx,
1865
                             int trafoDepth)
1866
0
{
1867
0
  logtrace(LogSlice, "# cbf_chroma\n");
1868
1869
0
  int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_CBF_CHROMA + trafoDepth]);
1870
1871
0
  logtrace(LogSymbols, "$1 cbf_chroma=%d\n", bit);
1872
0
  return bit;
1873
0
}
1874
1875
1876
static int decode_cbf_luma(thread_context* tctx,
1877
                           int trafoDepth)
1878
0
{
1879
0
  logtrace(LogSlice, "# cbf_luma\n");
1880
1881
0
  int bit = tctx->cabac_decoder.decode_bit( &tctx->ctx_model[CONTEXT_MODEL_CBF_LUMA + (trafoDepth == 0)]);
1882
1883
0
  logtrace(LogSlice, "> cbf_luma = %d\n", bit);
1884
1885
0
  logtrace(LogSymbols, "$1 cbf_luma=%d\n", bit);
1886
0
  return bit;
1887
0
}
1888
1889
1890
static inline int decode_coded_sub_block_flag(thread_context* tctx,
1891
                                              int cIdx,
1892
                                              uint8_t coded_sub_block_neighbors)
1893
0
{
1894
0
  logtrace(LogSlice, "# coded_sub_block_flag\n");
1895
1896
  // tricky computation of csbfCtx
1897
0
  int csbfCtx = ((coded_sub_block_neighbors & 1) | // right neighbor set  or
1898
0
                 (coded_sub_block_neighbors >> 1)); // bottom neighbor set   -> csbfCtx=1
1899
1900
0
  int ctxIdxInc = csbfCtx;
1901
0
  if (cIdx != 0) {
1902
0
    ctxIdxInc += 2;
1903
0
  }
1904
1905
0
  int bit = tctx->cabac_decoder.decode_bit(
1906
0
                             &tctx->ctx_model[CONTEXT_MODEL_CODED_SUB_BLOCK_FLAG + ctxIdxInc]);
1907
1908
0
  logtrace(LogSymbols, "$1 coded_sub_block_flag=%d\n", bit);
1909
0
  return bit;
1910
0
}
1911
1912
1913
static const uint8_t CABAC_QP_DELTA_ABS_ERROR = 0xFF;
1914
1915
static uint8_t decode_cu_qp_delta_abs(thread_context* tctx)
1916
0
{
1917
0
  logtrace(LogSlice, "# cu_qp_delta_abs\n");
1918
1919
0
  int bit = tctx->cabac_decoder.decode_bit(
1920
0
                             &tctx->ctx_model[CONTEXT_MODEL_CU_QP_DELTA_ABS + 0]);
1921
0
  if (bit == 0) {
1922
0
    logtrace(LogSymbols, "$1 cu_qp_delta_abs=%d\n", 0);
1923
0
    return 0;
1924
0
  }
1925
1926
0
  uint8_t prefix = 1;
1927
0
  for (uint8_t i = 0; i < 4; i++) {
1928
0
    bit = tctx->cabac_decoder.decode_bit(
1929
0
                           &tctx->ctx_model[CONTEXT_MODEL_CU_QP_DELTA_ABS + 1]);
1930
0
    if (bit == 0) { break; }
1931
0
    else { prefix++; }
1932
0
  }
1933
1934
0
  if (prefix == 5) {
1935
0
    uint32_t value = tctx->cabac_decoder.decode_EGk_bypass( 0);
1936
0
    if (value >= 250) { return CABAC_QP_DELTA_ABS_ERROR; }
1937
0
    logtrace(LogSymbols, "$1 cu_qp_delta_abs=%d\n", value + 5);
1938
0
    return value + 5;
1939
0
  }
1940
0
  else {
1941
0
    logtrace(LogSymbols, "$1 cu_qp_delta_abs=%d\n", prefix);
1942
0
    return prefix;
1943
0
  }
1944
0
}
1945
1946
1947
static int decode_last_significant_coeff_prefix(thread_context* tctx,
1948
                                                int log2TrafoSize,
1949
                                                int cIdx,
1950
                                                context_model* model)
1951
0
{
1952
0
  logtrace(LogSlice, "# last_significant_coeff_prefix log2TrafoSize:%d cIdx:%d\n", log2TrafoSize, cIdx);
1953
1954
0
  int cMax = (log2TrafoSize << 1) - 1;
1955
1956
0
  int ctxOffset, ctxShift;
1957
0
  if (cIdx == 0) {
1958
0
    ctxOffset = 3 * (log2TrafoSize - 2) + ((log2TrafoSize - 1) >> 2);
1959
0
    ctxShift = (log2TrafoSize + 1) >> 2;
1960
0
  }
1961
0
  else {
1962
0
    ctxOffset = 15;
1963
0
    ctxShift = log2TrafoSize - 2;
1964
0
  }
1965
1966
0
  int binIdx;
1967
0
  int value = cMax;
1968
0
  for (binIdx = 0; binIdx < cMax; binIdx++) {
1969
0
    int ctxIdxInc = (binIdx >> ctxShift);
1970
1971
0
    logtrace(LogSlice, "context: %d+%d\n", ctxOffset, ctxIdxInc);
1972
1973
0
    int bit = tctx->cabac_decoder.decode_bit( &model[ctxOffset + ctxIdxInc]);
1974
0
    if (bit == 0) {
1975
0
      value = binIdx;
1976
0
      break;
1977
0
    }
1978
0
  }
1979
1980
0
  logtrace(LogSlice, "> last_significant_coeff_prefix: %d\n", value);
1981
1982
0
  return value;
1983
0
}
1984
1985
1986
static const uint8_t ctxIdxMap[16] = {
1987
  0, 1, 4, 5,
1988
  2, 3, 4, 5,
1989
  6, 6, 8, 8,
1990
  7, 7, 8, 99
1991
};
1992
1993
uint8_t* ctxIdxLookup[4 /* 4-log2-32 */][2 /* !!cIdx */][2 /* !!scanIdx */][4 /* prevCsbf */];
1994
1995
bool alloc_and_init_significant_coeff_ctxIdx_lookupTable()
1996
2
{
1997
2
  int tableSize = 4 * 4 * (2) + 8 * 8 * (2 * 2 * 4) + 16 * 16 * (2 * 4) + 32 * 32 * (2 * 4);
1998
1999
2
  uint8_t* p = (uint8_t*) malloc(tableSize);
2000
2
  if (p == nullptr) {
2001
0
    return false;
2002
0
  }
2003
2004
2
  memset(p, 0xFF, tableSize); // just for debugging
2005
2006
2007
  // --- Set pointers to memory areas. Note that some parameters share the same memory. ---
2008
2009
  // 4x4
2010
2011
6
  for (int cIdx = 0; cIdx < 2; cIdx++) {
2012
12
    for (int scanIdx = 0; scanIdx < 2; scanIdx++)
2013
40
      for (int prevCsbf = 0; prevCsbf < 4; prevCsbf++)
2014
32
        ctxIdxLookup[0][cIdx][scanIdx][prevCsbf] = p;
2015
2016
4
    p += 4 * 4;
2017
4
  }
2018
2019
  // 8x8
2020
2021
6
  for (int cIdx = 0; cIdx < 2; cIdx++)
2022
12
    for (int scanIdx = 0; scanIdx < 2; scanIdx++)
2023
40
      for (int prevCsbf = 0; prevCsbf < 4; prevCsbf++) {
2024
32
        ctxIdxLookup[1][cIdx][scanIdx][prevCsbf] = p;
2025
32
        p += 8 * 8;
2026
32
      }
2027
2028
  // 16x16
2029
2030
6
  for (int cIdx = 0; cIdx < 2; cIdx++)
2031
20
    for (int prevCsbf = 0; prevCsbf < 4; prevCsbf++) {
2032
48
      for (int scanIdx = 0; scanIdx < 2; scanIdx++) {
2033
32
        ctxIdxLookup[2][cIdx][scanIdx][prevCsbf] = p;
2034
32
      }
2035
2036
16
      p += 16 * 16;
2037
16
    }
2038
2039
  // 32x32
2040
2041
6
  for (int cIdx = 0; cIdx < 2; cIdx++)
2042
20
    for (int prevCsbf = 0; prevCsbf < 4; prevCsbf++) {
2043
48
      for (int scanIdx = 0; scanIdx < 2; scanIdx++) {
2044
32
        ctxIdxLookup[3][cIdx][scanIdx][prevCsbf] = p;
2045
32
      }
2046
2047
16
      p += 32 * 32;
2048
16
    }
2049
2050
2051
  // --- precompute ctxIdx tables ---
2052
2053
10
  for (int log2w = 2; log2w <= 5; log2w++)
2054
24
    for (int cIdx = 0; cIdx < 2; cIdx++)
2055
48
      for (int scanIdx = 0; scanIdx < 2; scanIdx++)
2056
160
        for (int prevCsbf = 0; prevCsbf < 4; prevCsbf++) {
2057
2.04k
          for (int yC = 0; yC < (1 << log2w); yC++)
2058
45.4k
            for (int xC = 0; xC < (1 << log2w); xC++) {
2059
43.5k
              int w = 1 << log2w;
2060
43.5k
              int sbWidth = w >> 2;
2061
2062
43.5k
              int sigCtx;
2063
2064
              // if log2TrafoSize==2
2065
43.5k
              if (sbWidth == 1) {
2066
512
                sigCtx = ctxIdxMap[(yC << 2) + xC];
2067
512
              }
2068
43.0k
              else if (xC + yC == 0) {
2069
96
                sigCtx = 0;
2070
96
              }
2071
42.9k
              else {
2072
42.9k
                int xS = xC >> 2;
2073
42.9k
                int yS = yC >> 2;
2074
                /*
2075
                  int prevCsbf = 0;
2076
2077
                  if (xS < sbWidth-1) { prevCsbf += coded_sub_block_flag[xS+1  +yS*sbWidth];    }
2078
                  if (yS < sbWidth-1) { prevCsbf += coded_sub_block_flag[xS+(1+yS)*sbWidth]<<1; }
2079
                */
2080
42.9k
                int xP = xC & 3;
2081
42.9k
                int yP = yC & 3;
2082
2083
                //logtrace(LogSlice,"posInSubset: %d,%d\n",xP,yP);
2084
                //logtrace(LogSlice,"prevCsbf: %d\n",prevCsbf);
2085
2086
42.9k
                switch (prevCsbf) {
2087
10.7k
                  case 0:
2088
10.7k
                    sigCtx = (xP + yP >= 3) ? 0 : (xP + yP > 0) ? 1 : 2;
2089
10.7k
                    break;
2090
10.7k
                  case 1:
2091
10.7k
                    sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1 : 0;
2092
10.7k
                    break;
2093
10.7k
                  case 2:
2094
10.7k
                    sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1 : 0;
2095
10.7k
                    break;
2096
10.7k
                  default:
2097
10.7k
                    sigCtx = 2;
2098
10.7k
                    break;
2099
42.9k
                }
2100
2101
                //logtrace(LogSlice,"a) sigCtx=%d\n",sigCtx);
2102
2103
42.9k
                if (cIdx == 0) {
2104
21.4k
                  if (xS + yS > 0) sigCtx += 3;
2105
2106
                  //logtrace(LogSlice,"b) sigCtx=%d\n",sigCtx);
2107
2108
                  // if log2TrafoSize==3
2109
21.4k
                  if (sbWidth == 2) {
2110
                    // 8x8 block
2111
1.00k
                    sigCtx += (scanIdx == 0) ? 9 : 15;
2112
1.00k
                  }
2113
20.4k
                  else {
2114
20.4k
                    sigCtx += 21;
2115
20.4k
                  }
2116
2117
                  //logtrace(LogSlice,"c) sigCtx=%d\n",sigCtx);
2118
21.4k
                }
2119
21.4k
                else {
2120
                  // if log2TrafoSize==3
2121
21.4k
                  if (sbWidth == 2) {
2122
                    // 8x8 block
2123
1.00k
                    sigCtx += 9;
2124
1.00k
                  }
2125
20.4k
                  else {
2126
20.4k
                    sigCtx += 12;
2127
20.4k
                  }
2128
21.4k
                }
2129
42.9k
              }
2130
2131
43.5k
              int ctxIdxInc;
2132
43.5k
              if (cIdx == 0) { ctxIdxInc = sigCtx; }
2133
21.7k
              else { ctxIdxInc = 27 + sigCtx; }
2134
2135
43.5k
              if (ctxIdxLookup[log2w - 2][cIdx][scanIdx][prevCsbf][xC + (yC << log2w)] != 0xFF) {
2136
20.9k
                assert(ctxIdxLookup[log2w-2][cIdx][scanIdx][prevCsbf][xC+(yC<<log2w)] == ctxIdxInc);
2137
20.9k
              }
2138
2139
43.5k
              ctxIdxLookup[log2w - 2][cIdx][scanIdx][prevCsbf][xC + (yC << log2w)] = ctxIdxInc;
2140
2141
              //NOTE: when using this option, we have to include all three scanIdx in the table
2142
              //ctxIdxLookup[log2w-2][cIdx][scanIdx][prevCsbf][s] = ctxIdxInc;
2143
43.5k
            }
2144
128
        }
2145
2146
2
  return true;
2147
2
}
2148
2149
2150
bool alloc_and_init_significant_coeff_ctxIdx_lookupTable_OLD()
2151
0
{
2152
0
  int tableSize = 2 * 2 * 4 * (4 * 4 + 8 * 8 + 16 * 16 + 32 * 32);
2153
0
  uint8_t* p = (uint8_t*) malloc(tableSize);
2154
0
  if (p == nullptr) {
2155
0
    return false;
2156
0
  }
2157
2158
0
  for (int log2w = 2; log2w <= 5; log2w++)
2159
0
    for (int cIdx = 0; cIdx < 2; cIdx++)
2160
0
      for (int scanIdx = 0; scanIdx < 2; scanIdx++)
2161
0
        for (int prevCsbf = 0; prevCsbf < 4; prevCsbf++) {
2162
          // assign pointer into reserved memory area
2163
2164
0
          ctxIdxLookup[log2w - 2][cIdx][scanIdx][prevCsbf] = p;
2165
0
          p += (1 << log2w) * (1 << log2w);
2166
2167
0
          const position* ScanOrderSub = get_scan_order(log2w - 2, scanIdx);
2168
0
          const position* ScanOrderPos = get_scan_order(2, scanIdx);
2169
2170
          //for (int yC=0;yC<(1<<log2w);yC++)
2171
          // for (int xC=0;xC<(1<<log2w);xC++)
2172
0
          for (int s = 0; s < (1 << log2w) * (1 << log2w); s++) {
2173
0
            position S = ScanOrderSub[s >> 4];
2174
0
            int x0 = S.x << 2;
2175
0
            int y0 = S.y << 2;
2176
2177
0
            int subX = ScanOrderPos[s & 0xF].x;
2178
0
            int subY = ScanOrderPos[s & 0xF].y;
2179
0
            int xC = x0 + subX;
2180
0
            int yC = y0 + subY;
2181
2182
2183
0
            int w = 1 << log2w;
2184
0
            int sbWidth = w >> 2;
2185
2186
0
            int sigCtx;
2187
2188
            // if log2TrafoSize==2
2189
0
            if (sbWidth == 1) {
2190
0
              sigCtx = ctxIdxMap[(yC << 2) + xC];
2191
0
            }
2192
0
            else if (xC + yC == 0) {
2193
0
              sigCtx = 0;
2194
0
            }
2195
0
            else {
2196
0
              int xS = xC >> 2;
2197
0
              int yS = yC >> 2;
2198
              /*
2199
                int prevCsbf = 0;
2200
2201
                if (xS < sbWidth-1) { prevCsbf += coded_sub_block_flag[xS+1  +yS*sbWidth];    }
2202
                if (yS < sbWidth-1) { prevCsbf += coded_sub_block_flag[xS+(1+yS)*sbWidth]<<1; }
2203
              */
2204
0
              int xP = xC & 3;
2205
0
              int yP = yC & 3;
2206
2207
0
              logtrace(LogSlice, "posInSubset: %d,%d\n", xP, yP);
2208
0
              logtrace(LogSlice, "prevCsbf: %d\n", prevCsbf);
2209
2210
              //printf("%d | %d %d\n",prevCsbf,xP,yP);
2211
2212
0
              switch (prevCsbf) {
2213
0
                case 0:
2214
                  //sigCtx = (xP+yP==0) ? 2 : (xP+yP<3) ? 1 : 0;
2215
0
                  sigCtx = (xP + yP >= 3) ? 0 : (xP + yP > 0) ? 1 : 2;
2216
0
                  break;
2217
0
                case 1:
2218
0
                  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1 : 0;
2219
0
                  break;
2220
0
                case 2:
2221
0
                  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1 : 0;
2222
0
                  break;
2223
0
                default:
2224
0
                  sigCtx = 2;
2225
0
                  break;
2226
0
              }
2227
2228
0
              logtrace(LogSlice, "a) sigCtx=%d\n", sigCtx);
2229
2230
0
              if (cIdx == 0) {
2231
0
                if (xS + yS > 0) sigCtx += 3;
2232
2233
0
                logtrace(LogSlice, "b) sigCtx=%d\n", sigCtx);
2234
2235
                // if log2TrafoSize==3
2236
0
                if (sbWidth == 2) {
2237
                  // 8x8 block
2238
0
                  sigCtx += (scanIdx == 0) ? 9 : 15;
2239
0
                }
2240
0
                else {
2241
0
                  sigCtx += 21;
2242
0
                }
2243
2244
0
                logtrace(LogSlice, "c) sigCtx=%d\n", sigCtx);
2245
0
              }
2246
0
              else {
2247
                // if log2TrafoSize==3
2248
0
                if (sbWidth == 2) {
2249
                  // 8x8 block
2250
0
                  sigCtx += 9;
2251
0
                }
2252
0
                else {
2253
0
                  sigCtx += 12;
2254
0
                }
2255
0
              }
2256
0
            }
2257
2258
0
            int ctxIdxInc;
2259
0
            if (cIdx == 0) { ctxIdxInc = sigCtx; }
2260
0
            else { ctxIdxInc = 27 + sigCtx; }
2261
2262
2263
0
            ctxIdxLookup[log2w - 2][cIdx][scanIdx][prevCsbf][xC + (yC << log2w)] = ctxIdxInc;
2264
2265
            //NOTE: when using this option, we have to include all three scanIdx in the table
2266
            //ctxIdxLookup[log2w-2][cIdx][scanIdx][prevCsbf][s] = ctxIdxInc;
2267
0
          }
2268
0
        }
2269
2270
0
  return true;
2271
0
}
2272
2273
void free_significant_coeff_ctxIdx_lookupTable()
2274
0
{
2275
0
  free(ctxIdxLookup[0][0][0][0]);
2276
0
  ctxIdxLookup[0][0][0][0] = nullptr;
2277
0
}
2278
2279
2280
#if 0
2281
static int decode_significant_coeff_flag(thread_context* tctx,
2282
                                         int xC, int yC,
2283
                                         const uint8_t* coded_sub_block_flag,
2284
                                         int sbWidth,
2285
                                         int cIdx,
2286
                                         int scanIdx)
2287
{
2288
  logtrace(LogSlice, "# significant_coeff_flag (xC:%d yC:%d sbWidth:%d cIdx:%d scanIdx:%d)\n",
2289
           xC, yC, sbWidth, cIdx, scanIdx);
2290
2291
  int sigCtx;
2292
2293
  // if log2TrafoSize==2
2294
  if (sbWidth == 1) {
2295
    sigCtx = ctxIdxMap[(yC << 2) + xC];
2296
  }
2297
  else if (xC + yC == 0) {
2298
    sigCtx = 0;
2299
  }
2300
  else {
2301
    int xS = xC >> 2;
2302
    int yS = yC >> 2;
2303
    int prevCsbf = 0;
2304
    if (xS < sbWidth - 1) { prevCsbf += coded_sub_block_flag[xS + 1 + yS * sbWidth]; }
2305
    if (yS < sbWidth - 1) { prevCsbf += coded_sub_block_flag[xS + (1 + yS) * sbWidth] << 1; }
2306
2307
    int xP = xC & 3;
2308
    int yP = yC & 3;
2309
2310
    logtrace(LogSlice, "posInSubset: %d,%d\n", xP, yP);
2311
    logtrace(LogSlice, "prevCsbf: %d\n", prevCsbf);
2312
2313
    //printf("%d | %d %d\n",prevCsbf,xP,yP);
2314
2315
    switch (prevCsbf) {
2316
      case 0:
2317
        //sigCtx = (xP+yP==0) ? 2 : (xP+yP<3) ? 1 : 0;
2318
        sigCtx = (xP + yP >= 3) ? 0 : (xP + yP > 0) ? 1 : 2;
2319
        break;
2320
      case 1:
2321
        sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1 : 0;
2322
        break;
2323
      case 2:
2324
        sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1 : 0;
2325
        break;
2326
      default:
2327
        sigCtx = 2;
2328
        break;
2329
    }
2330
2331
    logtrace(LogSlice, "a) sigCtx=%d\n", sigCtx);
2332
2333
    if (cIdx == 0) {
2334
      if (xS + yS > 0) sigCtx += 3;
2335
2336
      logtrace(LogSlice, "b) sigCtx=%d\n", sigCtx);
2337
2338
      // if log2TrafoSize==3
2339
      if (sbWidth == 2) {
2340
        sigCtx += (scanIdx == 0) ? 9 : 15;
2341
      }
2342
      else {
2343
        sigCtx += 21;
2344
      }
2345
2346
      logtrace(LogSlice, "c) sigCtx=%d\n", sigCtx);
2347
    }
2348
    else {
2349
      // if log2TrafoSize==3
2350
      if (sbWidth == 2) {
2351
        sigCtx += 9;
2352
      }
2353
      else {
2354
        sigCtx += 12;
2355
      }
2356
    }
2357
  }
2358
2359
  int ctxIdxInc;
2360
  if (cIdx == 0) { ctxIdxInc = sigCtx; }
2361
  else { ctxIdxInc = 27 + sigCtx; }
2362
2363
  int context = tctx->shdr->initType * 42 + ctxIdxInc;
2364
  logtrace(LogSlice, "context: %d\n", context);
2365
2366
  int bit = tctx->cabac_decoder.decode_bit(
2367
                             &tctx->ctx_model[CONTEXT_MODEL_SIGNIFICANT_COEFF_FLAG + context]);
2368
  return bit;
2369
}
2370
#endif
2371
2372
2373
static inline int decode_significant_coeff_flag_lookup(thread_context* tctx,
2374
                                                       uint8_t ctxIdxInc)
2375
0
{
2376
0
  logtrace(LogSlice, "# significant_coeff_flag\n");
2377
0
  logtrace(LogSlice, "context: %d\n", ctxIdxInc);
2378
2379
0
  int bit = tctx->cabac_decoder.decode_bit(
2380
0
                             &tctx->ctx_model[CONTEXT_MODEL_SIGNIFICANT_COEFF_FLAG + ctxIdxInc]);
2381
2382
0
  logtrace(LogSymbols, "$1 significant_coeff_flag=%d\n", bit);
2383
2384
0
  return bit;
2385
0
}
2386
2387
2388
static inline int decode_coeff_abs_level_greater1(thread_context* tctx,
2389
                                                  int cIdx, int i,
2390
                                                  bool firstCoeffInSubblock,
2391
                                                  bool firstSubblock,
2392
                                                  int lastSubblock_greater1Ctx,
2393
                                                  int* lastInvocation_greater1Ctx,
2394
                                                  int* lastInvocation_coeff_abs_level_greater1_flag,
2395
                                                  int* lastInvocation_ctxSet, int c1)
2396
0
{
2397
0
  logtrace(LogSlice, "# coeff_abs_level_greater1\n");
2398
2399
0
  logtrace(LogSlice, "  cIdx:%d i:%d firstCoeffInSB:%d firstSB:%d lastSB>1:%d last>1Ctx:%d lastLev>1:%d lastCtxSet:%d\n", cIdx, i, firstCoeffInSubblock, firstSubblock, lastSubblock_greater1Ctx,
2400
0
           *lastInvocation_greater1Ctx,
2401
0
           *lastInvocation_coeff_abs_level_greater1_flag,
2402
0
           *lastInvocation_ctxSet);
2403
2404
0
  int lastGreater1Ctx;
2405
0
  int greater1Ctx;
2406
0
  int ctxSet;
2407
2408
0
  logtrace(LogSlice, "c1: %d\n", c1);
2409
2410
0
  if (firstCoeffInSubblock) {
2411
    // block with real DC -> ctx 0
2412
0
    if (i == 0 || cIdx > 0) { ctxSet = 0; }
2413
0
    else { ctxSet = 2; }
2414
2415
0
    if (firstSubblock) { lastGreater1Ctx = 1; }
2416
0
    else { lastGreater1Ctx = lastSubblock_greater1Ctx; }
2417
2418
0
    if (lastGreater1Ctx == 0) { ctxSet++; }
2419
2420
0
    logtrace(LogSlice, "ctxSet: %d\n", ctxSet);
2421
2422
0
    greater1Ctx = 1;
2423
0
  }
2424
0
  else {
2425
    // !firstCoeffInSubblock
2426
0
    ctxSet = *lastInvocation_ctxSet;
2427
0
    logtrace(LogSlice, "ctxSet (old): %d\n", ctxSet);
2428
2429
0
    greater1Ctx = *lastInvocation_greater1Ctx;
2430
0
    if (greater1Ctx > 0) {
2431
0
      int lastGreater1Flag = *lastInvocation_coeff_abs_level_greater1_flag;
2432
0
      if (lastGreater1Flag == 1) greater1Ctx = 0;
2433
0
      else {
2434
        /*if (greater1Ctx>0)*/
2435
0
        greater1Ctx++;
2436
0
      }
2437
0
    }
2438
0
  }
2439
2440
0
  ctxSet = c1; // use HM algo
2441
2442
0
  int ctxIdxInc = (ctxSet * 4) + (greater1Ctx >= 3 ? 3 : greater1Ctx);
2443
2444
0
  if (cIdx > 0) { ctxIdxInc += 16; }
2445
2446
0
  int bit = tctx->cabac_decoder.decode_bit(
2447
0
                             &tctx->ctx_model[CONTEXT_MODEL_COEFF_ABS_LEVEL_GREATER1_FLAG + ctxIdxInc]);
2448
2449
0
  *lastInvocation_greater1Ctx = greater1Ctx;
2450
0
  *lastInvocation_coeff_abs_level_greater1_flag = bit;
2451
0
  *lastInvocation_ctxSet = ctxSet;
2452
2453
  //logtrace(LogSymbols,"$1 coeff_abs_level_greater1=%d\n",bit);
2454
2455
0
  return bit;
2456
0
}
2457
2458
2459
static int decode_coeff_abs_level_greater2(thread_context* tctx,
2460
                                           int cIdx, // int i,int n,
2461
                                           int ctxSet)
2462
0
{
2463
0
  logtrace(LogSlice, "# coeff_abs_level_greater2\n");
2464
2465
0
  int ctxIdxInc = ctxSet;
2466
2467
0
  if (cIdx > 0) ctxIdxInc += 4;
2468
2469
0
  int bit = tctx->cabac_decoder.decode_bit(
2470
0
                             &tctx->ctx_model[CONTEXT_MODEL_COEFF_ABS_LEVEL_GREATER2_FLAG + ctxIdxInc]);
2471
2472
0
  logtrace(LogSymbols, "$1 coeff_abs_level_greater2=%d\n", bit);
2473
2474
0
  return bit;
2475
0
}
2476
2477
2478
0
#define MAX_PREFIX (15+3)
2479
2480
// Defensive bounds against non-conforming bitstreams. The spec (eq. 9-25 / 9-23) does
2481
// not impose an explicit upper bound on cRiceParam or StatCoeff in the persistent-rice
2482
// path, but a malformed stream can push them arbitrarily high. We clamp so that the
2483
// signed-int shift expressions in residual_coding stay well-defined:
2484
//   - 3 * (1 << uiGoRiceParam) requires uiGoRiceParam <= 29 (else int32 overflow)
2485
//   - 3 << (StatCoeff/4)       requires StatCoeff/4   <= 29 (same)
2486
0
#define MAX_RICE_PARAM 29
2487
0
#define MAX_STAT_COEFF (4 * MAX_RICE_PARAM + 3)  // 119: largest value with /4 <= 29
2488
2489
static int32_t decode_coeff_abs_level_remaining(thread_context* tctx,
2490
                                                int cRiceParam)
2491
0
{
2492
0
  logtrace(LogSlice, "# decode_coeff_abs_level_remaining\n");
2493
2494
0
  uint32_t prefix = 0;
2495
0
  while (tctx->cabac_decoder.decode_bypass()) {
2496
0
    prefix++;
2497
0
    if (prefix > MAX_PREFIX) {
2498
0
      return 0; // TODO: error
2499
0
    }
2500
0
  }
2501
2502
  // prefix = nb. 1 bits
2503
2504
0
  int32_t value;
2505
2506
0
  if (prefix <= 3) {
2507
    // when code only TR part (level < TRMax)
2508
2509
0
    int codeword = tctx->cabac_decoder.decode_FL_bypass( cRiceParam);
2510
0
    value = (prefix << cRiceParam) + codeword;
2511
0
  }
2512
0
  else {
2513
    // Suffix coded with EGk. Note that the unary part of EGk is already
2514
    // included in the 'prefix' counter above.
2515
2516
0
    int codeword = tctx->cabac_decoder.decode_FL_bypass( prefix - 3 + cRiceParam);
2517
0
    value = (((UINT32_C(1) << (prefix - 3)) + 3 - 1) << cRiceParam) + codeword;
2518
0
  }
2519
2520
0
  logtrace(LogSymbols, "$1 coeff_abs_level_remaining=%d\n", value);
2521
2522
0
  return value;
2523
0
}
2524
2525
2526
static int decode_merge_flag(thread_context* tctx)
2527
0
{
2528
0
  logtrace(LogSlice, "# merge_flag\n");
2529
2530
0
  int bit = tctx->cabac_decoder.decode_bit(
2531
0
                             &tctx->ctx_model[CONTEXT_MODEL_MERGE_FLAG]);
2532
2533
0
  logtrace(LogSymbols, "$1 merge_flag=%d\n", bit);
2534
2535
0
  return bit;
2536
0
}
2537
2538
2539
static int decode_merge_idx(thread_context* tctx)
2540
0
{
2541
0
  logtrace(LogSlice, "# merge_idx\n");
2542
2543
0
  if (tctx->shdr->MaxNumMergeCand <= 1) {
2544
0
    logtrace(LogSymbols, "$1 merge_idx=%d\n", 0);
2545
0
    return 0;
2546
0
  }
2547
2548
  // TU coding, first bin is CABAC, remaining are bypass.
2549
  // cMax = MaxNumMergeCand-1
2550
2551
0
  int idx = tctx->cabac_decoder.decode_bit(
2552
0
                             &tctx->ctx_model[CONTEXT_MODEL_MERGE_IDX]);
2553
2554
0
  if (idx == 0) {
2555
    // nothing
2556
0
  }
2557
0
  else {
2558
0
    idx = 1;
2559
2560
0
    while (idx < tctx->shdr->MaxNumMergeCand - 1) {
2561
0
      if (tctx->cabac_decoder.decode_bypass()) {
2562
0
        idx++;
2563
0
      }
2564
0
      else {
2565
0
        break;
2566
0
      }
2567
0
    }
2568
0
  }
2569
2570
0
  logtrace(LogSlice, "> merge_idx = %d\n", idx);
2571
0
  logtrace(LogSymbols, "$1 merge_idx=%d\n", idx);
2572
2573
0
  return idx;
2574
0
}
2575
2576
2577
static int decode_pred_mode_flag(thread_context* tctx)
2578
0
{
2579
0
  logtrace(LogSlice, "# pred_mode_flag\n");
2580
2581
0
  int bit = tctx->cabac_decoder.decode_bit(
2582
0
                             &tctx->ctx_model[CONTEXT_MODEL_PRED_MODE_FLAG]);
2583
2584
0
  logtrace(LogSymbols, "$1 pred_mode=%d\n", bit);
2585
0
  return bit;
2586
0
}
2587
2588
static int decode_mvp_lx_flag(thread_context* tctx)
2589
0
{
2590
0
  logtrace(LogSlice, "# mvp_lx_flag\n");
2591
2592
0
  int bit = tctx->cabac_decoder.decode_bit(
2593
0
                             &tctx->ctx_model[CONTEXT_MODEL_MVP_LX_FLAG]);
2594
2595
0
  logtrace(LogSymbols, "$1 mvp_lx_flag=%d\n", bit);
2596
0
  return bit;
2597
0
}
2598
2599
static int decode_rqt_root_cbf(thread_context* tctx)
2600
0
{
2601
0
  logtrace(LogSlice, "# rqt_root_cbf\n");
2602
2603
0
  int bit = tctx->cabac_decoder.decode_bit(
2604
0
                             &tctx->ctx_model[CONTEXT_MODEL_RQT_ROOT_CBF]);
2605
2606
0
  logtrace(LogSymbols, "$1 rqt_root_cbf=%d\n", bit);
2607
0
  return bit;
2608
0
}
2609
2610
static int decode_ref_idx_lX(thread_context* tctx, int numRefIdxLXActive)
2611
0
{
2612
  // prevent endless loop when 'numRefIdxLXActive' is invalid
2613
0
  if (numRefIdxLXActive <= 1) {
2614
0
    return 0;
2615
0
  }
2616
2617
0
  logtrace(LogSlice, "# ref_idx_lX\n");
2618
2619
0
  int cMax = numRefIdxLXActive - 1;
2620
2621
0
  if (cMax == 0) {
2622
0
    logtrace(LogSlice, "> ref_idx = 0 (cMax==0)\n");
2623
0
    return 0;
2624
0
  } // do check for single reference frame here
2625
2626
0
  int bit = tctx->cabac_decoder.decode_bit(
2627
0
                             &tctx->ctx_model[CONTEXT_MODEL_REF_IDX_LX + 0]);
2628
2629
0
  int idx = 0;
2630
2631
0
  while (bit) {
2632
0
    idx++;
2633
0
    if (idx == cMax) { break; }
2634
2635
0
    if (idx == 1) {
2636
0
      bit = tctx->cabac_decoder.decode_bit(
2637
0
                             &tctx->ctx_model[CONTEXT_MODEL_REF_IDX_LX + 1]);
2638
0
    }
2639
0
    else {
2640
0
      bit = tctx->cabac_decoder.decode_bypass();
2641
0
    }
2642
0
  }
2643
2644
0
  logtrace(LogSlice, "> ref_idx = %d\n", idx);
2645
2646
0
  logtrace(LogSymbols, "$1 ref_idx_lX=%d\n", idx);
2647
0
  return idx;
2648
0
}
2649
2650
2651
static enum InterPredIdc decode_inter_pred_idc(thread_context* tctx,
2652
                                               int x0, int y0,
2653
                                               int nPbW, int nPbH,
2654
                                               int ctDepth)
2655
0
{
2656
0
  logtrace(LogSlice, "# inter_pred_idc\n");
2657
2658
0
  int value;
2659
2660
0
  context_model* model = &tctx->ctx_model[CONTEXT_MODEL_INTER_PRED_IDC];
2661
2662
0
  if (nPbW + nPbH == 12) {
2663
0
    value = tctx->cabac_decoder.decode_bit(
2664
0
                             &model[4]);
2665
0
  }
2666
0
  else {
2667
0
    int bit0 = tctx->cabac_decoder.decode_bit(
2668
0
                                &model[ctDepth]);
2669
0
    if (bit0 == 0) {
2670
0
      value = tctx->cabac_decoder.decode_bit(
2671
0
                               &model[4]);
2672
0
    }
2673
0
    else {
2674
0
      value = 2;
2675
0
    }
2676
0
  }
2677
2678
0
  logtrace(LogSlice, "> inter_pred_idc = %d (%s)\n", value,
2679
0
           value == 0 ? "L0" : (value == 1 ? "L1" : "BI"));
2680
2681
0
  logtrace(LogSymbols, "$1 decode_inter_pred_idx=%d\n", value + 1);
2682
2683
0
  return (enum InterPredIdc) (value + 1);
2684
0
}
2685
2686
2687
static int decode_explicit_rdpcm_flag(thread_context* tctx, int cIdx)
2688
0
{
2689
0
  context_model* model = &tctx->ctx_model[CONTEXT_MODEL_RDPCM_FLAG];
2690
0
  int value = tctx->cabac_decoder.decode_bit( &model[cIdx ? 1 : 0]);
2691
0
  return value;
2692
0
}
2693
2694
2695
static int decode_explicit_rdpcm_dir(thread_context* tctx, int cIdx)
2696
0
{
2697
0
  context_model* model = &tctx->ctx_model[CONTEXT_MODEL_RDPCM_DIR];
2698
0
  int value = tctx->cabac_decoder.decode_bit( &model[cIdx ? 1 : 0]);
2699
0
  return value;
2700
0
}
2701
2702
2703
/* Take CtbAddrInTS and compute
2704
   -> CtbAddrInRS, CtbX, CtbY
2705
 */
2706
bool setCtbAddrFromTS(thread_context* tctx)
2707
0
{
2708
0
  const seq_parameter_set& sps = tctx->img->get_sps();
2709
2710
0
  if (tctx->CtbAddrInTS < sps.PicSizeInCtbsY) {
2711
0
    tctx->CtbAddrInRS = tctx->img->get_pps().scan->CtbAddrTStoRS[tctx->CtbAddrInTS];
2712
2713
0
    tctx->CtbX = tctx->CtbAddrInRS % sps.PicWidthInCtbsY;
2714
0
    tctx->CtbY = tctx->CtbAddrInRS / sps.PicWidthInCtbsY;
2715
0
    return false;
2716
0
  }
2717
0
  else {
2718
0
    tctx->CtbAddrInRS = sps.PicSizeInCtbsY;
2719
2720
0
    tctx->CtbX = tctx->CtbAddrInRS % sps.PicWidthInCtbsY;
2721
0
    tctx->CtbY = tctx->CtbAddrInRS / sps.PicWidthInCtbsY;
2722
0
    return true;
2723
0
  }
2724
0
}
2725
2726
// returns true when we reached the end of the image (ctbAddr==picSizeInCtbsY)
2727
bool advanceCtbAddr(thread_context* tctx)
2728
0
{
2729
0
  tctx->CtbAddrInTS++;
2730
2731
0
  return setCtbAddrFromTS(tctx);
2732
0
}
2733
2734
2735
void read_sao(thread_context* tctx, int xCtb, int yCtb,
2736
              int CtbAddrInSliceSeg)
2737
0
{
2738
0
  slice_segment_header* shdr = tctx->shdr;
2739
0
  de265_image* img = tctx->img;
2740
0
  const seq_parameter_set& sps = img->get_sps();
2741
0
  const pic_parameter_set& pps = img->get_pps();
2742
2743
0
  logtrace(LogSlice, "# read_sao(%d,%d)\n", xCtb, yCtb);
2744
2745
0
  sao_info saoinfo;
2746
0
  memset(&saoinfo, 0, sizeof(sao_info));
2747
0
  logtrace(LogSlice, "sizeof saoinfo: %d\n", sizeof(sao_info));
2748
2749
2750
0
  char sao_merge_left_flag = 0;
2751
0
  char sao_merge_up_flag = 0;
2752
2753
0
  if (xCtb > 0) {
2754
    //char leftCtbInSliceSeg = (CtbAddrInSliceSeg>0);
2755
0
    char leftCtbInSliceSeg = (tctx->CtbAddrInRS > shdr->SliceAddrRS);
2756
0
    char leftCtbInTile = (pps.scan->TileIdRS[xCtb + yCtb * sps.PicWidthInCtbsY] ==
2757
0
                          pps.scan->TileIdRS[xCtb - 1 + yCtb * sps.PicWidthInCtbsY]);
2758
2759
0
    if (leftCtbInSliceSeg && leftCtbInTile) {
2760
0
      sao_merge_left_flag = decode_sao_merge_flag(tctx);
2761
0
      logtrace(LogSlice, "sao_merge_left_flag: %d\n", sao_merge_left_flag);
2762
0
    }
2763
0
  }
2764
2765
0
  if (yCtb > 0 && sao_merge_left_flag == 0) {
2766
0
    logtrace(LogSlice, "CtbAddrInRS:%d PicWidthInCtbsY:%d slice_segment_address:%d\n",
2767
0
             tctx->CtbAddrInRS,
2768
0
             sps.PicWidthInCtbsY,
2769
0
             shdr->slice_segment_address);
2770
0
    bool upCtbInSliceSeg = (tctx->CtbAddrInRS - sps.PicWidthInCtbsY) >= shdr->SliceAddrRS;
2771
0
    bool upCtbInTile = (pps.scan->TileIdRS[xCtb + yCtb * sps.PicWidthInCtbsY] ==
2772
0
                        pps.scan->TileIdRS[xCtb + (yCtb - 1) * sps.PicWidthInCtbsY]);
2773
2774
0
    if (upCtbInSliceSeg && upCtbInTile) {
2775
0
      sao_merge_up_flag = decode_sao_merge_flag(tctx);
2776
0
      logtrace(LogSlice, "sao_merge_up_flag: %d\n", sao_merge_up_flag);
2777
0
    }
2778
0
  }
2779
2780
0
  if (!sao_merge_up_flag && !sao_merge_left_flag) {
2781
0
    int nChroma = 3;
2782
0
    if (sps.ChromaArrayType == CHROMA_MONO) nChroma = 1;
2783
2784
0
    for (int cIdx = 0; cIdx < nChroma; cIdx++) {
2785
0
      if ((shdr->slice_sao_luma_flag && cIdx == 0) ||
2786
0
          (shdr->slice_sao_chroma_flag && cIdx > 0)) {
2787
0
        uint8_t SaoTypeIdx = 0;
2788
2789
0
        if (cIdx == 0) {
2790
0
          uint8_t sao_type_idx_luma = decode_sao_type_idx(tctx);
2791
0
          logtrace(LogSlice, "sao_type_idx_luma: %d\n", sao_type_idx_luma);
2792
0
          saoinfo.SaoTypeIdx = SaoTypeIdx = sao_type_idx_luma;
2793
0
        }
2794
0
        else if (cIdx == 1) {
2795
0
          uint8_t sao_type_idx_chroma = decode_sao_type_idx(tctx);
2796
0
          logtrace(LogSlice, "sao_type_idx_chroma: %d\n", sao_type_idx_chroma);
2797
0
          SaoTypeIdx = sao_type_idx_chroma;
2798
0
          saoinfo.SaoTypeIdx |= SaoTypeIdx << (2 * 1);
2799
0
          saoinfo.SaoTypeIdx |= SaoTypeIdx << (2 * 2); // set for both chroma components
2800
0
        }
2801
0
        else {
2802
          // SaoTypeIdx = 0
2803
2804
0
          SaoTypeIdx = (saoinfo.SaoTypeIdx >> (2 * cIdx)) & 0x3;
2805
0
        }
2806
2807
0
        if (SaoTypeIdx != 0) {
2808
0
          for (int i = 0; i < 4; i++) {
2809
0
            saoinfo.saoOffsetVal[cIdx][i] = decode_sao_offset_abs(tctx, img->get_bit_depth(cIdx));
2810
0
            logtrace(LogSlice, "saoOffsetVal[%d][%d] = %d\n", cIdx, i, saoinfo.saoOffsetVal[cIdx][i]);
2811
0
          }
2812
2813
0
          int sign[4];
2814
0
          if (SaoTypeIdx == 1) {
2815
0
            for (int i = 0; i < 4; i++) {
2816
0
              if (saoinfo.saoOffsetVal[cIdx][i] != 0) {
2817
0
                sign[i] = decode_sao_offset_sign(tctx) ? -1 : 1;
2818
0
              }
2819
0
              else {
2820
0
                sign[i] = 0; // not really required, but compiler warns about uninitialized values
2821
0
              }
2822
0
            }
2823
2824
0
            saoinfo.sao_band_position[cIdx] = decode_sao_band_position(tctx);
2825
0
          }
2826
0
          else {
2827
0
            uint8_t SaoEoClass = 0;
2828
2829
0
            sign[0] = sign[1] = 1;
2830
0
            sign[2] = sign[3] = -1;
2831
2832
0
            if (cIdx == 0) {
2833
0
              saoinfo.SaoEoClass = SaoEoClass = decode_sao_class(tctx);
2834
0
            }
2835
0
            else if (cIdx == 1) {
2836
0
              SaoEoClass = decode_sao_class(tctx);
2837
0
              saoinfo.SaoEoClass |= SaoEoClass << (2 * 1);
2838
0
              saoinfo.SaoEoClass |= SaoEoClass << (2 * 2);
2839
0
            }
2840
2841
0
            logtrace(LogSlice, "SaoEoClass[%d] = %d\n", cIdx, SaoEoClass);
2842
0
          }
2843
2844
0
          int log2OffsetScale;
2845
2846
0
          if (cIdx == 0) {
2847
0
            log2OffsetScale = pps.range_extension.log2_sao_offset_scale_luma;
2848
0
          }
2849
0
          else {
2850
0
            log2OffsetScale = pps.range_extension.log2_sao_offset_scale_chroma;
2851
0
          }
2852
2853
0
          for (int i = 0; i < 4; i++) {
2854
0
            saoinfo.saoOffsetVal[cIdx][i] = sign[i] * (saoinfo.saoOffsetVal[cIdx][i] << log2OffsetScale);
2855
0
          }
2856
0
        }
2857
0
      }
2858
0
    }
2859
2860
0
    img->set_sao_info(xCtb, yCtb, &saoinfo);
2861
0
  }
2862
2863
2864
0
  if (sao_merge_left_flag) {
2865
0
    img->set_sao_info(xCtb, yCtb, img->get_sao_info(xCtb - 1, yCtb));
2866
0
  }
2867
2868
0
  if (sao_merge_up_flag) {
2869
0
    img->set_sao_info(xCtb, yCtb, img->get_sao_info(xCtb, yCtb - 1));
2870
0
  }
2871
0
}
2872
2873
2874
void read_coding_tree_unit(thread_context* tctx)
2875
0
{
2876
0
  slice_segment_header* shdr = tctx->shdr;
2877
0
  de265_image* img = tctx->img;
2878
0
  const seq_parameter_set& sps = img->get_sps();
2879
2880
0
  int xCtb = (tctx->CtbAddrInRS % sps.PicWidthInCtbsY);
2881
0
  int yCtb = (tctx->CtbAddrInRS / sps.PicWidthInCtbsY);
2882
0
  int xCtbPixels = xCtb << sps.Log2CtbSizeY;
2883
0
  int yCtbPixels = yCtb << sps.Log2CtbSizeY;
2884
2885
0
  logtrace(LogSlice, "----- decode CTB %d;%d (%d;%d) POC=%d, SliceAddrRS=%d\n",
2886
0
           xCtbPixels, yCtbPixels, xCtb, yCtb,
2887
0
           tctx->img->PicOrderCntVal, tctx->shdr->SliceAddrRS);
2888
2889
0
  img->set_SliceAddrRS(xCtb, yCtb, tctx->shdr->SliceAddrRS);
2890
2891
0
  img->set_SliceHeaderIndex(xCtbPixels, yCtbPixels, shdr->slice_index);
2892
2893
0
  int CtbAddrInSliceSeg = tctx->CtbAddrInRS - shdr->slice_segment_address;
2894
2895
0
  if (shdr->slice_sao_luma_flag || shdr->slice_sao_chroma_flag) {
2896
0
    read_sao(tctx, xCtb, yCtb, CtbAddrInSliceSeg);
2897
0
  }
2898
2899
0
  read_coding_quadtree(tctx, xCtbPixels, yCtbPixels, sps.Log2CtbSizeY, 0);
2900
0
}
2901
2902
2903
inline static int luma_pos_to_ctbAddrRS(const seq_parameter_set* sps, int x, int y)
2904
0
{
2905
0
  int ctbX = x >> sps->Log2CtbSizeY;
2906
0
  int ctbY = y >> sps->Log2CtbSizeY;
2907
2908
0
  return ctbY * sps->PicWidthInCtbsY + ctbX;
2909
0
}
2910
2911
2912
int check_CTB_available(const de265_image* img,
2913
                        int xC, int yC, int xN, int yN)
2914
0
{
2915
  // check whether neighbor is outside of frame
2916
2917
0
  if (xN < 0 || yN < 0) { return 0; }
2918
0
  if (xN >= img->get_sps().pic_width_in_luma_samples) { return 0; }
2919
0
  if (yN >= img->get_sps().pic_height_in_luma_samples) { return 0; }
2920
2921
2922
0
  int current_ctbAddrRS = luma_pos_to_ctbAddrRS(&img->get_sps(), xC, yC);
2923
0
  int neighbor_ctbAddrRS = luma_pos_to_ctbAddrRS(&img->get_sps(), xN, yN);
2924
2925
  // TODO: check if this is correct (6.4.1)
2926
2927
0
  if (img->get_SliceAddrRS_atCtbRS(current_ctbAddrRS) !=
2928
0
      img->get_SliceAddrRS_atCtbRS(neighbor_ctbAddrRS)) {
2929
0
    return 0;
2930
0
  }
2931
2932
  // check if both CTBs are in the same tile.
2933
2934
0
  if (img->get_pps().scan->TileIdRS[current_ctbAddrRS] !=
2935
0
      img->get_pps().scan->TileIdRS[neighbor_ctbAddrRS]) {
2936
0
    return 0;
2937
0
  }
2938
2939
0
  return 1;
2940
0
}
2941
2942
2943
int residual_coding(thread_context* tctx,
2944
                    int x0, int y0, // position of TU in frame
2945
                    int log2TrafoSize,
2946
                    int cIdx)
2947
0
{
2948
0
  logtrace(LogSlice, "- residual_coding x0:%d y0:%d log2TrafoSize:%d cIdx:%d\n", x0, y0, log2TrafoSize, cIdx);
2949
2950
  //slice_segment_header* shdr = tctx->shdr;
2951
2952
0
  de265_image* img = tctx->img;
2953
0
  const seq_parameter_set& sps = img->get_sps();
2954
0
  const pic_parameter_set& pps = img->get_pps();
2955
2956
0
  enum PredMode PredMode = img->get_pred_mode(x0, y0);
2957
2958
0
  if (cIdx == 0) {
2959
0
    img->set_nonzero_coefficient(x0, y0, log2TrafoSize);
2960
0
  }
2961
2962
2963
0
  if (pps.transform_skip_enabled_flag &&
2964
0
      !tctx->cu_transquant_bypass_flag &&
2965
0
      (log2TrafoSize <= pps.Log2MaxTransformSkipSize)) {
2966
0
    tctx->transform_skip_flag[cIdx] = decode_transform_skip_flag(tctx, cIdx);
2967
0
  }
2968
0
  else {
2969
0
    tctx->transform_skip_flag[cIdx] = 0;
2970
0
  }
2971
2972
2973
0
  tctx->explicit_rdpcm_flag = false;
2974
2975
0
  if (PredMode == MODE_INTER && sps.range_extension.explicit_rdpcm_enabled_flag &&
2976
0
      (tctx->transform_skip_flag[cIdx] || tctx->cu_transquant_bypass_flag)) {
2977
0
    tctx->explicit_rdpcm_flag = decode_explicit_rdpcm_flag(tctx, cIdx);
2978
0
    if (tctx->explicit_rdpcm_flag) {
2979
0
      tctx->explicit_rdpcm_dir = decode_explicit_rdpcm_dir(tctx, cIdx);
2980
0
    }
2981
2982
    //printf("EXPLICIT RDPCM %d;%d\n",x0,y0);
2983
0
  }
2984
0
  else {
2985
0
    tctx->explicit_rdpcm_flag = false;
2986
0
  }
2987
2988
2989
  // sbType for persistent_rice_adaptation_enabled_flag
2990
2991
0
  int sbType = (cIdx == 0) ? 2 : 0;
2992
0
  if (tctx->transform_skip_flag[cIdx] || tctx->cu_transquant_bypass_flag) {
2993
0
    sbType++;
2994
0
  }
2995
2996
2997
  // --- decode position of last coded coefficient ---
2998
2999
0
  int last_significant_coeff_x_prefix =
3000
0
      decode_last_significant_coeff_prefix(tctx, log2TrafoSize, cIdx,
3001
0
                                           &tctx->ctx_model[CONTEXT_MODEL_LAST_SIGNIFICANT_COEFFICIENT_X_PREFIX]);
3002
3003
0
  int last_significant_coeff_y_prefix =
3004
0
      decode_last_significant_coeff_prefix(tctx, log2TrafoSize, cIdx,
3005
0
                                           &tctx->ctx_model[CONTEXT_MODEL_LAST_SIGNIFICANT_COEFFICIENT_Y_PREFIX]);
3006
3007
3008
  // TODO: we can combine both FL-bypass calls into one, but the gain may be limited...
3009
3010
0
  int LastSignificantCoeffX;
3011
0
  if (last_significant_coeff_x_prefix > 3) {
3012
0
    int nBits = (last_significant_coeff_x_prefix >> 1) - 1;
3013
0
    int last_significant_coeff_x_suffix = tctx->cabac_decoder.decode_FL_bypass( nBits);
3014
3015
0
    LastSignificantCoeffX =
3016
0
        ((2 + (last_significant_coeff_x_prefix & 1)) << nBits) + last_significant_coeff_x_suffix;
3017
0
  }
3018
0
  else {
3019
0
    LastSignificantCoeffX = last_significant_coeff_x_prefix;
3020
0
  }
3021
3022
0
  int LastSignificantCoeffY;
3023
0
  if (last_significant_coeff_y_prefix > 3) {
3024
0
    int nBits = (last_significant_coeff_y_prefix >> 1) - 1;
3025
0
    int last_significant_coeff_y_suffix = tctx->cabac_decoder.decode_FL_bypass( nBits);
3026
3027
0
    LastSignificantCoeffY =
3028
0
        ((2 + (last_significant_coeff_y_prefix & 1)) << nBits) + last_significant_coeff_y_suffix;
3029
0
  }
3030
0
  else {
3031
0
    LastSignificantCoeffY = last_significant_coeff_y_prefix;
3032
0
  }
3033
3034
3035
  // --- determine scanIdx ---
3036
3037
0
  int scanIdx;
3038
3039
0
  if (PredMode == MODE_INTRA) {
3040
0
    if (cIdx == 0) {
3041
0
      scanIdx = get_intra_scan_idx(log2TrafoSize, img->get_IntraPredMode(x0, y0), cIdx, &sps);
3042
      //printf("luma scan idx=%d <- intra mode=%d\n",scanIdx, img->get_IntraPredMode(x0,y0));
3043
0
    }
3044
0
    else {
3045
0
      scanIdx = get_intra_scan_idx(log2TrafoSize, img->get_IntraPredModeC(x0, y0), cIdx, &sps);
3046
      //printf("chroma scan idx=%d <- intra mode=%d chroma:%d trsize:%d\n",scanIdx,
3047
      //       img->get_IntraPredModeC(x0,y0), sps->chroma_format_idc, 1<<log2TrafoSize);
3048
0
    }
3049
0
  }
3050
0
  else {
3051
0
    scanIdx = 0;
3052
0
  }
3053
3054
0
  if (scanIdx == 2) {
3055
0
    std::swap(LastSignificantCoeffX, LastSignificantCoeffY);
3056
0
  }
3057
3058
0
  logtrace(LogSlice, "LastSignificantCoeff: x=%d;y=%d\n", LastSignificantCoeffX, LastSignificantCoeffY);
3059
3060
0
  const position* ScanOrderSub = get_scan_order(log2TrafoSize - 2, scanIdx);
3061
0
  const position* ScanOrderPos = get_scan_order(2, scanIdx);
3062
3063
0
  logtrace(LogSlice, "ScanOrderPos: ");
3064
0
  for (int n = 0; n < 4 * 4; n++)
3065
0
    logtrace(LogSlice, "*%d,%d ", ScanOrderPos[n].x, ScanOrderPos[n].y);
3066
0
  logtrace(LogSlice, "*\n");
3067
3068
3069
  // --- find last sub block and last scan pos ---
3070
3071
0
  int xC, yC;
3072
3073
0
  scan_position lastScanP = get_scan_position(LastSignificantCoeffX, LastSignificantCoeffY,
3074
0
                                              scanIdx, log2TrafoSize);
3075
3076
0
  int lastScanPos = lastScanP.scanPos;
3077
0
  int lastSubBlock = lastScanP.subBlock;
3078
3079
3080
0
  int sbWidth = 1 << (log2TrafoSize - 2);
3081
3082
0
  uint8_t coded_sub_block_neighbors[32 / 4 * 32 / 4];
3083
0
  memset(coded_sub_block_neighbors, 0, sbWidth * sbWidth);
3084
3085
0
  int c1 = 1;
3086
0
  bool firstSubblock = true; // for coeff_abs_level_greater1_flag context model
3087
0
  int lastSubblock_greater1Ctx = false; /* for coeff_abs_level_greater1_flag context model
3088
                                          (initialization not strictly needed)
3089
                                       */
3090
3091
#ifdef DE265_LOG_TRACE
3092
  int16_t TransCoeffLevel[32 * 32];
3093
  memset(TransCoeffLevel, 0, sizeof(uint16_t) * 32 * 32);
3094
#endif
3095
3096
0
  int CoeffStride = 1 << log2TrafoSize;
3097
3098
0
  int lastInvocation_greater1Ctx = 0;
3099
0
  int lastInvocation_coeff_abs_level_greater1_flag = 0;
3100
0
  int lastInvocation_ctxSet = 0;
3101
3102
3103
  // ----- decode coefficients -----
3104
3105
0
  tctx->nCoeff[cIdx] = 0;
3106
3107
3108
  // i - subblock index
3109
  // n - coefficient index in subblock
3110
3111
0
  for (int i = lastSubBlock; i >= 0; i--) {
3112
0
    position S = ScanOrderSub[i];
3113
0
    int inferSbDcSigCoeffFlag = 0;
3114
3115
0
    logtrace(LogSlice, "sub block scan idx: %d\n", i);
3116
3117
3118
    // --- check whether this sub-block is coded ---
3119
3120
0
    int sub_block_is_coded = 0;
3121
3122
0
    if ((i < lastSubBlock) && (i > 0)) {
3123
0
      sub_block_is_coded = decode_coded_sub_block_flag(tctx, cIdx,
3124
0
                                                       coded_sub_block_neighbors[S.x + S.y * sbWidth]);
3125
0
      inferSbDcSigCoeffFlag = 1;
3126
0
    }
3127
0
    else if (i == 0 || i == lastSubBlock) {
3128
      // first (DC) and last sub-block are always coded
3129
      // - the first will most probably contain coefficients
3130
      // - the last obviously contains the last coded coefficient
3131
3132
0
      sub_block_is_coded = 1;
3133
0
    }
3134
3135
0
    if (sub_block_is_coded) {
3136
0
      if (S.x > 0) coded_sub_block_neighbors[S.x - 1 + S.y * sbWidth] |= 1;
3137
0
      if (S.y > 0) coded_sub_block_neighbors[S.x + (S.y - 1) * sbWidth] |= 2;
3138
0
    }
3139
3140
3141
    // ----- find significant coefficients in this sub-block -----
3142
3143
0
    int16_t coeff_value[16];
3144
0
    int8_t coeff_scan_pos[16];
3145
0
    int8_t coeff_sign[16];
3146
0
    int8_t coeff_has_max_base_level[16];
3147
0
    int nCoefficients = 0;
3148
3149
3150
0
    if (sub_block_is_coded) {
3151
0
      int x0 = S.x << 2;
3152
0
      int y0 = S.y << 2;
3153
3154
0
      int log2w = log2TrafoSize - 2;
3155
0
      int prevCsbf = coded_sub_block_neighbors[S.x + S.y * sbWidth];
3156
0
      uint8_t* ctxIdxMap = ctxIdxLookup[log2w][!!cIdx][!!scanIdx][prevCsbf];
3157
3158
0
      logdebug(LogSlice, "log2w:%d cIdx:%d scanIdx:%d prevCsbf:%d\n",
3159
0
               log2w, cIdx, scanIdx, prevCsbf);
3160
3161
3162
      // set the last coded coefficient in the last subblock
3163
3164
0
      int last_coeff = (i == lastSubBlock) ? lastScanPos - 1 : 15;
3165
3166
0
      if (i == lastSubBlock) {
3167
0
        coeff_value[nCoefficients] = 1;
3168
0
        coeff_has_max_base_level[nCoefficients] = 1;
3169
0
        coeff_scan_pos[nCoefficients] = lastScanPos;
3170
0
        nCoefficients++;
3171
0
      }
3172
3173
3174
      // --- decode all coefficients' significant_coeff flags except for the DC coefficient ---
3175
3176
0
      for (int n = last_coeff; n > 0; n--) {
3177
0
        int subX = ScanOrderPos[n].x;
3178
0
        int subY = ScanOrderPos[n].y;
3179
0
        xC = x0 + subX;
3180
0
        yC = y0 + subY;
3181
3182
3183
        // for all AC coefficients in sub-block, a significant_coeff flag is coded
3184
3185
0
        int ctxInc;
3186
0
        if (sps.range_extension.transform_skip_context_enabled_flag &&
3187
0
            (tctx->cu_transquant_bypass_flag || tctx->transform_skip_flag[cIdx])) {
3188
0
          ctxInc = (cIdx == 0) ? 42 : (16 + 27);
3189
0
        }
3190
0
        else {
3191
0
          ctxInc = ctxIdxMap[xC + (yC << log2TrafoSize)];
3192
0
        }
3193
3194
0
        logtrace(LogSlice, "trafoSize: %d\n", 1 << log2TrafoSize);
3195
3196
0
        int significant_coeff = decode_significant_coeff_flag_lookup(tctx, ctxInc);
3197
3198
0
        if (significant_coeff) {
3199
0
          coeff_value[nCoefficients] = 1;
3200
0
          coeff_has_max_base_level[nCoefficients] = 1;
3201
0
          coeff_scan_pos[nCoefficients] = n;
3202
0
          nCoefficients++;
3203
3204
          // since we have a coefficient in the sub-block,
3205
          // we cannot infer the DC coefficient anymore
3206
0
          inferSbDcSigCoeffFlag = 0;
3207
0
        }
3208
0
      }
3209
3210
3211
      // --- decode DC coefficient significance ---
3212
3213
0
      if (last_coeff >= 0) // last coded coefficient (always set to 1) is not the DC coefficient
3214
0
      {
3215
0
        if (inferSbDcSigCoeffFlag == 0) {
3216
          // if we cannot infert the DC coefficient, it is coded
3217
3218
0
          int ctxInc;
3219
0
          if (sps.range_extension.transform_skip_context_enabled_flag &&
3220
0
              (tctx->cu_transquant_bypass_flag || tctx->transform_skip_flag[cIdx])) {
3221
0
            ctxInc = (cIdx == 0) ? 42 : (16 + 27);
3222
0
          }
3223
0
          else {
3224
0
            ctxInc = ctxIdxMap[x0 + (y0 << log2TrafoSize)];
3225
0
          }
3226
3227
0
          int significant_coeff = decode_significant_coeff_flag_lookup(tctx, ctxInc);
3228
3229
3230
0
          if (significant_coeff) {
3231
0
            coeff_value[nCoefficients] = 1;
3232
0
            coeff_has_max_base_level[nCoefficients] = 1;
3233
0
            coeff_scan_pos[nCoefficients] = 0;
3234
0
            nCoefficients++;
3235
0
          }
3236
0
        }
3237
0
        else {
3238
          // we can infer that the DC coefficient must be present
3239
0
          coeff_value[nCoefficients] = 1;
3240
0
          coeff_has_max_base_level[nCoefficients] = 1;
3241
0
          coeff_scan_pos[nCoefficients] = 0;
3242
0
          nCoefficients++;
3243
0
        }
3244
0
      }
3245
0
    }
3246
3247
3248
    /*
3249
      logtrace(LogSlice,"significant_coeff_flags:\n");
3250
      for (int y=0;y<4;y++) {
3251
      logtrace(LogSlice,"  ");
3252
      for (int x=0;x<4;x++) {
3253
      logtrace(LogSlice,"*%d ",significant_coeff_flag[y][x]);
3254
      }
3255
      logtrace(LogSlice,"*\n");
3256
      }
3257
    */
3258
3259
3260
0
    if (nCoefficients) {
3261
0
      int ctxSet;
3262
0
      if (i == 0 || cIdx > 0) { ctxSet = 0; }
3263
0
      else { ctxSet = 2; }
3264
3265
0
      if (c1 == 0) { ctxSet++; }
3266
0
      c1 = 1;
3267
3268
3269
      /* Whether this sub-block codes any escape data, i.e. any coeff_abs_level_remaining.
3270
         Only used for cabac_bypass_alignment_enabled_flag (see below). */
3271
3272
0
      bool escapeDataPresent = false;
3273
3274
3275
      // --- decode greater-1 flags ---
3276
3277
0
      int newLastGreater1ScanPos = -1;
3278
3279
0
      int lastGreater1Coefficient = std::min(8, nCoefficients);
3280
3281
      // significant coefficients past the first eight carry no greater-1 flag and are escape coded
3282
0
      if (nCoefficients > 8) {
3283
0
        escapeDataPresent = true;
3284
0
      }
3285
0
      for (int c = 0; c < lastGreater1Coefficient; c++) {
3286
0
        int greater1_flag =
3287
0
            decode_coeff_abs_level_greater1(tctx, cIdx, i,
3288
0
                                            c == 0,
3289
0
                                            firstSubblock,
3290
0
                                            lastSubblock_greater1Ctx,
3291
0
                                            &lastInvocation_greater1Ctx,
3292
0
                                            &lastInvocation_coeff_abs_level_greater1_flag,
3293
0
                                            &lastInvocation_ctxSet, ctxSet);
3294
3295
0
        if (greater1_flag) {
3296
0
          coeff_value[c]++;
3297
3298
0
          c1 = 0;
3299
3300
0
          if (newLastGreater1ScanPos == -1) {
3301
0
            newLastGreater1ScanPos = c;
3302
0
          }
3303
0
          else {
3304
0
            escapeDataPresent = true;
3305
0
          }
3306
0
        }
3307
0
        else {
3308
0
          coeff_has_max_base_level[c] = 0;
3309
3310
0
          if (c1 < 3 && c1 > 0) {
3311
0
            c1++;
3312
0
          }
3313
0
        }
3314
0
      }
3315
3316
0
      firstSubblock = false;
3317
0
      lastSubblock_greater1Ctx = lastInvocation_greater1Ctx;
3318
3319
3320
      // --- decode greater-2 flag ---
3321
3322
0
      if (newLastGreater1ScanPos != -1) {
3323
0
        int flag = decode_coeff_abs_level_greater2(tctx, cIdx, lastInvocation_ctxSet);
3324
0
        coeff_value[newLastGreater1ScanPos] += flag;
3325
0
        coeff_has_max_base_level[newLastGreater1ScanPos] = flag;
3326
3327
0
        if (flag) {
3328
0
          escapeDataPresent = true;
3329
0
        }
3330
0
      }
3331
3332
3333
      // --- decode coefficient signs ---
3334
3335
0
      int signHidden;
3336
3337
3338
0
      IntraPredMode predModeIntra;
3339
0
      if (cIdx == 0) predModeIntra = img->get_IntraPredMode(x0, y0);
3340
0
      else predModeIntra = img->get_IntraPredModeC(x0, y0);
3341
3342
3343
0
      if (tctx->cu_transquant_bypass_flag ||
3344
0
          (PredMode == MODE_INTRA &&
3345
0
           sps.range_extension.implicit_rdpcm_enabled_flag &&
3346
0
           tctx->transform_skip_flag[cIdx] &&
3347
0
           (predModeIntra == 10 || predModeIntra == 26)) ||
3348
0
          tctx->explicit_rdpcm_flag) {
3349
0
        signHidden = 0;
3350
0
      }
3351
0
      else {
3352
0
        signHidden = (coeff_scan_pos[0] - coeff_scan_pos[nCoefficients - 1] > 3);
3353
0
      }
3354
3355
3356
      /* (9.3.4.3.6) Align the CABAC engine before the bypass-coded sign flags and
3357
         remaining levels of a sub-block that carries escape data. No context-coded bin
3358
         follows until the end of the sub-block, so aligning once here covers both. */
3359
3360
0
      if (sps.range_extension.cabac_bypass_alignment_enabled_flag && escapeDataPresent) {
3361
0
        tctx->cabac_decoder.align_bypass();
3362
0
      }
3363
3364
0
      for (int n = 0; n < nCoefficients - 1; n++) {
3365
0
        coeff_sign[n] = tctx->cabac_decoder.decode_bypass();
3366
0
        logtrace(LogSlice, "sign[%d] = %d\n", n, coeff_sign[n]);
3367
0
      }
3368
3369
      // n==nCoefficients-1
3370
0
      if (!pps.sign_data_hiding_flag || !signHidden) {
3371
0
        coeff_sign[nCoefficients - 1] = tctx->cabac_decoder.decode_bypass();
3372
0
        logtrace(LogSlice, "sign[%d] = %d\n", nCoefficients - 1, coeff_sign[nCoefficients - 1]);
3373
0
      }
3374
0
      else {
3375
0
        coeff_sign[nCoefficients - 1] = 0;
3376
0
      }
3377
3378
3379
      // --- decode coefficient value ---
3380
3381
0
      int sumAbsLevel = 0;
3382
0
      int uiGoRiceParam;
3383
3384
0
      if (sps.range_extension.persistent_rice_adaptation_enabled_flag == 0) {
3385
0
        uiGoRiceParam = 0;
3386
0
      }
3387
0
      else {
3388
0
        uiGoRiceParam = tctx->StatCoeff[sbType] / 4;
3389
0
      }
3390
3391
      // printf("initial uiGoRiceParam=%d\n",uiGoRiceParam);
3392
0
      bool firstCoeffWithAbsLevelRemaining = true;
3393
3394
0
      for (int n = 0; n < nCoefficients; n++) {
3395
0
        int16_t baseLevel = coeff_value[n];
3396
3397
0
        int32_t coeff_abs_level_remaining;
3398
3399
        // printf("coeff %d/%d, uiRiceParam: %d\n",n,nCoefficients,uiGoRiceParam);
3400
3401
0
        if (coeff_has_max_base_level[n]) {
3402
0
          coeff_abs_level_remaining =
3403
0
              decode_coeff_abs_level_remaining(tctx, uiGoRiceParam);
3404
3405
0
          if (sps.range_extension.persistent_rice_adaptation_enabled_flag == 0) {
3406
            // (2014.10 / 9-20)
3407
0
            if (baseLevel + coeff_abs_level_remaining > 3 * (1 << uiGoRiceParam)) {
3408
0
              uiGoRiceParam++;
3409
0
              if (uiGoRiceParam > 4) uiGoRiceParam = 4;
3410
0
            }
3411
0
          }
3412
0
          else {
3413
0
            if (baseLevel + coeff_abs_level_remaining > 3 * (1 << uiGoRiceParam)) {
3414
0
              uiGoRiceParam++;
3415
0
              if (uiGoRiceParam > MAX_RICE_PARAM) {
3416
0
                uiGoRiceParam = MAX_RICE_PARAM;
3417
0
                tctx->decctx->add_warning(DE265_WARNING_RICE_PARAMETER_OUT_OF_RANGE, true);
3418
0
              }
3419
0
            }
3420
0
          }
3421
3422
          // persistent_rice_adaptation_enabled_flag
3423
0
          if (sps.range_extension.persistent_rice_adaptation_enabled_flag &&
3424
0
              firstCoeffWithAbsLevelRemaining) {
3425
0
            if (coeff_abs_level_remaining >= (3 << (tctx->StatCoeff[sbType] / 4))) {
3426
0
              if (tctx->StatCoeff[sbType] < MAX_STAT_COEFF) {
3427
0
                tctx->StatCoeff[sbType]++;
3428
0
              } else {
3429
0
                tctx->decctx->add_warning(DE265_WARNING_RICE_PARAMETER_OUT_OF_RANGE, true);
3430
0
              }
3431
0
            }
3432
0
            else if (2 * coeff_abs_level_remaining < (1 << (tctx->StatCoeff[sbType] / 4)) &&
3433
0
                     tctx->StatCoeff[sbType] > 0) {
3434
0
              tctx->StatCoeff[sbType]--;
3435
0
            }
3436
0
          }
3437
3438
0
          firstCoeffWithAbsLevelRemaining = false;
3439
0
        }
3440
0
        else {
3441
0
          coeff_abs_level_remaining = 0;
3442
0
        }
3443
3444
0
        logtrace(LogSlice, "coeff_abs_level_remaining=%d\n", coeff_abs_level_remaining);
3445
3446
3447
0
        int32_t currCoeff = baseLevel + coeff_abs_level_remaining;
3448
0
        if (coeff_sign[n]) {
3449
0
          currCoeff = -currCoeff;
3450
0
        }
3451
3452
0
        if (pps.sign_data_hiding_flag && signHidden) {
3453
0
          sumAbsLevel += currCoeff;
3454
3455
0
          if (n == nCoefficients - 1 && (sumAbsLevel & 1)) {
3456
0
            currCoeff = -currCoeff;
3457
0
          }
3458
0
        }
3459
3460
0
        logtrace(LogSlice, "quantized coefficient=%d\n", currCoeff);
3461
3462
#ifdef DE265_LOG_TRACE
3463
        //TransCoeffLevel[yC*CoeffStride + xC] = currCoeff;
3464
#endif
3465
3466
        // put coefficient in list
3467
0
        int p = coeff_scan_pos[n];
3468
0
        xC = (S.x << 2) + ScanOrderPos[p].x;
3469
0
        yC = (S.y << 2) + ScanOrderPos[p].y;
3470
3471
0
        tctx->coeffList[cIdx][tctx->nCoeff[cIdx]] = Clip3(-32768, 32767, currCoeff);
3472
0
        tctx->coeffPos[cIdx][tctx->nCoeff[cIdx]] = xC + yC * CoeffStride;
3473
0
        tctx->nCoeff[cIdx]++;
3474
3475
        //printf("%d ",currCoeff);
3476
0
      } // iterate through coefficients in sub-block
3477
3478
      //printf(" (%d;%d)\n",x0,y0);
3479
0
    } // if nonZero
3480
0
  } // next sub-block
3481
3482
0
  return DE265_OK;
3483
0
}
3484
3485
3486
static void decode_TU(thread_context* tctx,
3487
                      int x0, int y0,
3488
                      int xCUBase, int yCUBase,
3489
                      int nT, int cIdx, enum PredMode cuPredMode, bool cbf)
3490
0
{
3491
0
  de265_image* img = tctx->img;
3492
0
  const seq_parameter_set& sps = img->get_sps();
3493
3494
0
  int residualDpcm = 0;
3495
3496
0
  if (cuPredMode == MODE_INTRA) // if intra mode
3497
0
  {
3498
0
    enum IntraPredMode intraPredMode;
3499
3500
0
    if (cIdx == 0) {
3501
0
      intraPredMode = img->get_IntraPredMode(x0, y0);
3502
0
    }
3503
0
    else {
3504
0
      const int SubWidthC = sps.SubWidthC;
3505
0
      const int SubHeightC = sps.SubHeightC;
3506
3507
0
      intraPredMode = img->get_IntraPredModeC(x0 * SubWidthC, y0 * SubHeightC);
3508
0
    }
3509
3510
0
    if (intraPredMode < 0 || intraPredMode >= 35) {
3511
      // TODO: ERROR
3512
0
      intraPredMode = INTRA_DC;
3513
0
    }
3514
3515
0
    decode_intra_prediction(img, x0, y0, intraPredMode, nT, cIdx);
3516
3517
3518
0
    residualDpcm = sps.range_extension.implicit_rdpcm_enabled_flag &&
3519
0
                   (tctx->cu_transquant_bypass_flag || tctx->transform_skip_flag[cIdx]) &&
3520
0
                   (intraPredMode == 10 || intraPredMode == 26);
3521
3522
0
    if (residualDpcm && intraPredMode == 26)
3523
0
      residualDpcm = 2;
3524
0
  }
3525
0
  else // INTER
3526
0
  {
3527
0
    if (tctx->explicit_rdpcm_flag) {
3528
0
      residualDpcm = (tctx->explicit_rdpcm_dir ? 2 : 1);
3529
0
    }
3530
0
  }
3531
3532
0
  if (cbf) {
3533
0
    scale_coefficients(tctx, x0, y0, xCUBase, yCUBase, nT, cIdx,
3534
0
                       tctx->transform_skip_flag[cIdx], cuPredMode == MODE_INTRA, residualDpcm);
3535
0
  }
3536
  /*
3537
  else if (!cbf && cIdx==0) {
3538
    memset(tctx->residual_luma,0,32*32*sizeof(int32_t));
3539
  }
3540
  */
3541
0
  else if (!cbf && cIdx != 0 && tctx->ResScaleVal) {
3542
    // --- cross-component-prediction when CBF==0 ---
3543
3544
0
    tctx->nCoeff[cIdx] = 0;
3545
0
    residualDpcm = 0;
3546
3547
0
    scale_coefficients(tctx, x0, y0, xCUBase, yCUBase, nT, cIdx,
3548
0
                       tctx->transform_skip_flag[cIdx], cuPredMode == MODE_INTRA, residualDpcm);
3549
0
  }
3550
0
}
3551
3552
3553
static int decode_log2_res_scale_abs_plus1(thread_context* tctx, int cIdxMinus1)
3554
0
{
3555
  //const int context = (cIdx==0) ? 0 : 1;
3556
3557
0
  logtrace(LogSlice, "# log2_res_scale_abs_plus1 (c=%d)\n", cIdxMinus1);
3558
3559
0
  int value = 0;
3560
0
  int cMax = 4;
3561
0
  for (int binIdx = 0; binIdx < cMax; binIdx++) {
3562
0
    int ctxIdxInc = 4 * cIdxMinus1 + binIdx;
3563
3564
0
    int bit = tctx->cabac_decoder.decode_bit(
3565
0
                               &tctx->ctx_model[CONTEXT_MODEL_LOG2_RES_SCALE_ABS_PLUS1 + ctxIdxInc]);
3566
0
    if (!bit) break;
3567
0
    value++;
3568
0
  }
3569
3570
0
  logtrace(LogSymbols, "$1 log2_res_scale_abs_plus1=%d\n", value);
3571
3572
0
  return value;
3573
0
}
3574
3575
3576
static int decode_res_scale_sign_flag(thread_context* tctx, int cIdxMinus1)
3577
0
{
3578
  //const int context = (cIdx==0) ? 0 : 1;
3579
3580
0
  logtrace(LogSlice, "# res_scale_sign_flag (c=%d)\n", cIdxMinus1);
3581
3582
0
  int bit = tctx->cabac_decoder.decode_bit(
3583
0
                             &tctx->ctx_model[CONTEXT_MODEL_RES_SCALE_SIGN_FLAG + cIdxMinus1]);
3584
3585
0
  logtrace(LogSymbols, "$1 res_scale_sign_flag=%d\n", bit);
3586
3587
0
  return bit;
3588
0
}
3589
3590
3591
static void read_cross_comp_pred(thread_context* tctx, int cIdxMinus1)
3592
0
{
3593
0
  int log2_res_scale_abs_plus1 = decode_log2_res_scale_abs_plus1(tctx, cIdxMinus1);
3594
0
  int ResScaleVal;
3595
3596
0
  if (log2_res_scale_abs_plus1 != 0) {
3597
0
    int res_scale_sign_flag = decode_res_scale_sign_flag(tctx, cIdxMinus1);
3598
3599
0
    ResScaleVal = 1 << (log2_res_scale_abs_plus1 - 1);
3600
0
    ResScaleVal *= 1 - 2 * res_scale_sign_flag;
3601
0
  }
3602
0
  else {
3603
0
    ResScaleVal = 0;
3604
0
  }
3605
3606
0
  tctx->ResScaleVal = ResScaleVal;
3607
0
}
3608
3609
3610
int read_transform_unit(thread_context* tctx,
3611
                        int x0, int y0, // position of TU in frame
3612
                        int xBase, int yBase, // position of parent TU in frame
3613
                        int xCUBase, int yCUBase, // position of CU in frame
3614
                        int log2TrafoSize,
3615
                        int trafoDepth,
3616
                        int blkIdx,
3617
                        int cbf_luma, int cbf_cb, int cbf_cr)
3618
0
{
3619
0
  logtrace(LogSlice, "- read_transform_unit x0:%d y0:%d xBase:%d yBase:%d nT:%d cbf:%d:%d:%d\n",
3620
0
           x0, y0, xBase, yBase, 1 << log2TrafoSize, cbf_luma, cbf_cb, cbf_cr);
3621
3622
0
  assert(cbf_cb != -1);
3623
0
  assert(cbf_cr != -1);
3624
0
  assert(cbf_luma != -1);
3625
3626
0
  const seq_parameter_set& sps = tctx->img->get_sps();
3627
3628
0
  const int ChromaArrayType = sps.ChromaArrayType;
3629
3630
0
  int log2TrafoSizeC = (ChromaArrayType == CHROMA_444 ? log2TrafoSize : log2TrafoSize - 1);
3631
0
  log2TrafoSizeC = std::max(2, log2TrafoSizeC);
3632
3633
0
  const int cbfLuma = cbf_luma;
3634
0
  const int cbfChroma = cbf_cb | cbf_cr;
3635
3636
0
  tctx->transform_skip_flag[0] = 0;
3637
0
  tctx->transform_skip_flag[1] = 0;
3638
0
  tctx->transform_skip_flag[2] = 0;
3639
3640
0
  tctx->explicit_rdpcm_flag = false;
3641
3642
3643
0
  enum PredMode cuPredMode = tctx->img->get_pred_mode(x0, y0);
3644
3645
0
  if (cbfLuma || cbfChroma) {
3646
0
    bool doDecodeQuantParameters = false;
3647
3648
0
    if (tctx->img->get_pps().cu_qp_delta_enabled_flag &&
3649
0
        !tctx->IsCuQpDeltaCoded) {
3650
0
      uint8_t cu_qp_delta_abs = decode_cu_qp_delta_abs(tctx);
3651
0
      if (cu_qp_delta_abs == CABAC_QP_DELTA_ABS_ERROR) {
3652
0
        tctx->decctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
3653
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
3654
0
      }
3655
3656
0
      int cu_qp_delta_sign = 0;
3657
0
      if (cu_qp_delta_abs) {
3658
0
        cu_qp_delta_sign = tctx->cabac_decoder.decode_bypass();
3659
0
      }
3660
3661
      // CuQpDeltaVal shall be in [-(26 + QpBdOffsetY/2), +(25 + QpBdOffsetY/2)] (Sec. 7.4.9.14).
3662
      // Note that the range is asymmetric.
3663
0
      int maxCuQpDeltaAbs = (cu_qp_delta_sign ? 26 : 25) + tctx->img->get_sps().QpBdOffset_Y / 2;
3664
0
      if (cu_qp_delta_abs > maxCuQpDeltaAbs) {
3665
0
        tctx->decctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
3666
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
3667
0
      }
3668
3669
0
      tctx->IsCuQpDeltaCoded = 1;
3670
0
      tctx->CuQpDelta = cu_qp_delta_abs * (1 - 2 * cu_qp_delta_sign);
3671
3672
      //printf("read cu_qp_delta (%d;%d) = %d\n",x0,y0,tctx->CuQpDelta);
3673
3674
0
      logtrace(LogSlice, "cu_qp_delta_abs = %d\n", cu_qp_delta_abs);
3675
0
      logtrace(LogSlice, "cu_qp_delta_sign = %d\n", cu_qp_delta_sign);
3676
0
      logtrace(LogSlice, "CuQpDelta = %d\n", tctx->CuQpDelta);
3677
3678
0
      doDecodeQuantParameters = true;
3679
      //decode_quantization_parameters(tctx, x0,y0, xCUBase, yCUBase);
3680
0
    }
3681
3682
0
    if (tctx->shdr->cu_chroma_qp_offset_enabled_flag && cbfChroma &&
3683
0
        !tctx->cu_transquant_bypass_flag && !tctx->IsCuChromaQpOffsetCoded) {
3684
0
      logtrace(LogSlice, "# cu_chroma_qp_offset_flag\n");
3685
3686
0
      int cu_chroma_qp_offset_flag = tctx->cabac_decoder.decode_bit(
3687
0
                                                      &tctx->ctx_model[CONTEXT_MODEL_CU_CHROMA_QP_OFFSET_FLAG]);
3688
3689
3690
0
      const pic_parameter_set& pps = tctx->img->get_pps();
3691
3692
0
      int cu_chroma_qp_offset_idx = 0;
3693
0
      if (cu_chroma_qp_offset_flag && pps.range_extension.chroma_qp_offset_list_len > 1) {
3694
0
        cu_chroma_qp_offset_idx = tctx->cabac_decoder.decode_bit(
3695
0
                                                   &tctx->ctx_model[CONTEXT_MODEL_CU_CHROMA_QP_OFFSET_IDX]);
3696
0
      }
3697
3698
0
      tctx->IsCuChromaQpOffsetCoded = 1;
3699
3700
0
      if (cu_chroma_qp_offset_flag) {
3701
0
        tctx->CuQpOffsetCb = pps.range_extension.cb_qp_offset_list[cu_chroma_qp_offset_idx];
3702
0
        tctx->CuQpOffsetCr = pps.range_extension.cr_qp_offset_list[cu_chroma_qp_offset_idx];
3703
0
      }
3704
0
      else {
3705
0
        tctx->CuQpOffsetCb = 0;
3706
0
        tctx->CuQpOffsetCr = 0;
3707
0
      }
3708
3709
0
      doDecodeQuantParameters = true;
3710
      //decode_quantization_parameters(tctx, x0,y0, xCUBase, yCUBase);
3711
0
    }
3712
3713
3714
0
    if (doDecodeQuantParameters) {
3715
0
      decode_quantization_parameters(tctx, x0, y0, xCUBase, yCUBase);
3716
0
    }
3717
0
  }
3718
3719
  // position of TU in local CU
3720
  //int xL = x0 - xCUBase;
3721
  //int yL = y0 - yCUBase;
3722
0
  int nT = 1 << log2TrafoSize;
3723
0
  int nTC = 1 << log2TrafoSizeC;
3724
3725
0
  const int SubWidthC = sps.SubWidthC;
3726
0
  const int SubHeightC = sps.SubHeightC;
3727
3728
  // --- luma ---
3729
3730
0
  tctx->ResScaleVal = 0;
3731
3732
0
  int err;
3733
0
  if (cbf_luma) {
3734
0
    if ((err = residual_coding(tctx, x0, y0, log2TrafoSize, 0)) != DE265_OK) return err;
3735
0
  }
3736
3737
0
  decode_TU(tctx, x0, y0, xCUBase, yCUBase, nT, 0, cuPredMode, cbf_luma);
3738
3739
3740
  // --- chroma ---
3741
3742
  //const int yOffset422 = 1<<log2TrafoSizeC;
3743
3744
0
  if (log2TrafoSize > 2 || ChromaArrayType == CHROMA_444) {
3745
    // TODO: cross-component prediction
3746
3747
0
    const bool do_cross_component_prediction =
3748
0
    (tctx->img->get_pps().range_extension.cross_component_prediction_enabled_flag &&
3749
0
     cbf_luma &&
3750
0
     (cuPredMode == MODE_INTER || tctx->img->is_IntraPredModeC_Mode4(x0, y0)));
3751
3752
0
    if (do_cross_component_prediction) {
3753
0
      read_cross_comp_pred(tctx, 0);
3754
0
    }
3755
0
    else {
3756
0
      tctx->ResScaleVal = 0;
3757
0
    } {
3758
0
      if (cbf_cb & 1) {
3759
0
        if ((err = residual_coding(tctx, x0, y0, log2TrafoSizeC, 1)) != DE265_OK) return err;
3760
0
      }
3761
3762
0
      if (sps.ChromaArrayType != CHROMA_MONO) {
3763
0
        decode_TU(tctx,
3764
0
                  x0 / SubWidthC, y0 / SubHeightC,
3765
0
                  xCUBase / SubWidthC, yCUBase / SubHeightC, nTC, 1, cuPredMode, cbf_cb & 1);
3766
0
      }
3767
0
    }
3768
3769
    // 4:2:2
3770
0
    if (ChromaArrayType == CHROMA_422) {
3771
0
      const int yOffset = 1 << log2TrafoSizeC;
3772
3773
0
      if (cbf_cb & 2) {
3774
0
        if ((err = residual_coding(tctx,
3775
0
                                   x0, y0 + yOffset * SubHeightC,
3776
0
                                   log2TrafoSizeC, 1)) != DE265_OK)
3777
0
          return err;
3778
0
      }
3779
3780
0
      decode_TU(tctx,
3781
0
                x0 / SubWidthC, y0 / SubHeightC + yOffset,
3782
0
                xCUBase / SubWidthC, yCUBase / SubHeightC + yOffset,
3783
0
                nTC, 1, cuPredMode, cbf_cb & 2);
3784
0
    }
3785
3786
3787
0
    if (do_cross_component_prediction) {
3788
0
      read_cross_comp_pred(tctx, 1);
3789
0
    }
3790
0
    else {
3791
0
      tctx->ResScaleVal = 0;
3792
0
    } {
3793
0
      if (cbf_cr & 1) {
3794
0
        if ((err = residual_coding(tctx, x0, y0, log2TrafoSizeC, 2)) != DE265_OK) return err;
3795
0
      }
3796
3797
0
      if (sps.ChromaArrayType != CHROMA_MONO) {
3798
0
        decode_TU(tctx,
3799
0
                  x0 / SubWidthC, y0 / SubHeightC,
3800
0
                  xCUBase / SubWidthC, yCUBase / SubHeightC,
3801
0
                  nTC, 2, cuPredMode, cbf_cr & 1);
3802
0
      }
3803
0
    }
3804
3805
    // 4:2:2
3806
0
    if (ChromaArrayType == CHROMA_422) {
3807
0
      const int yOffset = 1 << log2TrafoSizeC;
3808
3809
0
      if (cbf_cr & 2) {
3810
0
        if ((err = residual_coding(tctx,
3811
0
                                   x0, y0 + yOffset * SubHeightC,
3812
0
                                   log2TrafoSizeC, 2)) != DE265_OK)
3813
0
          return err;
3814
0
      }
3815
3816
0
      decode_TU(tctx,
3817
0
                x0 / SubWidthC, y0 / SubHeightC + yOffset,
3818
0
                xCUBase / SubWidthC, yCUBase / SubHeightC + yOffset,
3819
0
                nTC, 2, cuPredMode, cbf_cr & 2);
3820
0
    }
3821
0
  }
3822
0
  else if (blkIdx == 3) {
3823
0
    if (cbf_cb & 1) {
3824
0
      if ((err = residual_coding(tctx, xBase, yBase,
3825
0
                                 log2TrafoSize, 1)) != DE265_OK)
3826
0
        return err;
3827
0
    }
3828
3829
0
    if (sps.ChromaArrayType != CHROMA_MONO) {
3830
0
      decode_TU(tctx,
3831
0
                xBase / SubWidthC, yBase / SubHeightC,
3832
0
                xCUBase / SubWidthC, yCUBase / SubHeightC, nT, 1, cuPredMode, cbf_cb & 1);
3833
0
    }
3834
3835
    // 4:2:2
3836
0
    if (cbf_cb & 2) {
3837
0
      if ((err = residual_coding(tctx,
3838
0
                                 xBase, yBase + (1 << log2TrafoSize),
3839
0
                                 log2TrafoSize, 1)) != DE265_OK)
3840
0
        return err;
3841
0
    }
3842
3843
0
    if (ChromaArrayType == CHROMA_422) {
3844
0
      decode_TU(tctx,
3845
0
                xBase / SubWidthC, yBase / SubHeightC + (1 << log2TrafoSize),
3846
0
                xCUBase / SubWidthC, yCUBase / SubHeightC, nT, 1, cuPredMode, cbf_cb & 2);
3847
0
    }
3848
3849
0
    if (cbf_cr & 1) {
3850
0
      if ((err = residual_coding(tctx, xBase, yBase,
3851
0
                                 log2TrafoSize, 2)) != DE265_OK)
3852
0
        return err;
3853
0
    }
3854
3855
0
    if (sps.ChromaArrayType != CHROMA_MONO) {
3856
0
      decode_TU(tctx,
3857
0
                xBase / SubWidthC, yBase / SubHeightC,
3858
0
                xCUBase / SubWidthC, yCUBase / SubHeightC, nT, 2, cuPredMode, cbf_cr & 1);
3859
0
    }
3860
3861
    // 4:2:2
3862
0
    if (cbf_cr & 2) {
3863
0
      if ((err = residual_coding(tctx,
3864
0
                                 xBase, yBase + (1 << log2TrafoSizeC),
3865
0
                                 log2TrafoSize, 2)) != DE265_OK)
3866
0
        return err;
3867
0
    }
3868
3869
0
    if (ChromaArrayType == CHROMA_422) {
3870
0
      decode_TU(tctx,
3871
0
                xBase / SubWidthC, yBase / SubHeightC + (1 << log2TrafoSize),
3872
0
                xCUBase / SubWidthC, yCUBase / SubHeightC, nT, 2, cuPredMode, cbf_cr & 2);
3873
0
    }
3874
0
  }
3875
3876
3877
0
  return DE265_OK;
3878
0
}
3879
3880
3881
#if 0
3882
static void dump_cbsize(de265_image* img)
3883
{
3884
  int w = img->get_width(0);
3885
  int h = img->get_height(0);
3886
3887
  for (int y = 0; y < h; y += 8) {
3888
    for (int x = 0; x < w; x += 8) {
3889
      printf("%d", img->get_log2CbSize(x, y));
3890
    }
3891
    printf("\n");
3892
  }
3893
}
3894
#endif
3895
3896
3897
void read_transform_tree(thread_context* tctx,
3898
                         int x0, int y0, // position of TU in frame
3899
                         int xBase, int yBase, // position of parent TU in frame
3900
                         int xCUBase, int yCUBase, // position of CU in frame
3901
                         int log2TrafoSize,
3902
                         int trafoDepth,
3903
                         int blkIdx,
3904
                         int MaxTrafoDepth,
3905
                         int IntraSplitFlag,
3906
                         enum PredMode cuPredMode,
3907
                         uint8_t parent_cbf_cb, uint8_t parent_cbf_cr)
3908
0
{
3909
0
  logtrace(LogSlice, "- read_transform_tree (interleaved) x0:%d y0:%d xBase:%d yBase:%d "
3910
0
           "log2TrafoSize:%d trafoDepth:%d MaxTrafoDepth:%d parent-cbf-cb:%d parent-cbf-cr:%d\n",
3911
0
           x0, y0, xBase, yBase, log2TrafoSize, trafoDepth, MaxTrafoDepth, parent_cbf_cb, parent_cbf_cr);
3912
3913
0
  de265_image* img = tctx->img;
3914
0
  const seq_parameter_set& sps = img->get_sps();
3915
3916
0
  int split_transform_flag;
3917
3918
0
  enum PredMode PredMode = img->get_pred_mode(x0, y0);
3919
0
  assert(PredMode == cuPredMode);
3920
3921
  /*  If TrafoSize is larger than maximum size   -> split automatically
3922
      If TrafoSize is at minimum size            -> do not split
3923
      If maximum transformation depth is reached -> do not split
3924
      If intra-prediction is NxN mode            -> split automatically (only at level 0)
3925
      Otherwise  ->  read split flag
3926
  */
3927
0
  if (log2TrafoSize <= sps.Log2MaxTrafoSize &&
3928
0
      log2TrafoSize > sps.Log2MinTrafoSize &&
3929
0
      trafoDepth < MaxTrafoDepth &&
3930
0
      !(IntraSplitFlag && trafoDepth == 0)) {
3931
0
    split_transform_flag = decode_split_transform_flag(tctx, log2TrafoSize);
3932
0
  }
3933
0
  else {
3934
0
    enum PartMode PartMode = img->get_PartMode(x0, y0);
3935
3936
0
    int interSplitFlag = (sps.max_transform_hierarchy_depth_inter == 0 &&
3937
0
                          trafoDepth == 0 &&
3938
0
                          PredMode == MODE_INTER &&
3939
0
                          PartMode != PART_2Nx2N);
3940
3941
0
    split_transform_flag = (log2TrafoSize > sps.Log2MaxTrafoSize ||
3942
0
                            (IntraSplitFlag == 1 && trafoDepth == 0) ||
3943
0
                            interSplitFlag == 1)
3944
0
                             ? 1
3945
0
                             : 0;
3946
0
  }
3947
3948
0
  if (split_transform_flag && log2TrafoSize <= sps.Log2MinTrafoSize) {
3949
    // TODO: it would be nice to have a flag "ignore_subsequent_errors" since the stream cannot be successfully decoded
3950
    //       after a bitstream error like this. But that would require that the error_queue is independent for each decoding thread
3951
    //       and that the flag is reset at a CABAC synchronization point. An alternative would be to simply stop the decoding this slice
3952
    //       after such an error.
3953
0
    img->decctx->add_warning(DE265_WARNING_INVALID_TU_BLOCK_SPLIT, true);
3954
0
    split_transform_flag = 0;
3955
0
  }
3956
3957
0
  if (split_transform_flag) {
3958
0
    logtrace(LogSlice, "set_split_transform_flag(%d,%d, %d)\n", x0, y0, trafoDepth);
3959
0
    img->set_split_transform_flag(x0, y0, trafoDepth);
3960
0
  }
3961
3962
0
  int cbf_cb = -1;
3963
0
  int cbf_cr = -1;
3964
3965
  // CBF_CB/CR flags are encoded like this:
3966
  // 4:2:0 and 4:4:4 modes: binary flag in bit 0
3967
  // 4:2:2 mode: bit 0: top block, bit 1: bottom block
3968
3969
0
  if ((log2TrafoSize > 2 && sps.ChromaArrayType != CHROMA_MONO) ||
3970
0
      sps.ChromaArrayType == CHROMA_444) {
3971
    // we do not have to test for trafoDepth==0, because parent_cbf_cb is 1 at depth 0
3972
0
    if (/*trafoDepth==0 ||*/ parent_cbf_cb) {
3973
0
      cbf_cb = decode_cbf_chroma(tctx, trafoDepth);
3974
3975
0
      if (sps.ChromaArrayType == CHROMA_422 && (!split_transform_flag || log2TrafoSize == 3)) {
3976
0
        cbf_cb |= (decode_cbf_chroma(tctx, trafoDepth) << 1);
3977
0
      }
3978
0
    }
3979
3980
    // we do not have to test for trafoDepth==0, because parent_cbf_cb is 1 at depth 0
3981
0
    if (/*trafoDepth==0 ||*/ parent_cbf_cr) {
3982
0
      cbf_cr = decode_cbf_chroma(tctx, trafoDepth);
3983
3984
0
      if (sps.ChromaArrayType == CHROMA_422 && (!split_transform_flag || log2TrafoSize == 3)) {
3985
0
        cbf_cr |= (decode_cbf_chroma(tctx, trafoDepth) << 1);
3986
0
      }
3987
0
    }
3988
0
  }
3989
3990
  //printf("CBF: cb:%d cr:%d\n",cbf_cb,cbf_cr);
3991
3992
  // cbf_cr/cbf_cb not present in bitstream -> induce values
3993
3994
0
  if (cbf_cb < 0) {
3995
0
    assert(!(trafoDepth==0 && log2TrafoSize==2));
3996
3997
    /* The standard specifies to check trafoDepth>0 AND log2TrafoSize==2.
3998
       However, I think that trafoDepth>0 is redundant as a CB is always
3999
       at least 8x8 and hence trafoDepth>0.
4000
    */
4001
4002
0
    if (trafoDepth > 0 && log2TrafoSize == 2) {
4003
0
      cbf_cb = parent_cbf_cb;
4004
0
    }
4005
0
    else {
4006
0
      cbf_cb = 0;
4007
0
    }
4008
0
  }
4009
4010
0
  if (cbf_cr < 0) {
4011
0
    if (trafoDepth > 0 && log2TrafoSize == 2) {
4012
0
      cbf_cr = parent_cbf_cr;
4013
0
    }
4014
0
    else {
4015
0
      cbf_cr = 0;
4016
0
    }
4017
0
  }
4018
4019
0
  if (split_transform_flag) {
4020
0
    int x1 = x0 + (1 << (log2TrafoSize - 1));
4021
0
    int y1 = y0 + (1 << (log2TrafoSize - 1));
4022
4023
0
    logtrace(LogSlice, "transform split.\n");
4024
4025
0
    read_transform_tree(tctx, x0, y0, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 0,
4026
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4027
0
    read_transform_tree(tctx, x1, y0, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 1,
4028
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4029
0
    read_transform_tree(tctx, x0, y1, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 2,
4030
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4031
0
    read_transform_tree(tctx, x1, y1, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 3,
4032
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4033
0
  }
4034
0
  else {
4035
0
    int cbf_luma;
4036
4037
0
    if (PredMode == MODE_INTRA || trafoDepth != 0 || cbf_cb || cbf_cr) {
4038
0
      cbf_luma = decode_cbf_luma(tctx, trafoDepth);
4039
0
    }
4040
0
    else {
4041
      /* There cannot be INTER blocks with no residual data.
4042
         That case is already handled with rqt_root_cbf.
4043
      */
4044
4045
0
      cbf_luma = 1;
4046
0
    }
4047
4048
0
    logtrace(LogSlice, "call read_transform_unit %d/%d\n", x0, y0);
4049
4050
0
    read_transform_unit(tctx, x0, y0, xBase, yBase, xCUBase, yCUBase, log2TrafoSize, trafoDepth, blkIdx,
4051
0
                        cbf_luma, cbf_cb, cbf_cr);
4052
0
  }
4053
0
}
4054
4055
4056
const char* part_mode_name(enum PartMode pm)
4057
0
{
4058
0
  switch (pm) {
4059
0
    case PART_2Nx2N: return "2Nx2N";
4060
0
    case PART_2NxN: return "2NxN";
4061
0
    case PART_Nx2N: return "Nx2N";
4062
0
    case PART_NxN: return "NxN";
4063
0
    case PART_2NxnU: return "2NxnU";
4064
0
    case PART_2NxnD: return "2NxnD";
4065
0
    case PART_nLx2N: return "nLx2N";
4066
0
    case PART_nRx2N: return "nRx2N";
4067
0
  }
4068
4069
0
  return "undefined part mode";
4070
0
}
4071
4072
4073
void read_mvd_coding(thread_context* tctx,
4074
                     int x0, int y0, int refList)
4075
0
{
4076
0
  int abs_mvd_greater0_flag[2];
4077
0
  abs_mvd_greater0_flag[0] = tctx->cabac_decoder.decode_bit(
4078
0
                                              &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 0]);
4079
0
  abs_mvd_greater0_flag[1] = tctx->cabac_decoder.decode_bit(
4080
0
                                              &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 0]);
4081
4082
0
  int abs_mvd_greater1_flag[2];
4083
0
  if (abs_mvd_greater0_flag[0]) {
4084
0
    abs_mvd_greater1_flag[0] = tctx->cabac_decoder.decode_bit(
4085
0
                                                &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 1]);
4086
0
  }
4087
0
  else {
4088
0
    abs_mvd_greater1_flag[0] = 0;
4089
0
  }
4090
4091
0
  if (abs_mvd_greater0_flag[1]) {
4092
0
    abs_mvd_greater1_flag[1] = tctx->cabac_decoder.decode_bit(
4093
0
                                                &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 1]);
4094
0
  }
4095
0
  else {
4096
0
    abs_mvd_greater1_flag[1] = 0;
4097
0
  }
4098
4099
4100
0
  int mvd_sign_flag[2];
4101
0
  int16_t value[2];
4102
4103
0
  for (int c = 0; c < 2; c++) {
4104
0
    if (abs_mvd_greater0_flag[c]) {
4105
0
      int32_t absMvd;
4106
0
      if (abs_mvd_greater1_flag[c]) {
4107
0
        uint32_t abs_mvd_minus2 = tctx->cabac_decoder.decode_EGk_bypass( 1);
4108
        // MVD is clipped to [-32768, 32767], so cap abs value at 32768
4109
0
        absMvd = static_cast<int32_t>(std::min(abs_mvd_minus2, uint32_t{32768 - 2})) + 2;
4110
0
      }
4111
0
      else {
4112
0
        absMvd = 1;
4113
0
      }
4114
4115
0
      mvd_sign_flag[c] = tctx->cabac_decoder.decode_bypass();
4116
0
      int32_t mvd = mvd_sign_flag[c] ? -absMvd : absMvd;
4117
0
      value[c] = Clip3(-32768, 32767, mvd);
4118
0
    }
4119
0
    else {
4120
0
      value[c] = 0;
4121
0
    }
4122
0
  }
4123
4124
0
  tctx->motion.mvd[refList][0] = value[0];
4125
0
  tctx->motion.mvd[refList][1] = value[1];
4126
4127
0
  logtrace(LogSlice, "MVD[%d;%d|%d] = %d;%d\n", x0, y0, refList, value[0], value[1]);
4128
0
}
4129
4130
4131
void read_prediction_unit_SKIP(thread_context* tctx,
4132
                               int x0, int y0,
4133
                               int nPbW, int nPbH)
4134
0
{
4135
0
  int merge_idx = decode_merge_idx(tctx);
4136
4137
0
  tctx->motion.merge_idx = merge_idx;
4138
0
  tctx->motion.merge_flag = true;
4139
4140
0
  logtrace(LogSlice, "prediction skip 2Nx2N, merge_idx: %d\n", merge_idx);
4141
0
}
4142
4143
4144
/* xC/yC : CB position
4145
   xB/yB : position offset of the PB
4146
   nPbW/nPbH : size of PB
4147
   nCS   : CB size
4148
 */
4149
void read_prediction_unit(thread_context* tctx,
4150
                          int xC, int yC, int xB, int yB,
4151
                          int nPbW, int nPbH,
4152
                          int ctDepth, int nCS, int partIdx)
4153
0
{
4154
0
  logtrace(LogSlice, "read_prediction_unit %d;%d %dx%d\n", xC + xB, yC + xB, nPbW, nPbH);
4155
4156
0
  int x0 = xC + xB;
4157
0
  int y0 = yC + yB;
4158
4159
0
  slice_segment_header* shdr = tctx->shdr;
4160
4161
0
  int merge_flag = decode_merge_flag(tctx);
4162
0
  tctx->motion.merge_flag = merge_flag;
4163
4164
0
  if (merge_flag) {
4165
0
    int merge_idx = decode_merge_idx(tctx);
4166
4167
0
    logtrace(LogSlice, "prediction unit %d,%d, merge mode, index: %d\n", x0, y0, merge_idx);
4168
4169
0
    tctx->motion.merge_idx = merge_idx;
4170
0
  }
4171
0
  else {
4172
    // no merge flag
4173
0
    enum InterPredIdc inter_pred_idc;
4174
4175
0
    if (shdr->slice_type == SLICE_TYPE_B) {
4176
0
      inter_pred_idc = decode_inter_pred_idc(tctx, x0, y0, nPbW, nPbH, ctDepth);
4177
0
    }
4178
0
    else {
4179
0
      inter_pred_idc = PRED_L0;
4180
0
    }
4181
4182
0
    tctx->motion.inter_pred_idc = inter_pred_idc; // set_inter_pred_idc(ctx,x0,y0, inter_pred_idc);
4183
4184
0
    if (inter_pred_idc != PRED_L1) {
4185
0
      int ref_idx_l0 = decode_ref_idx_lX(tctx, shdr->num_ref_idx_l0_active);
4186
4187
      // NOTE: case for only one reference frame is handles in decode_ref_idx_lX()
4188
0
      if (ref_idx_l0 < 0 || ref_idx_l0 >= MAX_NUM_REF_PICS) {
4189
0
        tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4190
0
        tctx->decctx->add_warning(DE265_WARNING_NONEXISTING_REFERENCE_PICTURE_ACCESSED, false);
4191
0
        return;
4192
0
      }
4193
0
      tctx->motion.refIdx[0] = ref_idx_l0;
4194
4195
0
      read_mvd_coding(tctx, x0, y0, 0);
4196
4197
0
      int mvp_l0_flag = decode_mvp_lx_flag(tctx); // l0
4198
0
      tctx->motion.mvp_l0_flag = mvp_l0_flag;
4199
4200
0
      logtrace(LogSlice, "prediction unit %d,%d, L0, refIdx=%d mvp_l0_flag:%d\n",
4201
0
               x0, y0, tctx->motion.refIdx[0], mvp_l0_flag);
4202
0
    }
4203
4204
0
    if (inter_pred_idc != PRED_L0) {
4205
0
      int ref_idx_l1 = decode_ref_idx_lX(tctx, shdr->num_ref_idx_l1_active);
4206
4207
      // NOTE: case for only one reference frame is handles in decode_ref_idx_lX()
4208
0
      if (ref_idx_l1 < 0 || ref_idx_l1 >= MAX_NUM_REF_PICS) {
4209
0
        tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4210
0
        tctx->decctx->add_warning(DE265_WARNING_NONEXISTING_REFERENCE_PICTURE_ACCESSED, false);
4211
0
        return;
4212
0
      }
4213
0
      tctx->motion.refIdx[1] = ref_idx_l1;
4214
4215
0
      if (shdr->mvd_l1_zero_flag &&
4216
0
          inter_pred_idc == PRED_BI) {
4217
0
        tctx->motion.mvd[1][0] = 0;
4218
0
        tctx->motion.mvd[1][1] = 0;
4219
0
      }
4220
0
      else {
4221
0
        read_mvd_coding(tctx, x0, y0, 1);
4222
0
      }
4223
4224
0
      int mvp_l1_flag = decode_mvp_lx_flag(tctx); // l1
4225
0
      tctx->motion.mvp_l1_flag = mvp_l1_flag;
4226
4227
0
      logtrace(LogSlice, "prediction unit %d,%d, L1, refIdx=%d mvp_l1_flag:%d\n",
4228
0
               x0, y0, tctx->motion.refIdx[1], mvp_l1_flag);
4229
0
    }
4230
0
  }
4231
4232
4233
0
  decode_prediction_unit(tctx->decctx, tctx->shdr, tctx->img, tctx->motion,
4234
0
                         xC, yC, xB, yB, nCS, nPbW, nPbH, partIdx);
4235
0
}
4236
4237
4238
template<class pixel_t>
4239
void read_pcm_samples_internal(thread_context* tctx, int x0, int y0, int log2CbSize,
4240
                               int cIdx, bitreader& br)
4241
0
{
4242
0
  const seq_parameter_set& sps = tctx->img->get_sps();
4243
4244
0
  int nPcmBits;
4245
0
  int bitDepth;
4246
4247
0
  int w = 1 << log2CbSize;
4248
0
  int h = 1 << log2CbSize;
4249
4250
0
  if (cIdx > 0) {
4251
0
    w /= sps.SubWidthC;
4252
0
    h /= sps.SubHeightC;
4253
4254
0
    x0 /= sps.SubWidthC;
4255
0
    y0 /= sps.SubHeightC;
4256
4257
0
    nPcmBits = sps.pcm_sample_bit_depth_chroma;
4258
0
    bitDepth = sps.BitDepth_C;
4259
0
  }
4260
0
  else {
4261
0
    nPcmBits = sps.pcm_sample_bit_depth_luma;
4262
0
    bitDepth = sps.BitDepth_Y;
4263
0
  }
4264
4265
0
  pixel_t* ptr;
4266
0
  int stride;
4267
0
  ptr = tctx->img->get_image_plane_at_pos_NEW<pixel_t>(cIdx, x0, y0);
4268
0
  stride = tctx->img->get_image_stride(cIdx);
4269
4270
0
  int shift = bitDepth - nPcmBits;
4271
4272
  // a shift < 0 may result when the SPS sequence header is broken
4273
0
  if (shift < 0) {
4274
0
    shift = 0;
4275
0
  }
4276
4277
0
  for (int y = 0; y < h; y++)
4278
0
    for (int x = 0; x < w; x++) {
4279
0
      int value = br.get_bits(nPcmBits);
4280
0
      ptr[y * stride + x] = value << shift;
4281
0
    }
4282
0
}
Unexecuted instantiation: void read_pcm_samples_internal<unsigned short>(thread_context*, int, int, int, int, bitreader&)
Unexecuted instantiation: void read_pcm_samples_internal<unsigned char>(thread_context*, int, int, int, int, bitreader&)
4283
4284
static void read_pcm_samples(thread_context* tctx, int x0, int y0, int log2CbSize)
4285
0
{
4286
0
  bitreader br(tctx->cabac_decoder.bitstream_curr,
4287
0
               tctx->cabac_decoder.bitstream_end - tctx->cabac_decoder.bitstream_curr);
4288
4289
0
  if (tctx->img->high_bit_depth(0)) {
4290
0
    read_pcm_samples_internal<uint16_t>(tctx, x0, y0, log2CbSize, 0, br);
4291
0
  }
4292
0
  else {
4293
0
    read_pcm_samples_internal<uint8_t>(tctx, x0, y0, log2CbSize, 0, br);
4294
0
  }
4295
4296
0
  if (tctx->img->get_sps().ChromaArrayType != CHROMA_MONO) {
4297
0
    if (tctx->img->high_bit_depth(1)) {
4298
0
      read_pcm_samples_internal<uint16_t>(tctx, x0, y0, log2CbSize, 1, br);
4299
0
      read_pcm_samples_internal<uint16_t>(tctx, x0, y0, log2CbSize, 2, br);
4300
0
    }
4301
0
    else {
4302
0
      read_pcm_samples_internal<uint8_t>(tctx, x0, y0, log2CbSize, 1, br);
4303
0
      read_pcm_samples_internal<uint8_t>(tctx, x0, y0, log2CbSize, 2, br);
4304
0
    }
4305
0
  }
4306
4307
0
  br.prepare_for_CABAC();
4308
0
  tctx->cabac_decoder.bitstream_curr = br.data;
4309
0
  tctx->cabac_decoder.init_CABAC();
4310
0
}
4311
4312
4313
int map_chroma_pred_mode(int intra_chroma_pred_mode, int IntraPredMode)
4314
0
{
4315
0
  if (intra_chroma_pred_mode == 4) {
4316
0
    return IntraPredMode;
4317
0
  }
4318
0
  else {
4319
0
    static const enum IntraPredMode IntraPredModeCCand[4] = {
4320
0
      INTRA_PLANAR,
4321
0
      INTRA_ANGULAR_26, // vertical
4322
0
      INTRA_ANGULAR_10, // horizontal
4323
0
      INTRA_DC
4324
0
    };
4325
4326
0
    int IntraPredModeC = IntraPredModeCCand[intra_chroma_pred_mode];
4327
0
    if (IntraPredModeC == IntraPredMode) {
4328
0
      return INTRA_ANGULAR_34;
4329
0
    }
4330
0
    else {
4331
0
      return IntraPredModeC;
4332
0
    }
4333
0
  }
4334
0
}
4335
4336
// h.265-V2 Table 8-3
4337
static const uint8_t map_chroma_422[35] = {
4338
  0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
4339
  21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31
4340
};
4341
4342
void read_coding_unit(thread_context* tctx,
4343
                      int x0, int y0, // position of coding unit in frame
4344
                      int log2CbSize,
4345
                      int ctDepth)
4346
0
{
4347
0
  de265_image* img = tctx->img;
4348
0
  const seq_parameter_set& sps = img->get_sps();
4349
0
  const pic_parameter_set& pps = img->get_pps();
4350
0
  slice_segment_header* shdr = tctx->shdr;
4351
4352
0
  logtrace(LogSlice, "- read_coding_unit %d;%d cbsize:%d\n", x0, y0, 1 << log2CbSize);
4353
4354
4355
  //QQprintf("- read_coding_unit %d;%d cbsize:%d\n",x0,y0,1<<log2CbSize);
4356
4357
0
  img->set_log2CbSize(x0, y0, log2CbSize, true);
4358
4359
  /* This is only required on corrupted input streams.
4360
     It may happen that there are several slices in the image that overlap.
4361
     In this case, flags would accumulate from both slices.
4362
  */
4363
0
  img->clear_split_transform_flags(x0, y0, log2CbSize);
4364
4365
0
  int nCbS = 1 << log2CbSize; // number of coding block samples
4366
4367
0
  decode_quantization_parameters(tctx, x0, y0, x0, y0);
4368
4369
4370
0
  if (pps.transquant_bypass_enable_flag) {
4371
0
    int transquant_bypass = decode_transquant_bypass_flag(tctx);
4372
4373
0
    tctx->cu_transquant_bypass_flag = transquant_bypass;
4374
4375
0
    if (transquant_bypass) {
4376
0
      img->set_cu_transquant_bypass(x0, y0, log2CbSize);
4377
0
    }
4378
0
  }
4379
0
  else {
4380
0
    tctx->cu_transquant_bypass_flag = 0;
4381
0
  }
4382
4383
0
  uint8_t cu_skip_flag = 0;
4384
0
  if (shdr->slice_type != SLICE_TYPE_I) {
4385
0
    cu_skip_flag = decode_cu_skip_flag(tctx, x0, y0, ctDepth);
4386
0
  }
4387
4388
0
  int IntraSplitFlag = 0;
4389
4390
0
  enum PredMode cuPredMode;
4391
4392
0
  if (cu_skip_flag) {
4393
0
    read_prediction_unit_SKIP(tctx, x0, y0, nCbS, nCbS);
4394
4395
0
    img->set_PartMode(x0, y0, PART_2Nx2N); // need this for deblocking filter
4396
0
    img->set_pred_mode(x0, y0, log2CbSize, MODE_SKIP);
4397
0
    cuPredMode = MODE_SKIP;
4398
4399
0
    logtrace(LogSlice, "CU pred mode: SKIP\n");
4400
4401
4402
    // DECODE
4403
4404
0
    int nCS_L = 1 << log2CbSize;
4405
0
    decode_prediction_unit(tctx->decctx, tctx->shdr, tctx->img, tctx->motion,
4406
0
                           x0, y0, 0, 0, nCS_L, nCS_L, nCS_L, 0);
4407
0
  }
4408
0
  else /* not skipped */ {
4409
0
    if (shdr->slice_type != SLICE_TYPE_I) {
4410
0
      int pred_mode_flag = decode_pred_mode_flag(tctx);
4411
0
      cuPredMode = pred_mode_flag ? MODE_INTRA : MODE_INTER;
4412
0
    }
4413
0
    else {
4414
0
      cuPredMode = MODE_INTRA;
4415
0
    }
4416
4417
0
    img->set_pred_mode(x0, y0, log2CbSize, cuPredMode);
4418
4419
0
    logtrace(LogSlice, "CU pred mode: %s\n", cuPredMode == MODE_INTRA ? "INTRA" : "INTER");
4420
4421
4422
0
    enum PartMode PartMode;
4423
4424
0
    if (cuPredMode != MODE_INTRA ||
4425
0
        log2CbSize == sps.Log2MinCbSizeY) {
4426
0
      PartMode = decode_part_mode(tctx, cuPredMode, log2CbSize);
4427
4428
0
      if (PartMode == PART_NxN && cuPredMode == MODE_INTRA) {
4429
0
        IntraSplitFlag = 1;
4430
0
      }
4431
0
    }
4432
0
    else {
4433
0
      PartMode = PART_2Nx2N;
4434
0
    }
4435
4436
0
    img->set_PartMode(x0, y0, PartMode); // needed for deblocking ?
4437
4438
0
    logtrace(LogSlice, "PartMode: %s\n", part_mode_name(PartMode));
4439
4440
4441
0
    bool pcm_flag = false;
4442
4443
0
    if (cuPredMode == MODE_INTRA) {
4444
0
      if (PartMode == PART_2Nx2N && sps.pcm_enabled_flag &&
4445
0
          log2CbSize >= sps.Log2MinIpcmCbSizeY &&
4446
0
          log2CbSize <= sps.Log2MaxIpcmCbSizeY) {
4447
0
        pcm_flag = tctx->cabac_decoder.decode_term_bit();
4448
0
      }
4449
4450
0
      if (pcm_flag) {
4451
0
        img->set_pcm_flag(x0, y0, log2CbSize);
4452
4453
0
        read_pcm_samples(tctx, x0, y0, log2CbSize);
4454
0
      }
4455
0
      else {
4456
0
        int pbOffset = (PartMode == PART_NxN) ? (nCbS / 2) : nCbS;
4457
0
        int log2IntraPredSize = (PartMode == PART_NxN) ? (log2CbSize - 1) : log2CbSize;
4458
4459
0
        logtrace(LogSlice, "nCbS:%d pbOffset:%d\n", nCbS, pbOffset);
4460
4461
0
        int prev_intra_luma_pred_flag[4];
4462
4463
0
        int idx = 0;
4464
0
        for (int j = 0; j < nCbS; j += pbOffset)
4465
0
          for (int i = 0; i < nCbS; i += pbOffset) {
4466
0
            prev_intra_luma_pred_flag[idx++] = decode_prev_intra_luma_pred_flag(tctx);
4467
0
          }
4468
4469
0
        int mpm_idx[4], rem_intra_luma_pred_mode[4];
4470
0
        idx = 0;
4471
4472
0
        int availableA0 = check_CTB_available(img, x0, y0, x0 - 1, y0);
4473
0
        int availableB0 = check_CTB_available(img, x0, y0, x0, y0 - 1);
4474
4475
0
        for (int j = 0; j < nCbS; j += pbOffset)
4476
0
          for (int i = 0; i < nCbS; i += pbOffset) {
4477
0
            if (prev_intra_luma_pred_flag[idx]) {
4478
0
              mpm_idx[idx] = decode_mpm_idx(tctx);
4479
0
            }
4480
0
            else {
4481
0
              rem_intra_luma_pred_mode[idx] = decode_rem_intra_luma_pred_mode(tctx);
4482
0
            }
4483
4484
4485
0
            int x = x0 + i;
4486
0
            int y = y0 + j;
4487
4488
            // --- find intra prediction mode ---
4489
4490
0
            int IntraPredMode;
4491
4492
0
            int availableA = availableA0 || (i > 0); // left candidate always available for right blk
4493
0
            int availableB = availableB0 || (j > 0); // top candidate always available for bottom blk
4494
4495
4496
0
            int PUidx = (x >> sps.Log2MinPUSize) + (y >> sps.Log2MinPUSize) * sps.PicWidthInMinPUs;
4497
4498
0
            enum IntraPredMode candModeList[3];
4499
4500
0
            fillIntraPredModeCandidates(candModeList, x, y, PUidx,
4501
0
                                        availableA, availableB, img);
4502
4503
0
            for (int i = 0; i < 3; i++)
4504
0
              logtrace(LogSlice, "candModeList[%d] = %d\n", i, candModeList[i]);
4505
4506
0
            if (prev_intra_luma_pred_flag[idx] == 1) {
4507
0
              IntraPredMode = candModeList[mpm_idx[idx]];
4508
0
            }
4509
0
            else {
4510
              // sort candModeList
4511
4512
0
              if (candModeList[0] > candModeList[1]) {
4513
0
                std::swap(candModeList[0], candModeList[1]);
4514
0
              }
4515
0
              if (candModeList[0] > candModeList[2]) {
4516
0
                std::swap(candModeList[0], candModeList[2]);
4517
0
              }
4518
0
              if (candModeList[1] > candModeList[2]) {
4519
0
                std::swap(candModeList[1], candModeList[2]);
4520
0
              }
4521
4522
              // skip modes in the list
4523
              // (we have 35 modes. skipping the 3 in the list gives us 32, which can be selected by 5 bits)
4524
0
              IntraPredMode = rem_intra_luma_pred_mode[idx];
4525
0
              for (int n = 0; n <= 2; n++) {
4526
0
                if (IntraPredMode >= candModeList[n]) { IntraPredMode++; }
4527
0
              }
4528
0
            }
4529
4530
0
            logtrace(LogSlice, "IntraPredMode[%d][%d] = %d (log2blk:%d)\n", x, y, IntraPredMode, log2IntraPredSize);
4531
4532
0
            img->set_IntraPredMode(PUidx, log2IntraPredSize,
4533
0
                                   (enum IntraPredMode) IntraPredMode);
4534
4535
0
            idx++;
4536
0
          }
4537
4538
4539
        // set chroma intra prediction mode
4540
4541
0
        if (sps.ChromaArrayType == CHROMA_444) {
4542
          // chroma 4:4:4
4543
4544
0
          idx = 0;
4545
0
          for (int j = 0; j < nCbS; j += pbOffset)
4546
0
            for (int i = 0; i < nCbS; i += pbOffset) {
4547
0
              int x = x0 + i;
4548
0
              int y = y0 + j;
4549
4550
0
              int intra_chroma_pred_mode = decode_intra_chroma_pred_mode(tctx);
4551
0
              int IntraPredMode = img->get_IntraPredMode(x, y);
4552
4553
0
              int IntraPredModeC = map_chroma_pred_mode(intra_chroma_pred_mode, IntraPredMode);
4554
4555
0
              logtrace(LogSlice, "IntraPredModeC[%d][%d]: %d (blksize:%d)\n", x, y, IntraPredModeC,
4556
0
                       1 << log2IntraPredSize);
4557
4558
0
              img->set_IntraPredModeC(x, y, log2IntraPredSize,
4559
0
                                      (enum IntraPredMode) IntraPredModeC,
4560
0
                                      intra_chroma_pred_mode == 4);
4561
0
              idx++;
4562
0
            }
4563
0
        }
4564
0
        else if (sps.ChromaArrayType != CHROMA_MONO) {
4565
          // chroma 4:2:0 and 4:2:2
4566
4567
0
          int intra_chroma_pred_mode = decode_intra_chroma_pred_mode(tctx);
4568
0
          int IntraPredMode = img->get_IntraPredMode(x0, y0);
4569
0
          logtrace(LogSlice, "IntraPredMode: %d\n", IntraPredMode);
4570
0
          int IntraPredModeC = map_chroma_pred_mode(intra_chroma_pred_mode, IntraPredMode);
4571
4572
0
          if (sps.ChromaArrayType == CHROMA_422) {
4573
0
            IntraPredModeC = map_chroma_422[IntraPredModeC];
4574
0
          }
4575
4576
0
          img->set_IntraPredModeC(x0, y0, log2CbSize,
4577
0
                                  (enum IntraPredMode) IntraPredModeC,
4578
0
                                  intra_chroma_pred_mode == 4);
4579
0
        }
4580
0
      }
4581
0
    }
4582
0
    else {
4583
      // INTER
4584
0
      int nCS = 1 << log2CbSize;
4585
4586
0
      if (PartMode == PART_2Nx2N) {
4587
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS, ctDepth, nCS, 0);
4588
0
      }
4589
0
      else if (PartMode == PART_2NxN) {
4590
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS / 2, ctDepth, nCS, 0);
4591
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS / 2, nCbS, nCbS / 2, ctDepth, nCS, 1);
4592
0
      }
4593
0
      else if (PartMode == PART_Nx2N) {
4594
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS / 2, nCbS, ctDepth, nCS, 0);
4595
0
        read_prediction_unit(tctx, x0, y0, nCbS / 2, 0, nCbS / 2, nCbS, ctDepth, nCS, 1);
4596
0
      }
4597
0
      else if (PartMode == PART_2NxnU) {
4598
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS / 4, ctDepth, nCS, 0);
4599
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS / 4, nCbS, nCbS * 3 / 4, ctDepth, nCS, 1);
4600
0
      }
4601
0
      else if (PartMode == PART_2NxnD) {
4602
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS * 3 / 4, ctDepth, nCS, 0);
4603
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS * 3 / 4, nCbS, nCbS / 4, ctDepth, nCS, 1);
4604
0
      }
4605
0
      else if (PartMode == PART_nLx2N) {
4606
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS / 4, nCbS, ctDepth, nCS, 0);
4607
0
        read_prediction_unit(tctx, x0, y0, nCbS / 4, 0, nCbS * 3 / 4, nCbS, ctDepth, nCS, 1);
4608
0
      }
4609
0
      else if (PartMode == PART_nRx2N) {
4610
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS * 3 / 4, nCbS, ctDepth, nCS, 0);
4611
0
        read_prediction_unit(tctx, x0, y0, nCbS * 3 / 4, 0, nCbS / 4, nCbS, ctDepth, nCS, 1);
4612
0
      }
4613
0
      else if (PartMode == PART_NxN) {
4614
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS / 2, nCbS / 2, ctDepth, nCS, 0);
4615
0
        read_prediction_unit(tctx, x0, y0, nCbS / 2, 0, nCbS / 2, nCbS / 2, ctDepth, nCS, 1);
4616
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS / 2, nCbS / 2, nCbS / 2, ctDepth, nCS, 2);
4617
0
        read_prediction_unit(tctx, x0, y0, nCbS / 2, nCbS / 2, nCbS / 2, nCbS / 2, ctDepth, nCS, 3);
4618
0
      }
4619
0
      else {
4620
0
        assert(0); // undefined PartMode
4621
0
      }
4622
0
    } // INTER
4623
4624
4625
    // decode residual
4626
4627
0
    if (!pcm_flag) {
4628
      // !pcm
4629
0
      bool rqt_root_cbf;
4630
4631
0
      uint8_t merge_flag = tctx->motion.merge_flag; // !!get_merge_flag(ctx,x0,y0);
4632
4633
0
      if (cuPredMode != MODE_INTRA &&
4634
0
          !(PartMode == PART_2Nx2N && merge_flag)) {
4635
0
        rqt_root_cbf = !!decode_rqt_root_cbf(tctx);
4636
0
      }
4637
0
      else {
4638
        /* rqt_root_cbf=1 is inferred for Inter blocks with 2Nx2N, merge mode.
4639
           These must be some residual data, because otherwise, the CB could
4640
           also be coded in SKIP mode.
4641
         */
4642
4643
0
        rqt_root_cbf = true;
4644
0
      }
4645
4646
      //set_rqt_root_cbf(ctx,x0,y0, log2CbSize, rqt_root_cbf);
4647
4648
0
      if (rqt_root_cbf) {
4649
0
        int MaxTrafoDepth;
4650
4651
0
        if (cuPredMode == MODE_INTRA) {
4652
0
          MaxTrafoDepth = sps.max_transform_hierarchy_depth_intra + IntraSplitFlag;
4653
0
        }
4654
0
        else {
4655
0
          MaxTrafoDepth = sps.max_transform_hierarchy_depth_inter;
4656
0
        }
4657
4658
0
        logtrace(LogSlice, "MaxTrafoDepth: %d\n", MaxTrafoDepth);
4659
4660
0
        uint8_t initial_chroma_cbf = 1;
4661
0
        if (sps.ChromaArrayType == CHROMA_MONO) {
4662
0
          initial_chroma_cbf = 0;
4663
0
        }
4664
4665
0
        read_transform_tree(tctx, x0, y0, x0, y0, x0, y0, log2CbSize, 0, 0,
4666
0
                            MaxTrafoDepth, IntraSplitFlag, cuPredMode,
4667
0
                            initial_chroma_cbf, initial_chroma_cbf);
4668
0
      }
4669
0
    } // !pcm
4670
0
  }
4671
0
}
4672
4673
4674
// ------------------------------------------------------------------------------------------
4675
4676
4677
void read_coding_quadtree(thread_context* tctx,
4678
                          int x0, int y0,
4679
                          int log2CbSize,
4680
                          int ctDepth)
4681
0
{
4682
0
  logtrace(LogSlice, "- read_coding_quadtree %d;%d cbsize:%d depth:%d POC:%d\n", x0, y0, 1 << log2CbSize, ctDepth, tctx->img->PicOrderCntVal);
4683
4684
0
  de265_image* img = tctx->img;
4685
0
  const seq_parameter_set& sps = img->get_sps();
4686
0
  const pic_parameter_set& pps = img->get_pps();
4687
4688
0
  int split_flag;
4689
4690
  // We only send a split flag if CU is larger than minimum size and
4691
  // completely contained within the image area.
4692
  // If it is partly outside the image area and not at minimum size,
4693
  // it is split. If already at minimum size, it is not split further.
4694
0
  if (x0 + (1 << log2CbSize) <= sps.pic_width_in_luma_samples &&
4695
0
      y0 + (1 << log2CbSize) <= sps.pic_height_in_luma_samples &&
4696
0
      log2CbSize > sps.Log2MinCbSizeY) {
4697
0
    split_flag = decode_split_cu_flag(tctx, x0, y0, ctDepth);
4698
0
  }
4699
0
  else {
4700
0
    if (log2CbSize > sps.Log2MinCbSizeY) { split_flag = 1; }
4701
0
    else { split_flag = 0; }
4702
0
  }
4703
4704
4705
0
  if (pps.cu_qp_delta_enabled_flag &&
4706
0
      log2CbSize >= pps.Log2MinCuQpDeltaSize) {
4707
0
    tctx->IsCuQpDeltaCoded = 0;
4708
0
    tctx->CuQpDelta = 0;
4709
0
  }
4710
0
  else {
4711
    // shdr->CuQpDelta = 0; // TODO check: is this the right place to set to default value ?
4712
0
  }
4713
4714
4715
0
  if (tctx->shdr->cu_chroma_qp_offset_enabled_flag &&
4716
0
      log2CbSize >= pps.Log2MinCuChromaQpOffsetSize) {
4717
0
    tctx->IsCuChromaQpOffsetCoded = 0;
4718
0
  }
4719
4720
0
  if (split_flag) {
4721
0
    int x1 = x0 + (1 << (log2CbSize - 1));
4722
0
    int y1 = y0 + (1 << (log2CbSize - 1));
4723
4724
0
    read_coding_quadtree(tctx, x0, y0, log2CbSize - 1, ctDepth + 1);
4725
4726
0
    if (x1 < sps.pic_width_in_luma_samples)
4727
0
      read_coding_quadtree(tctx, x1, y0, log2CbSize - 1, ctDepth + 1);
4728
4729
0
    if (y1 < sps.pic_height_in_luma_samples)
4730
0
      read_coding_quadtree(tctx, x0, y1, log2CbSize - 1, ctDepth + 1);
4731
4732
0
    if (x1 < sps.pic_width_in_luma_samples &&
4733
0
        y1 < sps.pic_height_in_luma_samples)
4734
0
      read_coding_quadtree(tctx, x1, y1, log2CbSize - 1, ctDepth + 1);
4735
0
  }
4736
0
  else {
4737
    // set ctDepth of this CU
4738
4739
0
    img->set_ctDepth(x0, y0, log2CbSize, ctDepth);
4740
4741
0
    read_coding_unit(tctx, x0, y0, log2CbSize, ctDepth);
4742
0
  }
4743
4744
0
  logtrace(LogSlice, "-\n");
4745
0
}
4746
4747
4748
// ---------------------------------------------------------------------------
4749
4750
enum DecodeResult
4751
{
4752
  Decode_EndOfSliceSegment,
4753
  Decode_EndOfSubstream,
4754
  Decode_Error
4755
};
4756
4757
/* Decode CTBs until the end of sub-stream, the end-of-slice, or some error occurs.
4758
 */
4759
enum DecodeResult decode_substream(thread_context* tctx,
4760
                                   bool block_wpp, // block on WPP dependencies
4761
                                   bool first_independent_substream)
4762
0
{
4763
0
  const pic_parameter_set& pps = tctx->img->get_pps();
4764
0
  const seq_parameter_set& sps = tctx->img->get_sps();
4765
4766
0
  const uint16_t ctbW = sps.PicWidthInCtbsY;
4767
0
  const uint16_t startCtbY = tctx->CtbY;
4768
4769
  //printf("start decoding substream at %d;%d\n",tctx->CtbX,tctx->CtbY);
4770
4771
  // in WPP mode: initialize CABAC model with stored model from row above
4772
4773
0
  if ((!first_independent_substream || tctx->CtbY != startCtbY) &&
4774
0
      pps.entropy_coding_sync_enabled_flag &&
4775
0
      tctx->CtbY >= 1 && tctx->CtbX == 0) {
4776
0
    if (sps.PicWidthInCtbsY > 1) {
4777
0
      assert(tctx->CtbY >= 1);
4778
0
      if (static_cast<size_t>(tctx->CtbY - 1) >= tctx->imgunit->ctx_models.size()) {
4779
0
        return Decode_Error;
4780
0
      }
4781
4782
      //printf("CTX wait on %d/%d\n",1,tctx->CtbY-1);
4783
4784
      // we have to wait until the context model data is there
4785
0
      tctx->img->wait_for_progress(tctx->task, 1, tctx->CtbY - 1,CTB_PROGRESS_PREFILTER);
4786
4787
      // Copy the CABAC model (and StatCoeff state) saved by the row above.
4788
      // No lock is needed: the producer stores into ctx_models[CtbY-1] before
4789
      // it signals the progress of CTB (1, CtbY-1), and the acquire load in
4790
      // wait_for_progress() above pairs with that release store. The slot has
4791
      // exactly one producer and one consumer, and after the copy/release
4792
      // below nobody touches it again. See image_unit::ctx_models for why a
4793
      // consumer can never skip this wait.
4794
0
      tctx->ctx_model = tctx->imgunit->ctx_models[(tctx->CtbY - 1)];
4795
0
      tctx->imgunit->ctx_models[(tctx->CtbY - 1)].release(); // not used anymore
4796
4797
      // also restore the StatCoeff[] state for persistent_rice_adaptation
4798
0
      for (int i = 0; i < 4; i++) {
4799
0
        tctx->StatCoeff[i] = tctx->imgunit->StatCoeff_models[(tctx->CtbY - 1)][i];
4800
0
      }
4801
0
    }
4802
0
    else {
4803
0
      tctx->img->wait_for_progress(tctx->task, 0, tctx->CtbY - 1,CTB_PROGRESS_PREFILTER);
4804
0
      initialize_CABAC_models(tctx);
4805
0
    }
4806
0
  }
4807
4808
4809
0
  do {
4810
0
    const uint32_t ctbx = tctx->CtbX;
4811
0
    const uint32_t ctby = tctx->CtbY;
4812
4813
0
    if (ctbx + ctby * ctbW >= pps.scan->CtbAddrRStoTS.size()) {
4814
0
      return Decode_Error;
4815
0
    }
4816
4817
0
    if (ctbx >= sps.PicWidthInCtbsY ||
4818
0
        ctby >= sps.PicHeightInCtbsY) {
4819
0
      return Decode_Error;
4820
0
    }
4821
4822
0
    if (block_wpp && ctby > 0 && ctbx + 1 < ctbW) {
4823
      // TODO: if we are in tiles mode and at the right border, do not wait for x+1,y-1
4824
4825
      //printf("wait on %d/%d (%d)\n",ctbx+1,ctby-1, ctbx+1+(ctby-1)*sps->PicWidthInCtbsY);
4826
4827
0
      tctx->img->wait_for_progress(tctx->task, ctbx + 1, ctby - 1, CTB_PROGRESS_PREFILTER);
4828
0
    }
4829
4830
    //printf("%p: decode %d;%d\n", tctx, tctx->CtbX,tctx->CtbY);
4831
4832
4833
    // read and decode CTB
4834
4835
0
    if (tctx->ctx_model.empty() == false) {
4836
0
      return Decode_Error;
4837
0
    }
4838
4839
0
    read_coding_tree_unit(tctx);
4840
4841
4842
    // save CABAC-model for WPP (except in last CTB row)
4843
4844
0
    if (pps.entropy_coding_sync_enabled_flag &&
4845
0
        ctbx == 1 &&
4846
0
        ctby + 1 < sps.PicHeightInCtbsY) {
4847
      // no storage for context table has been allocated
4848
0
      if (tctx->imgunit->ctx_models.size() <= ctby) {
4849
0
        return Decode_Error;
4850
0
      }
4851
4852
      // Store an independent copy of the CABAC model (and StatCoeff state) for
4853
      // the row below to pick up. This store must stay ahead of the
4854
      // set_progress(CTB_PROGRESS_PREFILTER) for this CTB further down: that
4855
      // release store publishes the slot to the consumer row task, which waits
4856
      // for CTB (1, ctby) with an acquire load before reading it. No lock is
4857
      // needed, see image_unit::ctx_models.
4858
0
      tctx->imgunit->ctx_models[ctby] = tctx->ctx_model;
4859
0
      tctx->imgunit->ctx_models[ctby].decouple(); // store an independent copy
4860
4861
      // also save the StatCoeff[] state for persistent_rice_adaptation
4862
0
      for (int i = 0; i < 4; i++) {
4863
0
        tctx->imgunit->StatCoeff_models[ctby][i] = tctx->StatCoeff[i];
4864
0
      }
4865
0
    }
4866
4867
4868
    // end of slice segment ?
4869
4870
0
    int end_of_slice_segment_flag = tctx->cabac_decoder.decode_term_bit();
4871
    //printf("end-of-slice flag: %d\n", end_of_slice_segment_flag);
4872
4873
0
    if (end_of_slice_segment_flag) {
4874
      // at the end of the slice segment, we store the CABAC model if we need it
4875
      // because a dependent slice may follow
4876
4877
0
      if (pps.dependent_slice_segments_enabled_flag) {
4878
0
        tctx->shdr->ctx_model_storage = tctx->ctx_model;
4879
0
        tctx->shdr->ctx_model_storage.decouple(); // store an independent copy
4880
4881
        // also save the StatCoeff[] state for persistent_rice_adaptation
4882
0
        for (int i = 0; i < 4; i++) {
4883
0
          tctx->shdr->ctx_model_storage_StatCoeff[i] = tctx->StatCoeff[i];
4884
0
        }
4885
4886
0
        tctx->shdr->ctx_model_storage_defined = true;
4887
0
      }
4888
0
    }
4889
4890
0
    tctx->img->ctb_progress[ctbx + ctby * ctbW].set_progress(CTB_PROGRESS_PREFILTER);
4891
4892
    //printf("%p: decoded %d|%d\n",tctx, ctby,ctbx);
4893
4894
4895
0
    logtrace(LogSlice, "read CTB %d -> end=%d\n", tctx->CtbAddrInRS, end_of_slice_segment_flag);
4896
    //printf("read CTB %d -> end=%d\n", tctx->CtbAddrInRS, end_of_slice_segment_flag);
4897
4898
0
    const int lastCtbY = tctx->CtbY;
4899
4900
0
    bool endOfPicture = advanceCtbAddr(tctx); // true if we read past the end of the image
4901
4902
0
    if (endOfPicture &&
4903
0
        end_of_slice_segment_flag == false) {
4904
0
      tctx->decctx->add_warning(DE265_WARNING_CTB_OUTSIDE_IMAGE_AREA, false);
4905
0
      tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4906
0
      return Decode_Error;
4907
0
    }
4908
4909
4910
0
    if (end_of_slice_segment_flag) {
4911
      /* corrupted inputs may send the end_of_slice_segment_flag even if not all
4912
         CTBs in a row have been coded. Hence, we mark all of them as finished.
4913
       */
4914
4915
      /*
4916
      for (int x = ctbx+1 ; x<sps->PicWidthInCtbsY; x++) {
4917
        printf("mark skipped %d;%d\n",ctbx,ctby);
4918
        tctx->img->ctb_progress[ctbx+ctby*ctbW].set_progress(CTB_PROGRESS_PREFILTER);
4919
      }
4920
      */
4921
4922
0
      return Decode_EndOfSliceSegment;
4923
0
    }
4924
4925
4926
0
    if (!end_of_slice_segment_flag) {
4927
0
      bool end_of_sub_stream = false;
4928
0
      end_of_sub_stream |= (pps.tiles_enabled_flag &&
4929
0
                            pps.scan->TileId[tctx->CtbAddrInTS] != pps.scan->TileId[tctx->CtbAddrInTS - 1]);
4930
0
      end_of_sub_stream |= (pps.entropy_coding_sync_enabled_flag &&
4931
0
                            lastCtbY != tctx->CtbY);
4932
4933
0
      if (end_of_sub_stream) {
4934
0
        int end_of_sub_stream_one_bit = tctx->cabac_decoder.decode_term_bit();
4935
0
        if (!end_of_sub_stream_one_bit) {
4936
0
          tctx->decctx->add_warning(DE265_WARNING_EOSS_BIT_NOT_SET, false);
4937
0
          tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4938
0
          return Decode_Error;
4939
0
        }
4940
4941
0
        tctx->cabac_decoder.init_CABAC(); // byte alignment
4942
0
        return Decode_EndOfSubstream;
4943
0
      }
4944
0
    }
4945
0
  } while (true);
4946
0
}
4947
4948
4949
bool initialize_CABAC_at_slice_segment_start(thread_context* tctx)
4950
0
{
4951
0
  de265_image* img = tctx->img;
4952
0
  const pic_parameter_set& pps = img->get_pps();
4953
0
  const seq_parameter_set& sps = img->get_sps();
4954
0
  slice_segment_header* shdr = tctx->shdr;
4955
4956
0
  if (shdr->dependent_slice_segment_flag) {
4957
0
    int prevCtb = pps.scan->CtbAddrTStoRS[pps.scan->CtbAddrRStoTS[shdr->slice_segment_address] - 1];
4958
4959
0
    uint16_t sliceIdx = img->get_SliceHeaderIndex_atIndex(prevCtb);
4960
0
    if (sliceIdx >= img->slices.size()) {
4961
0
      return false;
4962
0
    }
4963
0
    slice_segment_header* prevCtbHdr = img->slices[sliceIdx];
4964
4965
0
    if (pps.is_tile_start_CTB(shdr->slice_segment_address % sps.PicWidthInCtbsY,
4966
0
                              shdr->slice_segment_address / sps.PicWidthInCtbsY
4967
0
                             )) {
4968
0
      initialize_CABAC_models(tctx);
4969
0
    }
4970
0
    else {
4971
      // wait for previous slice to finish decoding
4972
4973
      //printf("wait for previous slice to finish decoding\n");
4974
4975
4976
0
      slice_unit* prevSliceSegment = tctx->imgunit->get_prev_slice_segment(tctx->sliceunit);
4977
      //assert(prevSliceSegment);
4978
0
      if (prevSliceSegment == nullptr) {
4979
0
        return false;
4980
0
      }
4981
4982
0
      prevSliceSegment->finished_threads.wait_for_progress(prevSliceSegment->nThreads);
4983
4984
4985
      /*
4986
      printf("wait for %d,%d (init)\n",
4987
             prevCtb / sps->PicWidthInCtbsY,
4988
             prevCtb % sps->PicWidthInCtbsY);
4989
      tctx->img->wait_for_progress(tctx->task, prevCtb, CTB_PROGRESS_PREFILTER);
4990
      */
4991
4992
0
      if (!prevCtbHdr->ctx_model_storage_defined) {
4993
0
        return false;
4994
0
      }
4995
4996
0
      tctx->ctx_model = prevCtbHdr->ctx_model_storage;
4997
0
      prevCtbHdr->ctx_model_storage.release();
4998
4999
      // also restore the StatCoeff[] state for persistent_rice_adaptation
5000
0
      for (int i = 0; i < 4; i++) {
5001
0
        tctx->StatCoeff[i] = prevCtbHdr->ctx_model_storage_StatCoeff[i];
5002
0
      }
5003
0
    }
5004
0
  }
5005
0
  else {
5006
0
    initialize_CABAC_models(tctx);
5007
0
  }
5008
5009
0
  return true;
5010
0
}
5011
5012
5013
std::string thread_task_ctb_row::name() const
5014
0
{
5015
0
  char buf[100];
5016
0
  sprintf(buf, "ctb-row-%d", debug_startCtbRow);
5017
0
  return buf;
5018
0
}
5019
5020
5021
std::string thread_task_slice_segment::name() const
5022
0
{
5023
0
  char buf[100];
5024
0
  sprintf(buf, "slice-segment-%d;%d", debug_startCtbX, debug_startCtbY);
5025
0
  return buf;
5026
0
}
5027
5028
5029
void thread_task_slice_segment::work()
5030
0
{
5031
0
  thread_task_slice_segment* data = this;
5032
0
  thread_context* tctx = data->tctx;
5033
0
  de265_image* img = tctx->img;
5034
5035
0
  state = Running;
5036
0
  img->thread_run(this);
5037
5038
0
  setCtbAddrFromTS(tctx);
5039
5040
  //printf("%p: A start decoding at %d/%d\n", tctx, tctx->CtbX,tctx->CtbY);
5041
5042
0
  if (data->firstSliceSubstream) {
5043
0
    bool success = initialize_CABAC_at_slice_segment_start(tctx);
5044
0
    if (!success) {
5045
0
      state = Finished;
5046
0
      tctx->sliceunit->finished_threads.increase_progress(1);
5047
0
      img->thread_finishes(this);
5048
0
      return;
5049
0
    }
5050
0
  }
5051
0
  else {
5052
0
    initialize_CABAC_models(tctx);
5053
0
  }
5054
5055
0
  tctx->cabac_decoder.init_CABAC();
5056
5057
  /*enum DecodeResult result =*/
5058
0
  decode_substream(tctx, false, data->firstSliceSubstream);
5059
5060
0
  state = Finished;
5061
0
  tctx->sliceunit->finished_threads.increase_progress(1);
5062
0
  img->thread_finishes(this);
5063
5064
0
  return; // DE265_OK;
5065
0
}
5066
5067
5068
void thread_task_ctb_row::work()
5069
0
{
5070
0
  thread_task_ctb_row* data = this;
5071
0
  thread_context* tctx = data->tctx;
5072
0
  de265_image* img = tctx->img;
5073
5074
0
  const seq_parameter_set& sps = img->get_sps();
5075
0
  int ctbW = sps.PicWidthInCtbsY;
5076
5077
0
  state = Running;
5078
0
  img->thread_run(this);
5079
5080
0
  setCtbAddrFromTS(tctx);
5081
5082
0
  int ctby = tctx->CtbAddrInRS / ctbW;
5083
0
  int myCtbRow = ctby;
5084
5085
  //printf("start CTB-row decoding at row %d\n", ctby);
5086
5087
0
  if (data->firstSliceSubstream) {
5088
0
    bool success = initialize_CABAC_at_slice_segment_start(tctx);
5089
0
    if (!success) {
5090
      // could not decode this row, mark whole row as finished
5091
0
      for (int x = 0; x < ctbW; x++) {
5092
0
        img->ctb_progress[myCtbRow * ctbW + x].set_progress(CTB_PROGRESS_PREFILTER);
5093
0
      }
5094
5095
0
      state = Finished;
5096
0
      tctx->sliceunit->finished_threads.increase_progress(1);
5097
0
      img->thread_finishes(this);
5098
0
      return;
5099
0
    }
5100
    //initialize_CABAC(tctx);
5101
0
  }
5102
5103
0
  tctx->cabac_decoder.init_CABAC();
5104
5105
0
  bool firstIndependentSubstream =
5106
0
      data->firstSliceSubstream && !tctx->shdr->dependent_slice_segment_flag;
5107
5108
  /*enum DecodeResult result =*/
5109
0
  decode_substream(tctx, true, firstIndependentSubstream);
5110
5111
  // mark progress on remaining CTBs in row (in case of decoder error and early termination)
5112
5113
  // TODO: what about slices that end properly in the middle of a CTB row?
5114
5115
0
  if (tctx->CtbY == myCtbRow) {
5116
0
    int lastCtbX = sps.PicWidthInCtbsY; // assume no tiles when WPP is on
5117
0
    for (int x = tctx->CtbX; x < lastCtbX; x++) {
5118
0
      if (x < sps.PicWidthInCtbsY &&
5119
0
          myCtbRow < sps.PicHeightInCtbsY) {
5120
0
        img->ctb_progress[myCtbRow * ctbW + x].set_progress(CTB_PROGRESS_PREFILTER);
5121
0
      }
5122
0
    }
5123
0
  }
5124
5125
0
  state = Finished;
5126
0
  tctx->sliceunit->finished_threads.increase_progress(1);
5127
0
  img->thread_finishes(this);
5128
0
}
5129
5130
5131
de265_error read_slice_segment_data(thread_context* tctx)
5132
0
{
5133
0
  setCtbAddrFromTS(tctx);
5134
5135
0
  de265_image* img = tctx->img;
5136
0
  const pic_parameter_set& pps = img->get_pps();
5137
  //const seq_parameter_set& sps = img->get_sps();
5138
0
  slice_segment_header* shdr = tctx->shdr;
5139
5140
0
  bool success = initialize_CABAC_at_slice_segment_start(tctx);
5141
0
  if (!success) {
5142
0
    return DE265_ERROR_UNSPECIFIED_DECODING_ERROR;
5143
0
  }
5144
5145
0
  tctx->cabac_decoder.init_CABAC();
5146
5147
  //printf("-----\n");
5148
5149
0
  bool first_slice_substream = !shdr->dependent_slice_segment_flag;
5150
5151
0
  uint32_t substream = 0;
5152
5153
0
  enum DecodeResult result;
5154
0
  do {
5155
    //int ctby = tctx->CtbY;
5156
5157
5158
    // check whether entry_points[] are correct in the bitstream
5159
5160
0
    if (substream > 0) {
5161
0
      if (substream - 1 >= tctx->shdr->entry_point_offset.size() ||
5162
0
          tctx->cabac_decoder.bitstream_curr - tctx->cabac_decoder.bitstream_start - 2 /* -2 because of CABAC init */
5163
0
          != tctx->shdr->entry_point_offset[substream - 1]) {
5164
0
        tctx->decctx->add_warning(DE265_WARNING_INCORRECT_ENTRY_POINT_OFFSET, true);
5165
0
      }
5166
0
    }
5167
5168
0
    substream++;
5169
5170
5171
0
    result = decode_substream(tctx, false, first_slice_substream);
5172
5173
5174
0
    if (result == Decode_EndOfSliceSegment ||
5175
0
        result == Decode_Error) {
5176
0
      break;
5177
0
    }
5178
5179
0
    first_slice_substream = false;
5180
5181
0
    if (pps.tiles_enabled_flag) {
5182
0
      initialize_CABAC_models(tctx);
5183
0
    }
5184
0
  } while (true);
5185
5186
0
  return DE265_OK;
5187
0
}
5188
5189
5190
/* TODO:
5191
   When a task wants to block, but is the first in the list of pending tasks,
5192
   do some error concealment instead of blocking, since it will never be deblocked.
5193
   This will only happen in the case of input error.
5194
 */