Coverage Report

Created: 2026-09-14 06:44

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
      // --- decode greater-1 flags ---
3270
3271
0
      int newLastGreater1ScanPos = -1;
3272
3273
0
      int lastGreater1Coefficient = std::min(8, nCoefficients);
3274
0
      for (int c = 0; c < lastGreater1Coefficient; c++) {
3275
0
        int greater1_flag =
3276
0
            decode_coeff_abs_level_greater1(tctx, cIdx, i,
3277
0
                                            c == 0,
3278
0
                                            firstSubblock,
3279
0
                                            lastSubblock_greater1Ctx,
3280
0
                                            &lastInvocation_greater1Ctx,
3281
0
                                            &lastInvocation_coeff_abs_level_greater1_flag,
3282
0
                                            &lastInvocation_ctxSet, ctxSet);
3283
3284
0
        if (greater1_flag) {
3285
0
          coeff_value[c]++;
3286
3287
0
          c1 = 0;
3288
3289
0
          if (newLastGreater1ScanPos == -1) {
3290
0
            newLastGreater1ScanPos = c;
3291
0
          }
3292
0
        }
3293
0
        else {
3294
0
          coeff_has_max_base_level[c] = 0;
3295
3296
0
          if (c1 < 3 && c1 > 0) {
3297
0
            c1++;
3298
0
          }
3299
0
        }
3300
0
      }
3301
3302
0
      firstSubblock = false;
3303
0
      lastSubblock_greater1Ctx = lastInvocation_greater1Ctx;
3304
3305
3306
      // --- decode greater-2 flag ---
3307
3308
0
      if (newLastGreater1ScanPos != -1) {
3309
0
        int flag = decode_coeff_abs_level_greater2(tctx, cIdx, lastInvocation_ctxSet);
3310
0
        coeff_value[newLastGreater1ScanPos] += flag;
3311
0
        coeff_has_max_base_level[newLastGreater1ScanPos] = flag;
3312
0
      }
3313
3314
3315
      // --- decode coefficient signs ---
3316
3317
0
      int signHidden;
3318
3319
3320
0
      IntraPredMode predModeIntra;
3321
0
      if (cIdx == 0) predModeIntra = img->get_IntraPredMode(x0, y0);
3322
0
      else predModeIntra = img->get_IntraPredModeC(x0, y0);
3323
3324
3325
0
      if (tctx->cu_transquant_bypass_flag ||
3326
0
          (PredMode == MODE_INTRA &&
3327
0
           sps.range_extension.implicit_rdpcm_enabled_flag &&
3328
0
           tctx->transform_skip_flag[cIdx] &&
3329
0
           (predModeIntra == 10 || predModeIntra == 26)) ||
3330
0
          tctx->explicit_rdpcm_flag) {
3331
0
        signHidden = 0;
3332
0
      }
3333
0
      else {
3334
0
        signHidden = (coeff_scan_pos[0] - coeff_scan_pos[nCoefficients - 1] > 3);
3335
0
      }
3336
3337
3338
0
      for (int n = 0; n < nCoefficients - 1; n++) {
3339
0
        coeff_sign[n] = tctx->cabac_decoder.decode_bypass();
3340
0
        logtrace(LogSlice, "sign[%d] = %d\n", n, coeff_sign[n]);
3341
0
      }
3342
3343
      // n==nCoefficients-1
3344
0
      if (!pps.sign_data_hiding_flag || !signHidden) {
3345
0
        coeff_sign[nCoefficients - 1] = tctx->cabac_decoder.decode_bypass();
3346
0
        logtrace(LogSlice, "sign[%d] = %d\n", nCoefficients - 1, coeff_sign[nCoefficients - 1]);
3347
0
      }
3348
0
      else {
3349
0
        coeff_sign[nCoefficients - 1] = 0;
3350
0
      }
3351
3352
3353
      // --- decode coefficient value ---
3354
3355
0
      int sumAbsLevel = 0;
3356
0
      int uiGoRiceParam;
3357
3358
0
      if (sps.range_extension.persistent_rice_adaptation_enabled_flag == 0) {
3359
0
        uiGoRiceParam = 0;
3360
0
      }
3361
0
      else {
3362
0
        uiGoRiceParam = tctx->StatCoeff[sbType] / 4;
3363
0
      }
3364
3365
      // printf("initial uiGoRiceParam=%d\n",uiGoRiceParam);
3366
0
      bool firstCoeffWithAbsLevelRemaining = true;
3367
3368
0
      for (int n = 0; n < nCoefficients; n++) {
3369
0
        int16_t baseLevel = coeff_value[n];
3370
3371
0
        int32_t coeff_abs_level_remaining;
3372
3373
        // printf("coeff %d/%d, uiRiceParam: %d\n",n,nCoefficients,uiGoRiceParam);
3374
3375
0
        if (coeff_has_max_base_level[n]) {
3376
0
          coeff_abs_level_remaining =
3377
0
              decode_coeff_abs_level_remaining(tctx, uiGoRiceParam);
3378
3379
0
          if (sps.range_extension.persistent_rice_adaptation_enabled_flag == 0) {
3380
            // (2014.10 / 9-20)
3381
0
            if (baseLevel + coeff_abs_level_remaining > 3 * (1 << uiGoRiceParam)) {
3382
0
              uiGoRiceParam++;
3383
0
              if (uiGoRiceParam > 4) uiGoRiceParam = 4;
3384
0
            }
3385
0
          }
3386
0
          else {
3387
0
            if (baseLevel + coeff_abs_level_remaining > 3 * (1 << uiGoRiceParam)) {
3388
0
              uiGoRiceParam++;
3389
0
              if (uiGoRiceParam > MAX_RICE_PARAM) {
3390
0
                uiGoRiceParam = MAX_RICE_PARAM;
3391
0
                tctx->decctx->add_warning(DE265_WARNING_RICE_PARAMETER_OUT_OF_RANGE, true);
3392
0
              }
3393
0
            }
3394
0
          }
3395
3396
          // persistent_rice_adaptation_enabled_flag
3397
0
          if (sps.range_extension.persistent_rice_adaptation_enabled_flag &&
3398
0
              firstCoeffWithAbsLevelRemaining) {
3399
0
            if (coeff_abs_level_remaining >= (3 << (tctx->StatCoeff[sbType] / 4))) {
3400
0
              if (tctx->StatCoeff[sbType] < MAX_STAT_COEFF) {
3401
0
                tctx->StatCoeff[sbType]++;
3402
0
              } else {
3403
0
                tctx->decctx->add_warning(DE265_WARNING_RICE_PARAMETER_OUT_OF_RANGE, true);
3404
0
              }
3405
0
            }
3406
0
            else if (2 * coeff_abs_level_remaining < (1 << (tctx->StatCoeff[sbType] / 4)) &&
3407
0
                     tctx->StatCoeff[sbType] > 0) {
3408
0
              tctx->StatCoeff[sbType]--;
3409
0
            }
3410
0
          }
3411
3412
0
          firstCoeffWithAbsLevelRemaining = false;
3413
0
        }
3414
0
        else {
3415
0
          coeff_abs_level_remaining = 0;
3416
0
        }
3417
3418
0
        logtrace(LogSlice, "coeff_abs_level_remaining=%d\n", coeff_abs_level_remaining);
3419
3420
3421
0
        int32_t currCoeff = baseLevel + coeff_abs_level_remaining;
3422
0
        if (coeff_sign[n]) {
3423
0
          currCoeff = -currCoeff;
3424
0
        }
3425
3426
0
        if (pps.sign_data_hiding_flag && signHidden) {
3427
0
          sumAbsLevel += currCoeff;
3428
3429
0
          if (n == nCoefficients - 1 && (sumAbsLevel & 1)) {
3430
0
            currCoeff = -currCoeff;
3431
0
          }
3432
0
        }
3433
3434
0
        logtrace(LogSlice, "quantized coefficient=%d\n", currCoeff);
3435
3436
#ifdef DE265_LOG_TRACE
3437
        //TransCoeffLevel[yC*CoeffStride + xC] = currCoeff;
3438
#endif
3439
3440
        // put coefficient in list
3441
0
        int p = coeff_scan_pos[n];
3442
0
        xC = (S.x << 2) + ScanOrderPos[p].x;
3443
0
        yC = (S.y << 2) + ScanOrderPos[p].y;
3444
3445
0
        tctx->coeffList[cIdx][tctx->nCoeff[cIdx]] = Clip3(-32768, 32767, currCoeff);
3446
0
        tctx->coeffPos[cIdx][tctx->nCoeff[cIdx]] = xC + yC * CoeffStride;
3447
0
        tctx->nCoeff[cIdx]++;
3448
3449
        //printf("%d ",currCoeff);
3450
0
      } // iterate through coefficients in sub-block
3451
3452
      //printf(" (%d;%d)\n",x0,y0);
3453
0
    } // if nonZero
3454
0
  } // next sub-block
3455
3456
0
  return DE265_OK;
3457
0
}
3458
3459
3460
static void decode_TU(thread_context* tctx,
3461
                      int x0, int y0,
3462
                      int xCUBase, int yCUBase,
3463
                      int nT, int cIdx, enum PredMode cuPredMode, bool cbf)
3464
0
{
3465
0
  de265_image* img = tctx->img;
3466
0
  const seq_parameter_set& sps = img->get_sps();
3467
3468
0
  int residualDpcm = 0;
3469
3470
0
  if (cuPredMode == MODE_INTRA) // if intra mode
3471
0
  {
3472
0
    enum IntraPredMode intraPredMode;
3473
3474
0
    if (cIdx == 0) {
3475
0
      intraPredMode = img->get_IntraPredMode(x0, y0);
3476
0
    }
3477
0
    else {
3478
0
      const int SubWidthC = sps.SubWidthC;
3479
0
      const int SubHeightC = sps.SubHeightC;
3480
3481
0
      intraPredMode = img->get_IntraPredModeC(x0 * SubWidthC, y0 * SubHeightC);
3482
0
    }
3483
3484
0
    if (intraPredMode < 0 || intraPredMode >= 35) {
3485
      // TODO: ERROR
3486
0
      intraPredMode = INTRA_DC;
3487
0
    }
3488
3489
0
    decode_intra_prediction(img, x0, y0, intraPredMode, nT, cIdx);
3490
3491
3492
0
    residualDpcm = sps.range_extension.implicit_rdpcm_enabled_flag &&
3493
0
                   (tctx->cu_transquant_bypass_flag || tctx->transform_skip_flag[cIdx]) &&
3494
0
                   (intraPredMode == 10 || intraPredMode == 26);
3495
3496
0
    if (residualDpcm && intraPredMode == 26)
3497
0
      residualDpcm = 2;
3498
0
  }
3499
0
  else // INTER
3500
0
  {
3501
0
    if (tctx->explicit_rdpcm_flag) {
3502
0
      residualDpcm = (tctx->explicit_rdpcm_dir ? 2 : 1);
3503
0
    }
3504
0
  }
3505
3506
0
  if (cbf) {
3507
0
    scale_coefficients(tctx, x0, y0, xCUBase, yCUBase, nT, cIdx,
3508
0
                       tctx->transform_skip_flag[cIdx], cuPredMode == MODE_INTRA, residualDpcm);
3509
0
  }
3510
  /*
3511
  else if (!cbf && cIdx==0) {
3512
    memset(tctx->residual_luma,0,32*32*sizeof(int32_t));
3513
  }
3514
  */
3515
0
  else if (!cbf && cIdx != 0 && tctx->ResScaleVal) {
3516
    // --- cross-component-prediction when CBF==0 ---
3517
3518
0
    tctx->nCoeff[cIdx] = 0;
3519
0
    residualDpcm = 0;
3520
3521
0
    scale_coefficients(tctx, x0, y0, xCUBase, yCUBase, nT, cIdx,
3522
0
                       tctx->transform_skip_flag[cIdx], cuPredMode == MODE_INTRA, residualDpcm);
3523
0
  }
3524
0
}
3525
3526
3527
static int decode_log2_res_scale_abs_plus1(thread_context* tctx, int cIdxMinus1)
3528
0
{
3529
  //const int context = (cIdx==0) ? 0 : 1;
3530
3531
0
  logtrace(LogSlice, "# log2_res_scale_abs_plus1 (c=%d)\n", cIdxMinus1);
3532
3533
0
  int value = 0;
3534
0
  int cMax = 4;
3535
0
  for (int binIdx = 0; binIdx < cMax; binIdx++) {
3536
0
    int ctxIdxInc = 4 * cIdxMinus1 + binIdx;
3537
3538
0
    int bit = tctx->cabac_decoder.decode_bit(
3539
0
                               &tctx->ctx_model[CONTEXT_MODEL_LOG2_RES_SCALE_ABS_PLUS1 + ctxIdxInc]);
3540
0
    if (!bit) break;
3541
0
    value++;
3542
0
  }
3543
3544
0
  logtrace(LogSymbols, "$1 log2_res_scale_abs_plus1=%d\n", value);
3545
3546
0
  return value;
3547
0
}
3548
3549
3550
static int decode_res_scale_sign_flag(thread_context* tctx, int cIdxMinus1)
3551
0
{
3552
  //const int context = (cIdx==0) ? 0 : 1;
3553
3554
0
  logtrace(LogSlice, "# res_scale_sign_flag (c=%d)\n", cIdxMinus1);
3555
3556
0
  int bit = tctx->cabac_decoder.decode_bit(
3557
0
                             &tctx->ctx_model[CONTEXT_MODEL_RES_SCALE_SIGN_FLAG + cIdxMinus1]);
3558
3559
0
  logtrace(LogSymbols, "$1 res_scale_sign_flag=%d\n", bit);
3560
3561
0
  return bit;
3562
0
}
3563
3564
3565
static void read_cross_comp_pred(thread_context* tctx, int cIdxMinus1)
3566
0
{
3567
0
  int log2_res_scale_abs_plus1 = decode_log2_res_scale_abs_plus1(tctx, cIdxMinus1);
3568
0
  int ResScaleVal;
3569
3570
0
  if (log2_res_scale_abs_plus1 != 0) {
3571
0
    int res_scale_sign_flag = decode_res_scale_sign_flag(tctx, cIdxMinus1);
3572
3573
0
    ResScaleVal = 1 << (log2_res_scale_abs_plus1 - 1);
3574
0
    ResScaleVal *= 1 - 2 * res_scale_sign_flag;
3575
0
  }
3576
0
  else {
3577
0
    ResScaleVal = 0;
3578
0
  }
3579
3580
0
  tctx->ResScaleVal = ResScaleVal;
3581
0
}
3582
3583
3584
int read_transform_unit(thread_context* tctx,
3585
                        int x0, int y0, // position of TU in frame
3586
                        int xBase, int yBase, // position of parent TU in frame
3587
                        int xCUBase, int yCUBase, // position of CU in frame
3588
                        int log2TrafoSize,
3589
                        int trafoDepth,
3590
                        int blkIdx,
3591
                        int cbf_luma, int cbf_cb, int cbf_cr)
3592
0
{
3593
0
  logtrace(LogSlice, "- read_transform_unit x0:%d y0:%d xBase:%d yBase:%d nT:%d cbf:%d:%d:%d\n",
3594
0
           x0, y0, xBase, yBase, 1 << log2TrafoSize, cbf_luma, cbf_cb, cbf_cr);
3595
3596
0
  assert(cbf_cb != -1);
3597
0
  assert(cbf_cr != -1);
3598
0
  assert(cbf_luma != -1);
3599
3600
0
  const seq_parameter_set& sps = tctx->img->get_sps();
3601
3602
0
  const int ChromaArrayType = sps.ChromaArrayType;
3603
3604
0
  int log2TrafoSizeC = (ChromaArrayType == CHROMA_444 ? log2TrafoSize : log2TrafoSize - 1);
3605
0
  log2TrafoSizeC = std::max(2, log2TrafoSizeC);
3606
3607
0
  const int cbfLuma = cbf_luma;
3608
0
  const int cbfChroma = cbf_cb | cbf_cr;
3609
3610
0
  tctx->transform_skip_flag[0] = 0;
3611
0
  tctx->transform_skip_flag[1] = 0;
3612
0
  tctx->transform_skip_flag[2] = 0;
3613
3614
0
  tctx->explicit_rdpcm_flag = false;
3615
3616
3617
0
  enum PredMode cuPredMode = tctx->img->get_pred_mode(x0, y0);
3618
3619
0
  if (cbfLuma || cbfChroma) {
3620
0
    bool doDecodeQuantParameters = false;
3621
3622
0
    if (tctx->img->get_pps().cu_qp_delta_enabled_flag &&
3623
0
        !tctx->IsCuQpDeltaCoded) {
3624
0
      uint8_t cu_qp_delta_abs = decode_cu_qp_delta_abs(tctx);
3625
0
      if (cu_qp_delta_abs == CABAC_QP_DELTA_ABS_ERROR) {
3626
0
        tctx->decctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
3627
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
3628
0
      }
3629
3630
0
      int cu_qp_delta_sign = 0;
3631
0
      if (cu_qp_delta_abs) {
3632
0
        cu_qp_delta_sign = tctx->cabac_decoder.decode_bypass();
3633
0
      }
3634
3635
      // CuQpDeltaVal shall be in [-(26 + QpBdOffsetY/2), +(25 + QpBdOffsetY/2)] (Sec. 7.4.9.14).
3636
      // Note that the range is asymmetric.
3637
0
      int maxCuQpDeltaAbs = (cu_qp_delta_sign ? 26 : 25) + tctx->img->get_sps().QpBdOffset_Y / 2;
3638
0
      if (cu_qp_delta_abs > maxCuQpDeltaAbs) {
3639
0
        tctx->decctx->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
3640
0
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
3641
0
      }
3642
3643
0
      tctx->IsCuQpDeltaCoded = 1;
3644
0
      tctx->CuQpDelta = cu_qp_delta_abs * (1 - 2 * cu_qp_delta_sign);
3645
3646
      //printf("read cu_qp_delta (%d;%d) = %d\n",x0,y0,tctx->CuQpDelta);
3647
3648
0
      logtrace(LogSlice, "cu_qp_delta_abs = %d\n", cu_qp_delta_abs);
3649
0
      logtrace(LogSlice, "cu_qp_delta_sign = %d\n", cu_qp_delta_sign);
3650
0
      logtrace(LogSlice, "CuQpDelta = %d\n", tctx->CuQpDelta);
3651
3652
0
      doDecodeQuantParameters = true;
3653
      //decode_quantization_parameters(tctx, x0,y0, xCUBase, yCUBase);
3654
0
    }
3655
3656
0
    if (tctx->shdr->cu_chroma_qp_offset_enabled_flag && cbfChroma &&
3657
0
        !tctx->cu_transquant_bypass_flag && !tctx->IsCuChromaQpOffsetCoded) {
3658
0
      logtrace(LogSlice, "# cu_chroma_qp_offset_flag\n");
3659
3660
0
      int cu_chroma_qp_offset_flag = tctx->cabac_decoder.decode_bit(
3661
0
                                                      &tctx->ctx_model[CONTEXT_MODEL_CU_CHROMA_QP_OFFSET_FLAG]);
3662
3663
3664
0
      const pic_parameter_set& pps = tctx->img->get_pps();
3665
3666
0
      int cu_chroma_qp_offset_idx = 0;
3667
0
      if (cu_chroma_qp_offset_flag && pps.range_extension.chroma_qp_offset_list_len > 1) {
3668
0
        cu_chroma_qp_offset_idx = tctx->cabac_decoder.decode_bit(
3669
0
                                                   &tctx->ctx_model[CONTEXT_MODEL_CU_CHROMA_QP_OFFSET_IDX]);
3670
0
      }
3671
3672
0
      tctx->IsCuChromaQpOffsetCoded = 1;
3673
3674
0
      if (cu_chroma_qp_offset_flag) {
3675
0
        tctx->CuQpOffsetCb = pps.range_extension.cb_qp_offset_list[cu_chroma_qp_offset_idx];
3676
0
        tctx->CuQpOffsetCr = pps.range_extension.cr_qp_offset_list[cu_chroma_qp_offset_idx];
3677
0
      }
3678
0
      else {
3679
0
        tctx->CuQpOffsetCb = 0;
3680
0
        tctx->CuQpOffsetCr = 0;
3681
0
      }
3682
3683
0
      doDecodeQuantParameters = true;
3684
      //decode_quantization_parameters(tctx, x0,y0, xCUBase, yCUBase);
3685
0
    }
3686
3687
3688
0
    if (doDecodeQuantParameters) {
3689
0
      decode_quantization_parameters(tctx, x0, y0, xCUBase, yCUBase);
3690
0
    }
3691
0
  }
3692
3693
  // position of TU in local CU
3694
  //int xL = x0 - xCUBase;
3695
  //int yL = y0 - yCUBase;
3696
0
  int nT = 1 << log2TrafoSize;
3697
0
  int nTC = 1 << log2TrafoSizeC;
3698
3699
0
  const int SubWidthC = sps.SubWidthC;
3700
0
  const int SubHeightC = sps.SubHeightC;
3701
3702
  // --- luma ---
3703
3704
0
  tctx->ResScaleVal = 0;
3705
3706
0
  int err;
3707
0
  if (cbf_luma) {
3708
0
    if ((err = residual_coding(tctx, x0, y0, log2TrafoSize, 0)) != DE265_OK) return err;
3709
0
  }
3710
3711
0
  decode_TU(tctx, x0, y0, xCUBase, yCUBase, nT, 0, cuPredMode, cbf_luma);
3712
3713
3714
  // --- chroma ---
3715
3716
  //const int yOffset422 = 1<<log2TrafoSizeC;
3717
3718
0
  if (log2TrafoSize > 2 || ChromaArrayType == CHROMA_444) {
3719
    // TODO: cross-component prediction
3720
3721
0
    const bool do_cross_component_prediction =
3722
0
    (tctx->img->get_pps().range_extension.cross_component_prediction_enabled_flag &&
3723
0
     cbf_luma &&
3724
0
     (cuPredMode == MODE_INTER || tctx->img->is_IntraPredModeC_Mode4(x0, y0)));
3725
3726
0
    if (do_cross_component_prediction) {
3727
0
      read_cross_comp_pred(tctx, 0);
3728
0
    }
3729
0
    else {
3730
0
      tctx->ResScaleVal = 0;
3731
0
    } {
3732
0
      if (cbf_cb & 1) {
3733
0
        if ((err = residual_coding(tctx, x0, y0, log2TrafoSizeC, 1)) != DE265_OK) return err;
3734
0
      }
3735
3736
0
      if (sps.ChromaArrayType != CHROMA_MONO) {
3737
0
        decode_TU(tctx,
3738
0
                  x0 / SubWidthC, y0 / SubHeightC,
3739
0
                  xCUBase / SubWidthC, yCUBase / SubHeightC, nTC, 1, cuPredMode, cbf_cb & 1);
3740
0
      }
3741
0
    }
3742
3743
    // 4:2:2
3744
0
    if (ChromaArrayType == CHROMA_422) {
3745
0
      const int yOffset = 1 << log2TrafoSizeC;
3746
3747
0
      if (cbf_cb & 2) {
3748
0
        if ((err = residual_coding(tctx,
3749
0
                                   x0, y0 + yOffset * SubHeightC,
3750
0
                                   log2TrafoSizeC, 1)) != DE265_OK)
3751
0
          return err;
3752
0
      }
3753
3754
0
      decode_TU(tctx,
3755
0
                x0 / SubWidthC, y0 / SubHeightC + yOffset,
3756
0
                xCUBase / SubWidthC, yCUBase / SubHeightC + yOffset,
3757
0
                nTC, 1, cuPredMode, cbf_cb & 2);
3758
0
    }
3759
3760
3761
0
    if (do_cross_component_prediction) {
3762
0
      read_cross_comp_pred(tctx, 1);
3763
0
    }
3764
0
    else {
3765
0
      tctx->ResScaleVal = 0;
3766
0
    } {
3767
0
      if (cbf_cr & 1) {
3768
0
        if ((err = residual_coding(tctx, x0, y0, log2TrafoSizeC, 2)) != DE265_OK) return err;
3769
0
      }
3770
3771
0
      if (sps.ChromaArrayType != CHROMA_MONO) {
3772
0
        decode_TU(tctx,
3773
0
                  x0 / SubWidthC, y0 / SubHeightC,
3774
0
                  xCUBase / SubWidthC, yCUBase / SubHeightC,
3775
0
                  nTC, 2, cuPredMode, cbf_cr & 1);
3776
0
      }
3777
0
    }
3778
3779
    // 4:2:2
3780
0
    if (ChromaArrayType == CHROMA_422) {
3781
0
      const int yOffset = 1 << log2TrafoSizeC;
3782
3783
0
      if (cbf_cr & 2) {
3784
0
        if ((err = residual_coding(tctx,
3785
0
                                   x0, y0 + yOffset * SubHeightC,
3786
0
                                   log2TrafoSizeC, 2)) != DE265_OK)
3787
0
          return err;
3788
0
      }
3789
3790
0
      decode_TU(tctx,
3791
0
                x0 / SubWidthC, y0 / SubHeightC + yOffset,
3792
0
                xCUBase / SubWidthC, yCUBase / SubHeightC + yOffset,
3793
0
                nTC, 2, cuPredMode, cbf_cr & 2);
3794
0
    }
3795
0
  }
3796
0
  else if (blkIdx == 3) {
3797
0
    if (cbf_cb & 1) {
3798
0
      if ((err = residual_coding(tctx, xBase, yBase,
3799
0
                                 log2TrafoSize, 1)) != DE265_OK)
3800
0
        return err;
3801
0
    }
3802
3803
0
    if (sps.ChromaArrayType != CHROMA_MONO) {
3804
0
      decode_TU(tctx,
3805
0
                xBase / SubWidthC, yBase / SubHeightC,
3806
0
                xCUBase / SubWidthC, yCUBase / SubHeightC, nT, 1, cuPredMode, cbf_cb & 1);
3807
0
    }
3808
3809
    // 4:2:2
3810
0
    if (cbf_cb & 2) {
3811
0
      if ((err = residual_coding(tctx,
3812
0
                                 xBase, yBase + (1 << log2TrafoSize),
3813
0
                                 log2TrafoSize, 1)) != DE265_OK)
3814
0
        return err;
3815
0
    }
3816
3817
0
    if (ChromaArrayType == CHROMA_422) {
3818
0
      decode_TU(tctx,
3819
0
                xBase / SubWidthC, yBase / SubHeightC + (1 << log2TrafoSize),
3820
0
                xCUBase / SubWidthC, yCUBase / SubHeightC, nT, 1, cuPredMode, cbf_cb & 2);
3821
0
    }
3822
3823
0
    if (cbf_cr & 1) {
3824
0
      if ((err = residual_coding(tctx, xBase, yBase,
3825
0
                                 log2TrafoSize, 2)) != 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, 2, cuPredMode, cbf_cr & 1);
3833
0
    }
3834
3835
    // 4:2:2
3836
0
    if (cbf_cr & 2) {
3837
0
      if ((err = residual_coding(tctx,
3838
0
                                 xBase, yBase + (1 << log2TrafoSizeC),
3839
0
                                 log2TrafoSize, 2)) != 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, 2, cuPredMode, cbf_cr & 2);
3847
0
    }
3848
0
  }
3849
3850
3851
0
  return DE265_OK;
3852
0
}
3853
3854
3855
#if 0
3856
static void dump_cbsize(de265_image* img)
3857
{
3858
  int w = img->get_width(0);
3859
  int h = img->get_height(0);
3860
3861
  for (int y = 0; y < h; y += 8) {
3862
    for (int x = 0; x < w; x += 8) {
3863
      printf("%d", img->get_log2CbSize(x, y));
3864
    }
3865
    printf("\n");
3866
  }
3867
}
3868
#endif
3869
3870
3871
void read_transform_tree(thread_context* tctx,
3872
                         int x0, int y0, // position of TU in frame
3873
                         int xBase, int yBase, // position of parent TU in frame
3874
                         int xCUBase, int yCUBase, // position of CU in frame
3875
                         int log2TrafoSize,
3876
                         int trafoDepth,
3877
                         int blkIdx,
3878
                         int MaxTrafoDepth,
3879
                         int IntraSplitFlag,
3880
                         enum PredMode cuPredMode,
3881
                         uint8_t parent_cbf_cb, uint8_t parent_cbf_cr)
3882
0
{
3883
0
  logtrace(LogSlice, "- read_transform_tree (interleaved) x0:%d y0:%d xBase:%d yBase:%d "
3884
0
           "log2TrafoSize:%d trafoDepth:%d MaxTrafoDepth:%d parent-cbf-cb:%d parent-cbf-cr:%d\n",
3885
0
           x0, y0, xBase, yBase, log2TrafoSize, trafoDepth, MaxTrafoDepth, parent_cbf_cb, parent_cbf_cr);
3886
3887
0
  de265_image* img = tctx->img;
3888
0
  const seq_parameter_set& sps = img->get_sps();
3889
3890
0
  int split_transform_flag;
3891
3892
0
  enum PredMode PredMode = img->get_pred_mode(x0, y0);
3893
0
  assert(PredMode == cuPredMode);
3894
3895
  /*  If TrafoSize is larger than maximum size   -> split automatically
3896
      If TrafoSize is at minimum size            -> do not split
3897
      If maximum transformation depth is reached -> do not split
3898
      If intra-prediction is NxN mode            -> split automatically (only at level 0)
3899
      Otherwise  ->  read split flag
3900
  */
3901
0
  if (log2TrafoSize <= sps.Log2MaxTrafoSize &&
3902
0
      log2TrafoSize > sps.Log2MinTrafoSize &&
3903
0
      trafoDepth < MaxTrafoDepth &&
3904
0
      !(IntraSplitFlag && trafoDepth == 0)) {
3905
0
    split_transform_flag = decode_split_transform_flag(tctx, log2TrafoSize);
3906
0
  }
3907
0
  else {
3908
0
    enum PartMode PartMode = img->get_PartMode(x0, y0);
3909
3910
0
    int interSplitFlag = (sps.max_transform_hierarchy_depth_inter == 0 &&
3911
0
                          trafoDepth == 0 &&
3912
0
                          PredMode == MODE_INTER &&
3913
0
                          PartMode != PART_2Nx2N);
3914
3915
0
    split_transform_flag = (log2TrafoSize > sps.Log2MaxTrafoSize ||
3916
0
                            (IntraSplitFlag == 1 && trafoDepth == 0) ||
3917
0
                            interSplitFlag == 1)
3918
0
                             ? 1
3919
0
                             : 0;
3920
0
  }
3921
3922
0
  if (split_transform_flag && log2TrafoSize <= sps.Log2MinTrafoSize) {
3923
    // TODO: it would be nice to have a flag "ignore_subsequent_errors" since the stream cannot be successfully decoded
3924
    //       after a bitstream error like this. But that would require that the error_queue is independent for each decoding thread
3925
    //       and that the flag is reset at a CABAC synchronization point. An alternative would be to simply stop the decoding this slice
3926
    //       after such an error.
3927
0
    img->decctx->add_warning(DE265_WARNING_INVALID_TU_BLOCK_SPLIT, true);
3928
0
    split_transform_flag = 0;
3929
0
  }
3930
3931
0
  if (split_transform_flag) {
3932
0
    logtrace(LogSlice, "set_split_transform_flag(%d,%d, %d)\n", x0, y0, trafoDepth);
3933
0
    img->set_split_transform_flag(x0, y0, trafoDepth);
3934
0
  }
3935
3936
0
  int cbf_cb = -1;
3937
0
  int cbf_cr = -1;
3938
3939
  // CBF_CB/CR flags are encoded like this:
3940
  // 4:2:0 and 4:4:4 modes: binary flag in bit 0
3941
  // 4:2:2 mode: bit 0: top block, bit 1: bottom block
3942
3943
0
  if ((log2TrafoSize > 2 && sps.ChromaArrayType != CHROMA_MONO) ||
3944
0
      sps.ChromaArrayType == CHROMA_444) {
3945
    // we do not have to test for trafoDepth==0, because parent_cbf_cb is 1 at depth 0
3946
0
    if (/*trafoDepth==0 ||*/ parent_cbf_cb) {
3947
0
      cbf_cb = decode_cbf_chroma(tctx, trafoDepth);
3948
3949
0
      if (sps.ChromaArrayType == CHROMA_422 && (!split_transform_flag || log2TrafoSize == 3)) {
3950
0
        cbf_cb |= (decode_cbf_chroma(tctx, trafoDepth) << 1);
3951
0
      }
3952
0
    }
3953
3954
    // we do not have to test for trafoDepth==0, because parent_cbf_cb is 1 at depth 0
3955
0
    if (/*trafoDepth==0 ||*/ parent_cbf_cr) {
3956
0
      cbf_cr = decode_cbf_chroma(tctx, trafoDepth);
3957
3958
0
      if (sps.ChromaArrayType == CHROMA_422 && (!split_transform_flag || log2TrafoSize == 3)) {
3959
0
        cbf_cr |= (decode_cbf_chroma(tctx, trafoDepth) << 1);
3960
0
      }
3961
0
    }
3962
0
  }
3963
3964
  //printf("CBF: cb:%d cr:%d\n",cbf_cb,cbf_cr);
3965
3966
  // cbf_cr/cbf_cb not present in bitstream -> induce values
3967
3968
0
  if (cbf_cb < 0) {
3969
0
    assert(!(trafoDepth==0 && log2TrafoSize==2));
3970
3971
    /* The standard specifies to check trafoDepth>0 AND log2TrafoSize==2.
3972
       However, I think that trafoDepth>0 is redundant as a CB is always
3973
       at least 8x8 and hence trafoDepth>0.
3974
    */
3975
3976
0
    if (trafoDepth > 0 && log2TrafoSize == 2) {
3977
0
      cbf_cb = parent_cbf_cb;
3978
0
    }
3979
0
    else {
3980
0
      cbf_cb = 0;
3981
0
    }
3982
0
  }
3983
3984
0
  if (cbf_cr < 0) {
3985
0
    if (trafoDepth > 0 && log2TrafoSize == 2) {
3986
0
      cbf_cr = parent_cbf_cr;
3987
0
    }
3988
0
    else {
3989
0
      cbf_cr = 0;
3990
0
    }
3991
0
  }
3992
3993
0
  if (split_transform_flag) {
3994
0
    int x1 = x0 + (1 << (log2TrafoSize - 1));
3995
0
    int y1 = y0 + (1 << (log2TrafoSize - 1));
3996
3997
0
    logtrace(LogSlice, "transform split.\n");
3998
3999
0
    read_transform_tree(tctx, x0, y0, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 0,
4000
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4001
0
    read_transform_tree(tctx, x1, y0, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 1,
4002
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4003
0
    read_transform_tree(tctx, x0, y1, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 2,
4004
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4005
0
    read_transform_tree(tctx, x1, y1, x0, y0, xCUBase, yCUBase, log2TrafoSize - 1, trafoDepth + 1, 3,
4006
0
                        MaxTrafoDepth, IntraSplitFlag, cuPredMode, cbf_cb, cbf_cr);
4007
0
  }
4008
0
  else {
4009
0
    int cbf_luma;
4010
4011
0
    if (PredMode == MODE_INTRA || trafoDepth != 0 || cbf_cb || cbf_cr) {
4012
0
      cbf_luma = decode_cbf_luma(tctx, trafoDepth);
4013
0
    }
4014
0
    else {
4015
      /* There cannot be INTER blocks with no residual data.
4016
         That case is already handled with rqt_root_cbf.
4017
      */
4018
4019
0
      cbf_luma = 1;
4020
0
    }
4021
4022
0
    logtrace(LogSlice, "call read_transform_unit %d/%d\n", x0, y0);
4023
4024
0
    read_transform_unit(tctx, x0, y0, xBase, yBase, xCUBase, yCUBase, log2TrafoSize, trafoDepth, blkIdx,
4025
0
                        cbf_luma, cbf_cb, cbf_cr);
4026
0
  }
4027
0
}
4028
4029
4030
const char* part_mode_name(enum PartMode pm)
4031
0
{
4032
0
  switch (pm) {
4033
0
    case PART_2Nx2N: return "2Nx2N";
4034
0
    case PART_2NxN: return "2NxN";
4035
0
    case PART_Nx2N: return "Nx2N";
4036
0
    case PART_NxN: return "NxN";
4037
0
    case PART_2NxnU: return "2NxnU";
4038
0
    case PART_2NxnD: return "2NxnD";
4039
0
    case PART_nLx2N: return "nLx2N";
4040
0
    case PART_nRx2N: return "nRx2N";
4041
0
  }
4042
4043
0
  return "undefined part mode";
4044
0
}
4045
4046
4047
void read_mvd_coding(thread_context* tctx,
4048
                     int x0, int y0, int refList)
4049
0
{
4050
0
  int abs_mvd_greater0_flag[2];
4051
0
  abs_mvd_greater0_flag[0] = tctx->cabac_decoder.decode_bit(
4052
0
                                              &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 0]);
4053
0
  abs_mvd_greater0_flag[1] = tctx->cabac_decoder.decode_bit(
4054
0
                                              &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 0]);
4055
4056
0
  int abs_mvd_greater1_flag[2];
4057
0
  if (abs_mvd_greater0_flag[0]) {
4058
0
    abs_mvd_greater1_flag[0] = tctx->cabac_decoder.decode_bit(
4059
0
                                                &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 1]);
4060
0
  }
4061
0
  else {
4062
0
    abs_mvd_greater1_flag[0] = 0;
4063
0
  }
4064
4065
0
  if (abs_mvd_greater0_flag[1]) {
4066
0
    abs_mvd_greater1_flag[1] = tctx->cabac_decoder.decode_bit(
4067
0
                                                &tctx->ctx_model[CONTEXT_MODEL_ABS_MVD_GREATER01_FLAG + 1]);
4068
0
  }
4069
0
  else {
4070
0
    abs_mvd_greater1_flag[1] = 0;
4071
0
  }
4072
4073
4074
0
  int mvd_sign_flag[2];
4075
0
  int16_t value[2];
4076
4077
0
  for (int c = 0; c < 2; c++) {
4078
0
    if (abs_mvd_greater0_flag[c]) {
4079
0
      int32_t absMvd;
4080
0
      if (abs_mvd_greater1_flag[c]) {
4081
0
        uint32_t abs_mvd_minus2 = tctx->cabac_decoder.decode_EGk_bypass( 1);
4082
        // MVD is clipped to [-32768, 32767], so cap abs value at 32768
4083
0
        absMvd = static_cast<int32_t>(std::min(abs_mvd_minus2, uint32_t{32768 - 2})) + 2;
4084
0
      }
4085
0
      else {
4086
0
        absMvd = 1;
4087
0
      }
4088
4089
0
      mvd_sign_flag[c] = tctx->cabac_decoder.decode_bypass();
4090
0
      int32_t mvd = mvd_sign_flag[c] ? -absMvd : absMvd;
4091
0
      value[c] = Clip3(-32768, 32767, mvd);
4092
0
    }
4093
0
    else {
4094
0
      value[c] = 0;
4095
0
    }
4096
0
  }
4097
4098
0
  tctx->motion.mvd[refList][0] = value[0];
4099
0
  tctx->motion.mvd[refList][1] = value[1];
4100
4101
0
  logtrace(LogSlice, "MVD[%d;%d|%d] = %d;%d\n", x0, y0, refList, value[0], value[1]);
4102
0
}
4103
4104
4105
void read_prediction_unit_SKIP(thread_context* tctx,
4106
                               int x0, int y0,
4107
                               int nPbW, int nPbH)
4108
0
{
4109
0
  int merge_idx = decode_merge_idx(tctx);
4110
4111
0
  tctx->motion.merge_idx = merge_idx;
4112
0
  tctx->motion.merge_flag = true;
4113
4114
0
  logtrace(LogSlice, "prediction skip 2Nx2N, merge_idx: %d\n", merge_idx);
4115
0
}
4116
4117
4118
/* xC/yC : CB position
4119
   xB/yB : position offset of the PB
4120
   nPbW/nPbH : size of PB
4121
   nCS   : CB size
4122
 */
4123
void read_prediction_unit(thread_context* tctx,
4124
                          int xC, int yC, int xB, int yB,
4125
                          int nPbW, int nPbH,
4126
                          int ctDepth, int nCS, int partIdx)
4127
0
{
4128
0
  logtrace(LogSlice, "read_prediction_unit %d;%d %dx%d\n", xC + xB, yC + xB, nPbW, nPbH);
4129
4130
0
  int x0 = xC + xB;
4131
0
  int y0 = yC + yB;
4132
4133
0
  slice_segment_header* shdr = tctx->shdr;
4134
4135
0
  int merge_flag = decode_merge_flag(tctx);
4136
0
  tctx->motion.merge_flag = merge_flag;
4137
4138
0
  if (merge_flag) {
4139
0
    int merge_idx = decode_merge_idx(tctx);
4140
4141
0
    logtrace(LogSlice, "prediction unit %d,%d, merge mode, index: %d\n", x0, y0, merge_idx);
4142
4143
0
    tctx->motion.merge_idx = merge_idx;
4144
0
  }
4145
0
  else {
4146
    // no merge flag
4147
0
    enum InterPredIdc inter_pred_idc;
4148
4149
0
    if (shdr->slice_type == SLICE_TYPE_B) {
4150
0
      inter_pred_idc = decode_inter_pred_idc(tctx, x0, y0, nPbW, nPbH, ctDepth);
4151
0
    }
4152
0
    else {
4153
0
      inter_pred_idc = PRED_L0;
4154
0
    }
4155
4156
0
    tctx->motion.inter_pred_idc = inter_pred_idc; // set_inter_pred_idc(ctx,x0,y0, inter_pred_idc);
4157
4158
0
    if (inter_pred_idc != PRED_L1) {
4159
0
      int ref_idx_l0 = decode_ref_idx_lX(tctx, shdr->num_ref_idx_l0_active);
4160
4161
      // NOTE: case for only one reference frame is handles in decode_ref_idx_lX()
4162
0
      if (ref_idx_l0 < 0 || ref_idx_l0 >= MAX_NUM_REF_PICS) {
4163
0
        tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4164
0
        tctx->decctx->add_warning(DE265_WARNING_NONEXISTING_REFERENCE_PICTURE_ACCESSED, false);
4165
0
        return;
4166
0
      }
4167
0
      tctx->motion.refIdx[0] = ref_idx_l0;
4168
4169
0
      read_mvd_coding(tctx, x0, y0, 0);
4170
4171
0
      int mvp_l0_flag = decode_mvp_lx_flag(tctx); // l0
4172
0
      tctx->motion.mvp_l0_flag = mvp_l0_flag;
4173
4174
0
      logtrace(LogSlice, "prediction unit %d,%d, L0, refIdx=%d mvp_l0_flag:%d\n",
4175
0
               x0, y0, tctx->motion.refIdx[0], mvp_l0_flag);
4176
0
    }
4177
4178
0
    if (inter_pred_idc != PRED_L0) {
4179
0
      int ref_idx_l1 = decode_ref_idx_lX(tctx, shdr->num_ref_idx_l1_active);
4180
4181
      // NOTE: case for only one reference frame is handles in decode_ref_idx_lX()
4182
0
      if (ref_idx_l1 < 0 || ref_idx_l1 >= MAX_NUM_REF_PICS) {
4183
0
        tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4184
0
        tctx->decctx->add_warning(DE265_WARNING_NONEXISTING_REFERENCE_PICTURE_ACCESSED, false);
4185
0
        return;
4186
0
      }
4187
0
      tctx->motion.refIdx[1] = ref_idx_l1;
4188
4189
0
      if (shdr->mvd_l1_zero_flag &&
4190
0
          inter_pred_idc == PRED_BI) {
4191
0
        tctx->motion.mvd[1][0] = 0;
4192
0
        tctx->motion.mvd[1][1] = 0;
4193
0
      }
4194
0
      else {
4195
0
        read_mvd_coding(tctx, x0, y0, 1);
4196
0
      }
4197
4198
0
      int mvp_l1_flag = decode_mvp_lx_flag(tctx); // l1
4199
0
      tctx->motion.mvp_l1_flag = mvp_l1_flag;
4200
4201
0
      logtrace(LogSlice, "prediction unit %d,%d, L1, refIdx=%d mvp_l1_flag:%d\n",
4202
0
               x0, y0, tctx->motion.refIdx[1], mvp_l1_flag);
4203
0
    }
4204
0
  }
4205
4206
4207
0
  decode_prediction_unit(tctx->decctx, tctx->shdr, tctx->img, tctx->motion,
4208
0
                         xC, yC, xB, yB, nCS, nPbW, nPbH, partIdx);
4209
0
}
4210
4211
4212
template<class pixel_t>
4213
void read_pcm_samples_internal(thread_context* tctx, int x0, int y0, int log2CbSize,
4214
                               int cIdx, bitreader& br)
4215
0
{
4216
0
  const seq_parameter_set& sps = tctx->img->get_sps();
4217
4218
0
  int nPcmBits;
4219
0
  int bitDepth;
4220
4221
0
  int w = 1 << log2CbSize;
4222
0
  int h = 1 << log2CbSize;
4223
4224
0
  if (cIdx > 0) {
4225
0
    w /= sps.SubWidthC;
4226
0
    h /= sps.SubHeightC;
4227
4228
0
    x0 /= sps.SubWidthC;
4229
0
    y0 /= sps.SubHeightC;
4230
4231
0
    nPcmBits = sps.pcm_sample_bit_depth_chroma;
4232
0
    bitDepth = sps.BitDepth_C;
4233
0
  }
4234
0
  else {
4235
0
    nPcmBits = sps.pcm_sample_bit_depth_luma;
4236
0
    bitDepth = sps.BitDepth_Y;
4237
0
  }
4238
4239
0
  pixel_t* ptr;
4240
0
  int stride;
4241
0
  ptr = tctx->img->get_image_plane_at_pos_NEW<pixel_t>(cIdx, x0, y0);
4242
0
  stride = tctx->img->get_image_stride(cIdx);
4243
4244
0
  int shift = bitDepth - nPcmBits;
4245
4246
  // a shift < 0 may result when the SPS sequence header is broken
4247
0
  if (shift < 0) {
4248
0
    shift = 0;
4249
0
  }
4250
4251
0
  for (int y = 0; y < h; y++)
4252
0
    for (int x = 0; x < w; x++) {
4253
0
      int value = br.get_bits(nPcmBits);
4254
0
      ptr[y * stride + x] = value << shift;
4255
0
    }
4256
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&)
4257
4258
static void read_pcm_samples(thread_context* tctx, int x0, int y0, int log2CbSize)
4259
0
{
4260
0
  bitreader br(tctx->cabac_decoder.bitstream_curr,
4261
0
               tctx->cabac_decoder.bitstream_end - tctx->cabac_decoder.bitstream_curr);
4262
4263
0
  if (tctx->img->high_bit_depth(0)) {
4264
0
    read_pcm_samples_internal<uint16_t>(tctx, x0, y0, log2CbSize, 0, br);
4265
0
  }
4266
0
  else {
4267
0
    read_pcm_samples_internal<uint8_t>(tctx, x0, y0, log2CbSize, 0, br);
4268
0
  }
4269
4270
0
  if (tctx->img->get_sps().ChromaArrayType != CHROMA_MONO) {
4271
0
    if (tctx->img->high_bit_depth(1)) {
4272
0
      read_pcm_samples_internal<uint16_t>(tctx, x0, y0, log2CbSize, 1, br);
4273
0
      read_pcm_samples_internal<uint16_t>(tctx, x0, y0, log2CbSize, 2, br);
4274
0
    }
4275
0
    else {
4276
0
      read_pcm_samples_internal<uint8_t>(tctx, x0, y0, log2CbSize, 1, br);
4277
0
      read_pcm_samples_internal<uint8_t>(tctx, x0, y0, log2CbSize, 2, br);
4278
0
    }
4279
0
  }
4280
4281
0
  br.prepare_for_CABAC();
4282
0
  tctx->cabac_decoder.bitstream_curr = br.data;
4283
0
  tctx->cabac_decoder.init_CABAC();
4284
0
}
4285
4286
4287
int map_chroma_pred_mode(int intra_chroma_pred_mode, int IntraPredMode)
4288
0
{
4289
0
  if (intra_chroma_pred_mode == 4) {
4290
0
    return IntraPredMode;
4291
0
  }
4292
0
  else {
4293
0
    static const enum IntraPredMode IntraPredModeCCand[4] = {
4294
0
      INTRA_PLANAR,
4295
0
      INTRA_ANGULAR_26, // vertical
4296
0
      INTRA_ANGULAR_10, // horizontal
4297
0
      INTRA_DC
4298
0
    };
4299
4300
0
    int IntraPredModeC = IntraPredModeCCand[intra_chroma_pred_mode];
4301
0
    if (IntraPredModeC == IntraPredMode) {
4302
0
      return INTRA_ANGULAR_34;
4303
0
    }
4304
0
    else {
4305
0
      return IntraPredModeC;
4306
0
    }
4307
0
  }
4308
0
}
4309
4310
// h.265-V2 Table 8-3
4311
static const uint8_t map_chroma_422[35] = {
4312
  0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
4313
  21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31
4314
};
4315
4316
void read_coding_unit(thread_context* tctx,
4317
                      int x0, int y0, // position of coding unit in frame
4318
                      int log2CbSize,
4319
                      int ctDepth)
4320
0
{
4321
0
  de265_image* img = tctx->img;
4322
0
  const seq_parameter_set& sps = img->get_sps();
4323
0
  const pic_parameter_set& pps = img->get_pps();
4324
0
  slice_segment_header* shdr = tctx->shdr;
4325
4326
0
  logtrace(LogSlice, "- read_coding_unit %d;%d cbsize:%d\n", x0, y0, 1 << log2CbSize);
4327
4328
4329
  //QQprintf("- read_coding_unit %d;%d cbsize:%d\n",x0,y0,1<<log2CbSize);
4330
4331
0
  img->set_log2CbSize(x0, y0, log2CbSize, true);
4332
4333
  /* This is only required on corrupted input streams.
4334
     It may happen that there are several slices in the image that overlap.
4335
     In this case, flags would accumulate from both slices.
4336
  */
4337
0
  img->clear_split_transform_flags(x0, y0, log2CbSize);
4338
4339
0
  int nCbS = 1 << log2CbSize; // number of coding block samples
4340
4341
0
  decode_quantization_parameters(tctx, x0, y0, x0, y0);
4342
4343
4344
0
  if (pps.transquant_bypass_enable_flag) {
4345
0
    int transquant_bypass = decode_transquant_bypass_flag(tctx);
4346
4347
0
    tctx->cu_transquant_bypass_flag = transquant_bypass;
4348
4349
0
    if (transquant_bypass) {
4350
0
      img->set_cu_transquant_bypass(x0, y0, log2CbSize);
4351
0
    }
4352
0
  }
4353
0
  else {
4354
0
    tctx->cu_transquant_bypass_flag = 0;
4355
0
  }
4356
4357
0
  uint8_t cu_skip_flag = 0;
4358
0
  if (shdr->slice_type != SLICE_TYPE_I) {
4359
0
    cu_skip_flag = decode_cu_skip_flag(tctx, x0, y0, ctDepth);
4360
0
  }
4361
4362
0
  int IntraSplitFlag = 0;
4363
4364
0
  enum PredMode cuPredMode;
4365
4366
0
  if (cu_skip_flag) {
4367
0
    read_prediction_unit_SKIP(tctx, x0, y0, nCbS, nCbS);
4368
4369
0
    img->set_PartMode(x0, y0, PART_2Nx2N); // need this for deblocking filter
4370
0
    img->set_pred_mode(x0, y0, log2CbSize, MODE_SKIP);
4371
0
    cuPredMode = MODE_SKIP;
4372
4373
0
    logtrace(LogSlice, "CU pred mode: SKIP\n");
4374
4375
4376
    // DECODE
4377
4378
0
    int nCS_L = 1 << log2CbSize;
4379
0
    decode_prediction_unit(tctx->decctx, tctx->shdr, tctx->img, tctx->motion,
4380
0
                           x0, y0, 0, 0, nCS_L, nCS_L, nCS_L, 0);
4381
0
  }
4382
0
  else /* not skipped */ {
4383
0
    if (shdr->slice_type != SLICE_TYPE_I) {
4384
0
      int pred_mode_flag = decode_pred_mode_flag(tctx);
4385
0
      cuPredMode = pred_mode_flag ? MODE_INTRA : MODE_INTER;
4386
0
    }
4387
0
    else {
4388
0
      cuPredMode = MODE_INTRA;
4389
0
    }
4390
4391
0
    img->set_pred_mode(x0, y0, log2CbSize, cuPredMode);
4392
4393
0
    logtrace(LogSlice, "CU pred mode: %s\n", cuPredMode == MODE_INTRA ? "INTRA" : "INTER");
4394
4395
4396
0
    enum PartMode PartMode;
4397
4398
0
    if (cuPredMode != MODE_INTRA ||
4399
0
        log2CbSize == sps.Log2MinCbSizeY) {
4400
0
      PartMode = decode_part_mode(tctx, cuPredMode, log2CbSize);
4401
4402
0
      if (PartMode == PART_NxN && cuPredMode == MODE_INTRA) {
4403
0
        IntraSplitFlag = 1;
4404
0
      }
4405
0
    }
4406
0
    else {
4407
0
      PartMode = PART_2Nx2N;
4408
0
    }
4409
4410
0
    img->set_PartMode(x0, y0, PartMode); // needed for deblocking ?
4411
4412
0
    logtrace(LogSlice, "PartMode: %s\n", part_mode_name(PartMode));
4413
4414
4415
0
    bool pcm_flag = false;
4416
4417
0
    if (cuPredMode == MODE_INTRA) {
4418
0
      if (PartMode == PART_2Nx2N && sps.pcm_enabled_flag &&
4419
0
          log2CbSize >= sps.Log2MinIpcmCbSizeY &&
4420
0
          log2CbSize <= sps.Log2MaxIpcmCbSizeY) {
4421
0
        pcm_flag = tctx->cabac_decoder.decode_term_bit();
4422
0
      }
4423
4424
0
      if (pcm_flag) {
4425
0
        img->set_pcm_flag(x0, y0, log2CbSize);
4426
4427
0
        read_pcm_samples(tctx, x0, y0, log2CbSize);
4428
0
      }
4429
0
      else {
4430
0
        int pbOffset = (PartMode == PART_NxN) ? (nCbS / 2) : nCbS;
4431
0
        int log2IntraPredSize = (PartMode == PART_NxN) ? (log2CbSize - 1) : log2CbSize;
4432
4433
0
        logtrace(LogSlice, "nCbS:%d pbOffset:%d\n", nCbS, pbOffset);
4434
4435
0
        int prev_intra_luma_pred_flag[4];
4436
4437
0
        int idx = 0;
4438
0
        for (int j = 0; j < nCbS; j += pbOffset)
4439
0
          for (int i = 0; i < nCbS; i += pbOffset) {
4440
0
            prev_intra_luma_pred_flag[idx++] = decode_prev_intra_luma_pred_flag(tctx);
4441
0
          }
4442
4443
0
        int mpm_idx[4], rem_intra_luma_pred_mode[4];
4444
0
        idx = 0;
4445
4446
0
        int availableA0 = check_CTB_available(img, x0, y0, x0 - 1, y0);
4447
0
        int availableB0 = check_CTB_available(img, x0, y0, x0, y0 - 1);
4448
4449
0
        for (int j = 0; j < nCbS; j += pbOffset)
4450
0
          for (int i = 0; i < nCbS; i += pbOffset) {
4451
0
            if (prev_intra_luma_pred_flag[idx]) {
4452
0
              mpm_idx[idx] = decode_mpm_idx(tctx);
4453
0
            }
4454
0
            else {
4455
0
              rem_intra_luma_pred_mode[idx] = decode_rem_intra_luma_pred_mode(tctx);
4456
0
            }
4457
4458
4459
0
            int x = x0 + i;
4460
0
            int y = y0 + j;
4461
4462
            // --- find intra prediction mode ---
4463
4464
0
            int IntraPredMode;
4465
4466
0
            int availableA = availableA0 || (i > 0); // left candidate always available for right blk
4467
0
            int availableB = availableB0 || (j > 0); // top candidate always available for bottom blk
4468
4469
4470
0
            int PUidx = (x >> sps.Log2MinPUSize) + (y >> sps.Log2MinPUSize) * sps.PicWidthInMinPUs;
4471
4472
0
            enum IntraPredMode candModeList[3];
4473
4474
0
            fillIntraPredModeCandidates(candModeList, x, y, PUidx,
4475
0
                                        availableA, availableB, img);
4476
4477
0
            for (int i = 0; i < 3; i++)
4478
0
              logtrace(LogSlice, "candModeList[%d] = %d\n", i, candModeList[i]);
4479
4480
0
            if (prev_intra_luma_pred_flag[idx] == 1) {
4481
0
              IntraPredMode = candModeList[mpm_idx[idx]];
4482
0
            }
4483
0
            else {
4484
              // sort candModeList
4485
4486
0
              if (candModeList[0] > candModeList[1]) {
4487
0
                std::swap(candModeList[0], candModeList[1]);
4488
0
              }
4489
0
              if (candModeList[0] > candModeList[2]) {
4490
0
                std::swap(candModeList[0], candModeList[2]);
4491
0
              }
4492
0
              if (candModeList[1] > candModeList[2]) {
4493
0
                std::swap(candModeList[1], candModeList[2]);
4494
0
              }
4495
4496
              // skip modes in the list
4497
              // (we have 35 modes. skipping the 3 in the list gives us 32, which can be selected by 5 bits)
4498
0
              IntraPredMode = rem_intra_luma_pred_mode[idx];
4499
0
              for (int n = 0; n <= 2; n++) {
4500
0
                if (IntraPredMode >= candModeList[n]) { IntraPredMode++; }
4501
0
              }
4502
0
            }
4503
4504
0
            logtrace(LogSlice, "IntraPredMode[%d][%d] = %d (log2blk:%d)\n", x, y, IntraPredMode, log2IntraPredSize);
4505
4506
0
            img->set_IntraPredMode(PUidx, log2IntraPredSize,
4507
0
                                   (enum IntraPredMode) IntraPredMode);
4508
4509
0
            idx++;
4510
0
          }
4511
4512
4513
        // set chroma intra prediction mode
4514
4515
0
        if (sps.ChromaArrayType == CHROMA_444) {
4516
          // chroma 4:4:4
4517
4518
0
          idx = 0;
4519
0
          for (int j = 0; j < nCbS; j += pbOffset)
4520
0
            for (int i = 0; i < nCbS; i += pbOffset) {
4521
0
              int x = x0 + i;
4522
0
              int y = y0 + j;
4523
4524
0
              int intra_chroma_pred_mode = decode_intra_chroma_pred_mode(tctx);
4525
0
              int IntraPredMode = img->get_IntraPredMode(x, y);
4526
4527
0
              int IntraPredModeC = map_chroma_pred_mode(intra_chroma_pred_mode, IntraPredMode);
4528
4529
0
              logtrace(LogSlice, "IntraPredModeC[%d][%d]: %d (blksize:%d)\n", x, y, IntraPredModeC,
4530
0
                       1 << log2IntraPredSize);
4531
4532
0
              img->set_IntraPredModeC(x, y, log2IntraPredSize,
4533
0
                                      (enum IntraPredMode) IntraPredModeC,
4534
0
                                      intra_chroma_pred_mode == 4);
4535
0
              idx++;
4536
0
            }
4537
0
        }
4538
0
        else if (sps.ChromaArrayType != CHROMA_MONO) {
4539
          // chroma 4:2:0 and 4:2:2
4540
4541
0
          int intra_chroma_pred_mode = decode_intra_chroma_pred_mode(tctx);
4542
0
          int IntraPredMode = img->get_IntraPredMode(x0, y0);
4543
0
          logtrace(LogSlice, "IntraPredMode: %d\n", IntraPredMode);
4544
0
          int IntraPredModeC = map_chroma_pred_mode(intra_chroma_pred_mode, IntraPredMode);
4545
4546
0
          if (sps.ChromaArrayType == CHROMA_422) {
4547
0
            IntraPredModeC = map_chroma_422[IntraPredModeC];
4548
0
          }
4549
4550
0
          img->set_IntraPredModeC(x0, y0, log2CbSize,
4551
0
                                  (enum IntraPredMode) IntraPredModeC,
4552
0
                                  intra_chroma_pred_mode == 4);
4553
0
        }
4554
0
      }
4555
0
    }
4556
0
    else {
4557
      // INTER
4558
0
      int nCS = 1 << log2CbSize;
4559
4560
0
      if (PartMode == PART_2Nx2N) {
4561
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS, ctDepth, nCS, 0);
4562
0
      }
4563
0
      else if (PartMode == PART_2NxN) {
4564
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS / 2, ctDepth, nCS, 0);
4565
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS / 2, nCbS, nCbS / 2, ctDepth, nCS, 1);
4566
0
      }
4567
0
      else if (PartMode == PART_Nx2N) {
4568
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS / 2, nCbS, ctDepth, nCS, 0);
4569
0
        read_prediction_unit(tctx, x0, y0, nCbS / 2, 0, nCbS / 2, nCbS, ctDepth, nCS, 1);
4570
0
      }
4571
0
      else if (PartMode == PART_2NxnU) {
4572
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS / 4, ctDepth, nCS, 0);
4573
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS / 4, nCbS, nCbS * 3 / 4, ctDepth, nCS, 1);
4574
0
      }
4575
0
      else if (PartMode == PART_2NxnD) {
4576
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS, nCbS * 3 / 4, ctDepth, nCS, 0);
4577
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS * 3 / 4, nCbS, nCbS / 4, ctDepth, nCS, 1);
4578
0
      }
4579
0
      else if (PartMode == PART_nLx2N) {
4580
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS / 4, nCbS, ctDepth, nCS, 0);
4581
0
        read_prediction_unit(tctx, x0, y0, nCbS / 4, 0, nCbS * 3 / 4, nCbS, ctDepth, nCS, 1);
4582
0
      }
4583
0
      else if (PartMode == PART_nRx2N) {
4584
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS * 3 / 4, nCbS, ctDepth, nCS, 0);
4585
0
        read_prediction_unit(tctx, x0, y0, nCbS * 3 / 4, 0, nCbS / 4, nCbS, ctDepth, nCS, 1);
4586
0
      }
4587
0
      else if (PartMode == PART_NxN) {
4588
0
        read_prediction_unit(tctx, x0, y0, 0, 0, nCbS / 2, nCbS / 2, ctDepth, nCS, 0);
4589
0
        read_prediction_unit(tctx, x0, y0, nCbS / 2, 0, nCbS / 2, nCbS / 2, ctDepth, nCS, 1);
4590
0
        read_prediction_unit(tctx, x0, y0, 0, nCbS / 2, nCbS / 2, nCbS / 2, ctDepth, nCS, 2);
4591
0
        read_prediction_unit(tctx, x0, y0, nCbS / 2, nCbS / 2, nCbS / 2, nCbS / 2, ctDepth, nCS, 3);
4592
0
      }
4593
0
      else {
4594
0
        assert(0); // undefined PartMode
4595
0
      }
4596
0
    } // INTER
4597
4598
4599
    // decode residual
4600
4601
0
    if (!pcm_flag) {
4602
      // !pcm
4603
0
      bool rqt_root_cbf;
4604
4605
0
      uint8_t merge_flag = tctx->motion.merge_flag; // !!get_merge_flag(ctx,x0,y0);
4606
4607
0
      if (cuPredMode != MODE_INTRA &&
4608
0
          !(PartMode == PART_2Nx2N && merge_flag)) {
4609
0
        rqt_root_cbf = !!decode_rqt_root_cbf(tctx);
4610
0
      }
4611
0
      else {
4612
        /* rqt_root_cbf=1 is inferred for Inter blocks with 2Nx2N, merge mode.
4613
           These must be some residual data, because otherwise, the CB could
4614
           also be coded in SKIP mode.
4615
         */
4616
4617
0
        rqt_root_cbf = true;
4618
0
      }
4619
4620
      //set_rqt_root_cbf(ctx,x0,y0, log2CbSize, rqt_root_cbf);
4621
4622
0
      if (rqt_root_cbf) {
4623
0
        int MaxTrafoDepth;
4624
4625
0
        if (cuPredMode == MODE_INTRA) {
4626
0
          MaxTrafoDepth = sps.max_transform_hierarchy_depth_intra + IntraSplitFlag;
4627
0
        }
4628
0
        else {
4629
0
          MaxTrafoDepth = sps.max_transform_hierarchy_depth_inter;
4630
0
        }
4631
4632
0
        logtrace(LogSlice, "MaxTrafoDepth: %d\n", MaxTrafoDepth);
4633
4634
0
        uint8_t initial_chroma_cbf = 1;
4635
0
        if (sps.ChromaArrayType == CHROMA_MONO) {
4636
0
          initial_chroma_cbf = 0;
4637
0
        }
4638
4639
0
        read_transform_tree(tctx, x0, y0, x0, y0, x0, y0, log2CbSize, 0, 0,
4640
0
                            MaxTrafoDepth, IntraSplitFlag, cuPredMode,
4641
0
                            initial_chroma_cbf, initial_chroma_cbf);
4642
0
      }
4643
0
    } // !pcm
4644
0
  }
4645
0
}
4646
4647
4648
// ------------------------------------------------------------------------------------------
4649
4650
4651
void read_coding_quadtree(thread_context* tctx,
4652
                          int x0, int y0,
4653
                          int log2CbSize,
4654
                          int ctDepth)
4655
0
{
4656
0
  logtrace(LogSlice, "- read_coding_quadtree %d;%d cbsize:%d depth:%d POC:%d\n", x0, y0, 1 << log2CbSize, ctDepth, tctx->img->PicOrderCntVal);
4657
4658
0
  de265_image* img = tctx->img;
4659
0
  const seq_parameter_set& sps = img->get_sps();
4660
0
  const pic_parameter_set& pps = img->get_pps();
4661
4662
0
  int split_flag;
4663
4664
  // We only send a split flag if CU is larger than minimum size and
4665
  // completely contained within the image area.
4666
  // If it is partly outside the image area and not at minimum size,
4667
  // it is split. If already at minimum size, it is not split further.
4668
0
  if (x0 + (1 << log2CbSize) <= sps.pic_width_in_luma_samples &&
4669
0
      y0 + (1 << log2CbSize) <= sps.pic_height_in_luma_samples &&
4670
0
      log2CbSize > sps.Log2MinCbSizeY) {
4671
0
    split_flag = decode_split_cu_flag(tctx, x0, y0, ctDepth);
4672
0
  }
4673
0
  else {
4674
0
    if (log2CbSize > sps.Log2MinCbSizeY) { split_flag = 1; }
4675
0
    else { split_flag = 0; }
4676
0
  }
4677
4678
4679
0
  if (pps.cu_qp_delta_enabled_flag &&
4680
0
      log2CbSize >= pps.Log2MinCuQpDeltaSize) {
4681
0
    tctx->IsCuQpDeltaCoded = 0;
4682
0
    tctx->CuQpDelta = 0;
4683
0
  }
4684
0
  else {
4685
    // shdr->CuQpDelta = 0; // TODO check: is this the right place to set to default value ?
4686
0
  }
4687
4688
4689
0
  if (tctx->shdr->cu_chroma_qp_offset_enabled_flag &&
4690
0
      log2CbSize >= pps.Log2MinCuChromaQpOffsetSize) {
4691
0
    tctx->IsCuChromaQpOffsetCoded = 0;
4692
0
  }
4693
4694
0
  if (split_flag) {
4695
0
    int x1 = x0 + (1 << (log2CbSize - 1));
4696
0
    int y1 = y0 + (1 << (log2CbSize - 1));
4697
4698
0
    read_coding_quadtree(tctx, x0, y0, log2CbSize - 1, ctDepth + 1);
4699
4700
0
    if (x1 < sps.pic_width_in_luma_samples)
4701
0
      read_coding_quadtree(tctx, x1, y0, log2CbSize - 1, ctDepth + 1);
4702
4703
0
    if (y1 < sps.pic_height_in_luma_samples)
4704
0
      read_coding_quadtree(tctx, x0, y1, log2CbSize - 1, ctDepth + 1);
4705
4706
0
    if (x1 < sps.pic_width_in_luma_samples &&
4707
0
        y1 < sps.pic_height_in_luma_samples)
4708
0
      read_coding_quadtree(tctx, x1, y1, log2CbSize - 1, ctDepth + 1);
4709
0
  }
4710
0
  else {
4711
    // set ctDepth of this CU
4712
4713
0
    img->set_ctDepth(x0, y0, log2CbSize, ctDepth);
4714
4715
0
    read_coding_unit(tctx, x0, y0, log2CbSize, ctDepth);
4716
0
  }
4717
4718
0
  logtrace(LogSlice, "-\n");
4719
0
}
4720
4721
4722
// ---------------------------------------------------------------------------
4723
4724
enum DecodeResult
4725
{
4726
  Decode_EndOfSliceSegment,
4727
  Decode_EndOfSubstream,
4728
  Decode_Error
4729
};
4730
4731
/* Decode CTBs until the end of sub-stream, the end-of-slice, or some error occurs.
4732
 */
4733
enum DecodeResult decode_substream(thread_context* tctx,
4734
                                   bool block_wpp, // block on WPP dependencies
4735
                                   bool first_independent_substream)
4736
0
{
4737
0
  const pic_parameter_set& pps = tctx->img->get_pps();
4738
0
  const seq_parameter_set& sps = tctx->img->get_sps();
4739
4740
0
  const uint16_t ctbW = sps.PicWidthInCtbsY;
4741
0
  const uint16_t startCtbY = tctx->CtbY;
4742
4743
  //printf("start decoding substream at %d;%d\n",tctx->CtbX,tctx->CtbY);
4744
4745
  // in WPP mode: initialize CABAC model with stored model from row above
4746
4747
0
  if ((!first_independent_substream || tctx->CtbY != startCtbY) &&
4748
0
      pps.entropy_coding_sync_enabled_flag &&
4749
0
      tctx->CtbY >= 1 && tctx->CtbX == 0) {
4750
0
    if (sps.PicWidthInCtbsY > 1) {
4751
0
      assert(tctx->CtbY >= 1);
4752
0
      if (static_cast<size_t>(tctx->CtbY - 1) >= tctx->imgunit->ctx_models.size()) {
4753
0
        return Decode_Error;
4754
0
      }
4755
4756
      //printf("CTX wait on %d/%d\n",1,tctx->CtbY-1);
4757
4758
      // we have to wait until the context model data is there
4759
0
      tctx->img->wait_for_progress(tctx->task, 1, tctx->CtbY - 1,CTB_PROGRESS_PREFILTER);
4760
4761
      // Copy the CABAC model (and StatCoeff state) saved by the row above.
4762
      // No lock is needed: the producer stores into ctx_models[CtbY-1] before
4763
      // it signals the progress of CTB (1, CtbY-1), and the acquire load in
4764
      // wait_for_progress() above pairs with that release store. The slot has
4765
      // exactly one producer and one consumer, and after the copy/release
4766
      // below nobody touches it again. See image_unit::ctx_models for why a
4767
      // consumer can never skip this wait.
4768
0
      tctx->ctx_model = tctx->imgunit->ctx_models[(tctx->CtbY - 1)];
4769
0
      tctx->imgunit->ctx_models[(tctx->CtbY - 1)].release(); // not used anymore
4770
4771
      // also restore the StatCoeff[] state for persistent_rice_adaptation
4772
0
      for (int i = 0; i < 4; i++) {
4773
0
        tctx->StatCoeff[i] = tctx->imgunit->StatCoeff_models[(tctx->CtbY - 1)][i];
4774
0
      }
4775
0
    }
4776
0
    else {
4777
0
      tctx->img->wait_for_progress(tctx->task, 0, tctx->CtbY - 1,CTB_PROGRESS_PREFILTER);
4778
0
      initialize_CABAC_models(tctx);
4779
0
    }
4780
0
  }
4781
4782
4783
0
  do {
4784
0
    const uint32_t ctbx = tctx->CtbX;
4785
0
    const uint32_t ctby = tctx->CtbY;
4786
4787
0
    if (ctbx + ctby * ctbW >= pps.scan->CtbAddrRStoTS.size()) {
4788
0
      return Decode_Error;
4789
0
    }
4790
4791
0
    if (ctbx >= sps.PicWidthInCtbsY ||
4792
0
        ctby >= sps.PicHeightInCtbsY) {
4793
0
      return Decode_Error;
4794
0
    }
4795
4796
0
    if (block_wpp && ctby > 0 && ctbx + 1 < ctbW) {
4797
      // TODO: if we are in tiles mode and at the right border, do not wait for x+1,y-1
4798
4799
      //printf("wait on %d/%d (%d)\n",ctbx+1,ctby-1, ctbx+1+(ctby-1)*sps->PicWidthInCtbsY);
4800
4801
0
      tctx->img->wait_for_progress(tctx->task, ctbx + 1, ctby - 1, CTB_PROGRESS_PREFILTER);
4802
0
    }
4803
4804
    //printf("%p: decode %d;%d\n", tctx, tctx->CtbX,tctx->CtbY);
4805
4806
4807
    // read and decode CTB
4808
4809
0
    if (tctx->ctx_model.empty() == false) {
4810
0
      return Decode_Error;
4811
0
    }
4812
4813
0
    read_coding_tree_unit(tctx);
4814
4815
4816
    // save CABAC-model for WPP (except in last CTB row)
4817
4818
0
    if (pps.entropy_coding_sync_enabled_flag &&
4819
0
        ctbx == 1 &&
4820
0
        ctby + 1 < sps.PicHeightInCtbsY) {
4821
      // no storage for context table has been allocated
4822
0
      if (tctx->imgunit->ctx_models.size() <= ctby) {
4823
0
        return Decode_Error;
4824
0
      }
4825
4826
      // Store an independent copy of the CABAC model (and StatCoeff state) for
4827
      // the row below to pick up. This store must stay ahead of the
4828
      // set_progress(CTB_PROGRESS_PREFILTER) for this CTB further down: that
4829
      // release store publishes the slot to the consumer row task, which waits
4830
      // for CTB (1, ctby) with an acquire load before reading it. No lock is
4831
      // needed, see image_unit::ctx_models.
4832
0
      tctx->imgunit->ctx_models[ctby] = tctx->ctx_model;
4833
0
      tctx->imgunit->ctx_models[ctby].decouple(); // store an independent copy
4834
4835
      // also save the StatCoeff[] state for persistent_rice_adaptation
4836
0
      for (int i = 0; i < 4; i++) {
4837
0
        tctx->imgunit->StatCoeff_models[ctby][i] = tctx->StatCoeff[i];
4838
0
      }
4839
0
    }
4840
4841
4842
    // end of slice segment ?
4843
4844
0
    int end_of_slice_segment_flag = tctx->cabac_decoder.decode_term_bit();
4845
    //printf("end-of-slice flag: %d\n", end_of_slice_segment_flag);
4846
4847
0
    if (end_of_slice_segment_flag) {
4848
      // at the end of the slice segment, we store the CABAC model if we need it
4849
      // because a dependent slice may follow
4850
4851
0
      if (pps.dependent_slice_segments_enabled_flag) {
4852
0
        tctx->shdr->ctx_model_storage = tctx->ctx_model;
4853
0
        tctx->shdr->ctx_model_storage.decouple(); // store an independent copy
4854
4855
        // also save the StatCoeff[] state for persistent_rice_adaptation
4856
0
        for (int i = 0; i < 4; i++) {
4857
0
          tctx->shdr->ctx_model_storage_StatCoeff[i] = tctx->StatCoeff[i];
4858
0
        }
4859
4860
0
        tctx->shdr->ctx_model_storage_defined = true;
4861
0
      }
4862
0
    }
4863
4864
0
    tctx->img->ctb_progress[ctbx + ctby * ctbW].set_progress(CTB_PROGRESS_PREFILTER);
4865
4866
    //printf("%p: decoded %d|%d\n",tctx, ctby,ctbx);
4867
4868
4869
0
    logtrace(LogSlice, "read CTB %d -> end=%d\n", tctx->CtbAddrInRS, end_of_slice_segment_flag);
4870
    //printf("read CTB %d -> end=%d\n", tctx->CtbAddrInRS, end_of_slice_segment_flag);
4871
4872
0
    const int lastCtbY = tctx->CtbY;
4873
4874
0
    bool endOfPicture = advanceCtbAddr(tctx); // true if we read past the end of the image
4875
4876
0
    if (endOfPicture &&
4877
0
        end_of_slice_segment_flag == false) {
4878
0
      tctx->decctx->add_warning(DE265_WARNING_CTB_OUTSIDE_IMAGE_AREA, false);
4879
0
      tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4880
0
      return Decode_Error;
4881
0
    }
4882
4883
4884
0
    if (end_of_slice_segment_flag) {
4885
      /* corrupted inputs may send the end_of_slice_segment_flag even if not all
4886
         CTBs in a row have been coded. Hence, we mark all of them as finished.
4887
       */
4888
4889
      /*
4890
      for (int x = ctbx+1 ; x<sps->PicWidthInCtbsY; x++) {
4891
        printf("mark skipped %d;%d\n",ctbx,ctby);
4892
        tctx->img->ctb_progress[ctbx+ctby*ctbW].set_progress(CTB_PROGRESS_PREFILTER);
4893
      }
4894
      */
4895
4896
0
      return Decode_EndOfSliceSegment;
4897
0
    }
4898
4899
4900
0
    if (!end_of_slice_segment_flag) {
4901
0
      bool end_of_sub_stream = false;
4902
0
      end_of_sub_stream |= (pps.tiles_enabled_flag &&
4903
0
                            pps.scan->TileId[tctx->CtbAddrInTS] != pps.scan->TileId[tctx->CtbAddrInTS - 1]);
4904
0
      end_of_sub_stream |= (pps.entropy_coding_sync_enabled_flag &&
4905
0
                            lastCtbY != tctx->CtbY);
4906
4907
0
      if (end_of_sub_stream) {
4908
0
        int end_of_sub_stream_one_bit = tctx->cabac_decoder.decode_term_bit();
4909
0
        if (!end_of_sub_stream_one_bit) {
4910
0
          tctx->decctx->add_warning(DE265_WARNING_EOSS_BIT_NOT_SET, false);
4911
0
          tctx->img->integrity = INTEGRITY_DECODING_ERRORS;
4912
0
          return Decode_Error;
4913
0
        }
4914
4915
0
        tctx->cabac_decoder.init_CABAC(); // byte alignment
4916
0
        return Decode_EndOfSubstream;
4917
0
      }
4918
0
    }
4919
0
  } while (true);
4920
0
}
4921
4922
4923
bool initialize_CABAC_at_slice_segment_start(thread_context* tctx)
4924
0
{
4925
0
  de265_image* img = tctx->img;
4926
0
  const pic_parameter_set& pps = img->get_pps();
4927
0
  const seq_parameter_set& sps = img->get_sps();
4928
0
  slice_segment_header* shdr = tctx->shdr;
4929
4930
0
  if (shdr->dependent_slice_segment_flag) {
4931
0
    int prevCtb = pps.scan->CtbAddrTStoRS[pps.scan->CtbAddrRStoTS[shdr->slice_segment_address] - 1];
4932
4933
0
    uint16_t sliceIdx = img->get_SliceHeaderIndex_atIndex(prevCtb);
4934
0
    if (sliceIdx >= img->slices.size()) {
4935
0
      return false;
4936
0
    }
4937
0
    slice_segment_header* prevCtbHdr = img->slices[sliceIdx];
4938
4939
0
    if (pps.is_tile_start_CTB(shdr->slice_segment_address % sps.PicWidthInCtbsY,
4940
0
                              shdr->slice_segment_address / sps.PicWidthInCtbsY
4941
0
                             )) {
4942
0
      initialize_CABAC_models(tctx);
4943
0
    }
4944
0
    else {
4945
      // wait for previous slice to finish decoding
4946
4947
      //printf("wait for previous slice to finish decoding\n");
4948
4949
4950
0
      slice_unit* prevSliceSegment = tctx->imgunit->get_prev_slice_segment(tctx->sliceunit);
4951
      //assert(prevSliceSegment);
4952
0
      if (prevSliceSegment == nullptr) {
4953
0
        return false;
4954
0
      }
4955
4956
0
      prevSliceSegment->finished_threads.wait_for_progress(prevSliceSegment->nThreads);
4957
4958
4959
      /*
4960
      printf("wait for %d,%d (init)\n",
4961
             prevCtb / sps->PicWidthInCtbsY,
4962
             prevCtb % sps->PicWidthInCtbsY);
4963
      tctx->img->wait_for_progress(tctx->task, prevCtb, CTB_PROGRESS_PREFILTER);
4964
      */
4965
4966
0
      if (!prevCtbHdr->ctx_model_storage_defined) {
4967
0
        return false;
4968
0
      }
4969
4970
0
      tctx->ctx_model = prevCtbHdr->ctx_model_storage;
4971
0
      prevCtbHdr->ctx_model_storage.release();
4972
4973
      // also restore the StatCoeff[] state for persistent_rice_adaptation
4974
0
      for (int i = 0; i < 4; i++) {
4975
0
        tctx->StatCoeff[i] = prevCtbHdr->ctx_model_storage_StatCoeff[i];
4976
0
      }
4977
0
    }
4978
0
  }
4979
0
  else {
4980
0
    initialize_CABAC_models(tctx);
4981
0
  }
4982
4983
0
  return true;
4984
0
}
4985
4986
4987
std::string thread_task_ctb_row::name() const
4988
0
{
4989
0
  char buf[100];
4990
0
  sprintf(buf, "ctb-row-%d", debug_startCtbRow);
4991
0
  return buf;
4992
0
}
4993
4994
4995
std::string thread_task_slice_segment::name() const
4996
0
{
4997
0
  char buf[100];
4998
0
  sprintf(buf, "slice-segment-%d;%d", debug_startCtbX, debug_startCtbY);
4999
0
  return buf;
5000
0
}
5001
5002
5003
void thread_task_slice_segment::work()
5004
0
{
5005
0
  thread_task_slice_segment* data = this;
5006
0
  thread_context* tctx = data->tctx;
5007
0
  de265_image* img = tctx->img;
5008
5009
0
  state = Running;
5010
0
  img->thread_run(this);
5011
5012
0
  setCtbAddrFromTS(tctx);
5013
5014
  //printf("%p: A start decoding at %d/%d\n", tctx, tctx->CtbX,tctx->CtbY);
5015
5016
0
  if (data->firstSliceSubstream) {
5017
0
    bool success = initialize_CABAC_at_slice_segment_start(tctx);
5018
0
    if (!success) {
5019
0
      state = Finished;
5020
0
      tctx->sliceunit->finished_threads.increase_progress(1);
5021
0
      img->thread_finishes(this);
5022
0
      return;
5023
0
    }
5024
0
  }
5025
0
  else {
5026
0
    initialize_CABAC_models(tctx);
5027
0
  }
5028
5029
0
  tctx->cabac_decoder.init_CABAC();
5030
5031
  /*enum DecodeResult result =*/
5032
0
  decode_substream(tctx, false, data->firstSliceSubstream);
5033
5034
0
  state = Finished;
5035
0
  tctx->sliceunit->finished_threads.increase_progress(1);
5036
0
  img->thread_finishes(this);
5037
5038
0
  return; // DE265_OK;
5039
0
}
5040
5041
5042
void thread_task_ctb_row::work()
5043
0
{
5044
0
  thread_task_ctb_row* data = this;
5045
0
  thread_context* tctx = data->tctx;
5046
0
  de265_image* img = tctx->img;
5047
5048
0
  const seq_parameter_set& sps = img->get_sps();
5049
0
  int ctbW = sps.PicWidthInCtbsY;
5050
5051
0
  state = Running;
5052
0
  img->thread_run(this);
5053
5054
0
  setCtbAddrFromTS(tctx);
5055
5056
0
  int ctby = tctx->CtbAddrInRS / ctbW;
5057
0
  int myCtbRow = ctby;
5058
5059
  //printf("start CTB-row decoding at row %d\n", ctby);
5060
5061
0
  if (data->firstSliceSubstream) {
5062
0
    bool success = initialize_CABAC_at_slice_segment_start(tctx);
5063
0
    if (!success) {
5064
      // could not decode this row, mark whole row as finished
5065
0
      for (int x = 0; x < ctbW; x++) {
5066
0
        img->ctb_progress[myCtbRow * ctbW + x].set_progress(CTB_PROGRESS_PREFILTER);
5067
0
      }
5068
5069
0
      state = Finished;
5070
0
      tctx->sliceunit->finished_threads.increase_progress(1);
5071
0
      img->thread_finishes(this);
5072
0
      return;
5073
0
    }
5074
    //initialize_CABAC(tctx);
5075
0
  }
5076
5077
0
  tctx->cabac_decoder.init_CABAC();
5078
5079
0
  bool firstIndependentSubstream =
5080
0
      data->firstSliceSubstream && !tctx->shdr->dependent_slice_segment_flag;
5081
5082
  /*enum DecodeResult result =*/
5083
0
  decode_substream(tctx, true, firstIndependentSubstream);
5084
5085
  // mark progress on remaining CTBs in row (in case of decoder error and early termination)
5086
5087
  // TODO: what about slices that end properly in the middle of a CTB row?
5088
5089
0
  if (tctx->CtbY == myCtbRow) {
5090
0
    int lastCtbX = sps.PicWidthInCtbsY; // assume no tiles when WPP is on
5091
0
    for (int x = tctx->CtbX; x < lastCtbX; x++) {
5092
0
      if (x < sps.PicWidthInCtbsY &&
5093
0
          myCtbRow < sps.PicHeightInCtbsY) {
5094
0
        img->ctb_progress[myCtbRow * ctbW + x].set_progress(CTB_PROGRESS_PREFILTER);
5095
0
      }
5096
0
    }
5097
0
  }
5098
5099
0
  state = Finished;
5100
0
  tctx->sliceunit->finished_threads.increase_progress(1);
5101
0
  img->thread_finishes(this);
5102
0
}
5103
5104
5105
de265_error read_slice_segment_data(thread_context* tctx)
5106
0
{
5107
0
  setCtbAddrFromTS(tctx);
5108
5109
0
  de265_image* img = tctx->img;
5110
0
  const pic_parameter_set& pps = img->get_pps();
5111
  //const seq_parameter_set& sps = img->get_sps();
5112
0
  slice_segment_header* shdr = tctx->shdr;
5113
5114
0
  bool success = initialize_CABAC_at_slice_segment_start(tctx);
5115
0
  if (!success) {
5116
0
    return DE265_ERROR_UNSPECIFIED_DECODING_ERROR;
5117
0
  }
5118
5119
0
  tctx->cabac_decoder.init_CABAC();
5120
5121
  //printf("-----\n");
5122
5123
0
  bool first_slice_substream = !shdr->dependent_slice_segment_flag;
5124
5125
0
  uint32_t substream = 0;
5126
5127
0
  enum DecodeResult result;
5128
0
  do {
5129
    //int ctby = tctx->CtbY;
5130
5131
5132
    // check whether entry_points[] are correct in the bitstream
5133
5134
0
    if (substream > 0) {
5135
0
      if (substream - 1 >= tctx->shdr->entry_point_offset.size() ||
5136
0
          tctx->cabac_decoder.bitstream_curr - tctx->cabac_decoder.bitstream_start - 2 /* -2 because of CABAC init */
5137
0
          != tctx->shdr->entry_point_offset[substream - 1]) {
5138
0
        tctx->decctx->add_warning(DE265_WARNING_INCORRECT_ENTRY_POINT_OFFSET, true);
5139
0
      }
5140
0
    }
5141
5142
0
    substream++;
5143
5144
5145
0
    result = decode_substream(tctx, false, first_slice_substream);
5146
5147
5148
0
    if (result == Decode_EndOfSliceSegment ||
5149
0
        result == Decode_Error) {
5150
0
      break;
5151
0
    }
5152
5153
0
    first_slice_substream = false;
5154
5155
0
    if (pps.tiles_enabled_flag) {
5156
0
      initialize_CABAC_models(tctx);
5157
0
    }
5158
0
  } while (true);
5159
5160
0
  return DE265_OK;
5161
0
}
5162
5163
5164
/* TODO:
5165
   When a task wants to block, but is the first in the list of pending tasks,
5166
   do some error concealment instead of blocking, since it will never be deblocked.
5167
   This will only happen in the case of input error.
5168
 */