FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
hevc_ps.c
Go to the documentation of this file.
1 /*
2  * HEVC Parameter Set decoding
3  *
4  * Copyright (C) 2012 - 2103 Guillaume Martres
5  * Copyright (C) 2012 - 2103 Mickael Raulet
6  * Copyright (C) 2012 - 2013 Gildas Cocherel
7  * Copyright (C) 2013 Vittorio Giovara
8  *
9  * This file is part of FFmpeg.
10  *
11  * FFmpeg is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * FFmpeg is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with FFmpeg; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24  */
25 
26 #include "libavutil/imgutils.h"
27 #include "golomb.h"
28 #include "hevc.h"
29 
31  16, 16, 16, 16, 17, 18, 21, 24,
32  16, 16, 16, 16, 17, 19, 22, 25,
33  16, 16, 17, 18, 20, 22, 25, 29,
34  16, 16, 18, 21, 24, 27, 31, 36,
35  17, 17, 20, 24, 30, 35, 41, 47,
36  18, 19, 22, 27, 35, 44, 54, 65,
37  21, 22, 25, 31, 41, 54, 70, 88,
38  24, 25, 29, 36, 47, 65, 88, 115
39 };
40 
42  16, 16, 16, 16, 17, 18, 20, 24,
43  16, 16, 16, 17, 18, 20, 24, 25,
44  16, 16, 17, 18, 20, 24, 25, 28,
45  16, 17, 18, 20, 24, 25, 28, 33,
46  17, 18, 20, 24, 25, 28, 33, 41,
47  18, 20, 24, 25, 28, 33, 41, 54,
48  20, 24, 25, 28, 33, 41, 54, 71,
49  24, 25, 28, 33, 41, 54, 71, 91
50 };
51 
52 static const AVRational vui_sar[] = {
53  { 0, 1 },
54  { 1, 1 },
55  { 12, 11 },
56  { 10, 11 },
57  { 16, 11 },
58  { 40, 33 },
59  { 24, 11 },
60  { 20, 11 },
61  { 32, 11 },
62  { 80, 33 },
63  { 18, 11 },
64  { 15, 11 },
65  { 64, 33 },
66  { 160, 99 },
67  { 4, 3 },
68  { 3, 2 },
69  { 2, 1 },
70 };
71 
73  const HEVCSPS *sps, int is_slice_header)
74 {
75  HEVCLocalContext *lc = s->HEVClc;
76  uint8_t rps_predict = 0;
77  int delta_poc;
78  int k0 = 0;
79  int k1 = 0;
80  int k = 0;
81  int i;
82 
83  GetBitContext *gb = &lc->gb;
84 
85  if (rps != sps->st_rps && sps->nb_st_rps)
86  rps_predict = get_bits1(gb);
87 
88  if (rps_predict) {
89  const ShortTermRPS *rps_ridx;
90  int delta_rps, abs_delta_rps;
91  uint8_t use_delta_flag = 0;
92  uint8_t delta_rps_sign;
93 
94  if (is_slice_header) {
95  unsigned int delta_idx = get_ue_golomb_long(gb) + 1;
96  if (delta_idx > sps->nb_st_rps) {
98  "Invalid value of delta_idx in slice header RPS: %d > %d.\n",
99  delta_idx, sps->nb_st_rps);
100  return AVERROR_INVALIDDATA;
101  }
102  rps_ridx = &sps->st_rps[sps->nb_st_rps - delta_idx];
103  } else
104  rps_ridx = &sps->st_rps[rps - sps->st_rps - 1];
105 
106  delta_rps_sign = get_bits1(gb);
107  abs_delta_rps = get_ue_golomb_long(gb) + 1;
108  delta_rps = (1 - (delta_rps_sign << 1)) * abs_delta_rps;
109  for (i = 0; i <= rps_ridx->num_delta_pocs; i++) {
110  int used = rps->used[k] = get_bits1(gb);
111 
112  if (!used)
113  use_delta_flag = get_bits1(gb);
114 
115  if (used || use_delta_flag) {
116  if (i < rps_ridx->num_delta_pocs)
117  delta_poc = delta_rps + rps_ridx->delta_poc[i];
118  else
119  delta_poc = delta_rps;
120  rps->delta_poc[k] = delta_poc;
121  if (delta_poc < 0)
122  k0++;
123  else
124  k1++;
125  k++;
126  }
127  }
128 
129  rps->num_delta_pocs = k;
130  rps->num_negative_pics = k0;
131  // sort in increasing order (smallest first)
132  if (rps->num_delta_pocs != 0) {
133  int used, tmp;
134  for (i = 1; i < rps->num_delta_pocs; i++) {
135  delta_poc = rps->delta_poc[i];
136  used = rps->used[i];
137  for (k = i - 1; k >= 0; k--) {
138  tmp = rps->delta_poc[k];
139  if (delta_poc < tmp) {
140  rps->delta_poc[k + 1] = tmp;
141  rps->used[k + 1] = rps->used[k];
142  rps->delta_poc[k] = delta_poc;
143  rps->used[k] = used;
144  }
145  }
146  }
147  }
148  if ((rps->num_negative_pics >> 1) != 0) {
149  int used;
150  k = rps->num_negative_pics - 1;
151  // flip the negative values to largest first
152  for (i = 0; i < rps->num_negative_pics >> 1; i++) {
153  delta_poc = rps->delta_poc[i];
154  used = rps->used[i];
155  rps->delta_poc[i] = rps->delta_poc[k];
156  rps->used[i] = rps->used[k];
157  rps->delta_poc[k] = delta_poc;
158  rps->used[k] = used;
159  k--;
160  }
161  }
162  } else {
163  unsigned int prev, nb_positive_pics;
165  nb_positive_pics = get_ue_golomb_long(gb);
166 
167  if (rps->num_negative_pics >= MAX_REFS ||
168  nb_positive_pics >= MAX_REFS) {
169  av_log(s->avctx, AV_LOG_ERROR, "Too many refs in a short term RPS.\n");
170  return AVERROR_INVALIDDATA;
171  }
172 
173  rps->num_delta_pocs = rps->num_negative_pics + nb_positive_pics;
174  if (rps->num_delta_pocs) {
175  prev = 0;
176  for (i = 0; i < rps->num_negative_pics; i++) {
177  delta_poc = get_ue_golomb_long(gb) + 1;
178  prev -= delta_poc;
179  rps->delta_poc[i] = prev;
180  rps->used[i] = get_bits1(gb);
181  }
182  prev = 0;
183  for (i = 0; i < nb_positive_pics; i++) {
184  delta_poc = get_ue_golomb_long(gb) + 1;
185  prev += delta_poc;
186  rps->delta_poc[rps->num_negative_pics + i] = prev;
187  rps->used[rps->num_negative_pics + i] = get_bits1(gb);
188  }
189  }
190  }
191  return 0;
192 }
193 
194 
196 {
197  int i;
198  HEVCLocalContext *lc = s->HEVClc;
199  GetBitContext *gb = &lc->gb;
200 
201  ptl->profile_space = get_bits(gb, 2);
202  ptl->tier_flag = get_bits1(gb);
203  ptl->profile_idc = get_bits(gb, 5);
204  if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN)
205  av_log(s->avctx, AV_LOG_DEBUG, "Main profile bitstream\n");
206  else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_10)
207  av_log(s->avctx, AV_LOG_DEBUG, "Main 10 profile bitstream\n");
209  av_log(s->avctx, AV_LOG_DEBUG, "Main Still Picture profile bitstream\n");
210  else if (ptl->profile_idc == FF_PROFILE_HEVC_REXT)
211  av_log(s->avctx, AV_LOG_DEBUG, "Range Extension profile bitstream\n");
212  else
213  av_log(s->avctx, AV_LOG_WARNING, "Unknown HEVC profile: %d\n", ptl->profile_idc);
214 
215  for (i = 0; i < 32; i++)
221 
222  skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15]
223  skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31]
224  skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43]
225 }
226 
227 static void parse_ptl(HEVCContext *s, PTL *ptl, int max_num_sub_layers)
228 {
229  int i;
230  HEVCLocalContext *lc = s->HEVClc;
231  GetBitContext *gb = &lc->gb;
233  ptl->general_ptl.level_idc = get_bits(gb, 8);
234 
235  for (i = 0; i < max_num_sub_layers - 1; i++) {
238  }
239  if (max_num_sub_layers - 1> 0)
240  for (i = max_num_sub_layers - 1; i < 8; i++)
241  skip_bits(gb, 2); // reserved_zero_2bits[i]
242  for (i = 0; i < max_num_sub_layers - 1; i++) {
243  if (ptl->sub_layer_profile_present_flag[i])
245  if (ptl->sub_layer_level_present_flag[i])
246  ptl->sub_layer_ptl[i].level_idc = get_bits(gb, 8);
247  }
248 }
249 
250 static void decode_sublayer_hrd(HEVCContext *s, unsigned int nb_cpb,
251  int subpic_params_present)
252 {
253  GetBitContext *gb = &s->HEVClc->gb;
254  int i;
255 
256  for (i = 0; i < nb_cpb; i++) {
257  get_ue_golomb_long(gb); // bit_rate_value_minus1
258  get_ue_golomb_long(gb); // cpb_size_value_minus1
259 
260  if (subpic_params_present) {
261  get_ue_golomb_long(gb); // cpb_size_du_value_minus1
262  get_ue_golomb_long(gb); // bit_rate_du_value_minus1
263  }
264  skip_bits1(gb); // cbr_flag
265  }
266 }
267 
268 static void decode_hrd(HEVCContext *s, int common_inf_present,
269  int max_sublayers)
270 {
271  GetBitContext *gb = &s->HEVClc->gb;
272  int nal_params_present = 0, vcl_params_present = 0;
273  int subpic_params_present = 0;
274  int i;
275 
276  if (common_inf_present) {
277  nal_params_present = get_bits1(gb);
278  vcl_params_present = get_bits1(gb);
279 
280  if (nal_params_present || vcl_params_present) {
281  subpic_params_present = get_bits1(gb);
282 
283  if (subpic_params_present) {
284  skip_bits(gb, 8); // tick_divisor_minus2
285  skip_bits(gb, 5); // du_cpb_removal_delay_increment_length_minus1
286  skip_bits(gb, 1); // sub_pic_cpb_params_in_pic_timing_sei_flag
287  skip_bits(gb, 5); // dpb_output_delay_du_length_minus1
288  }
289 
290  skip_bits(gb, 4); // bit_rate_scale
291  skip_bits(gb, 4); // cpb_size_scale
292 
293  if (subpic_params_present)
294  skip_bits(gb, 4); // cpb_size_du_scale
295 
296  skip_bits(gb, 5); // initial_cpb_removal_delay_length_minus1
297  skip_bits(gb, 5); // au_cpb_removal_delay_length_minus1
298  skip_bits(gb, 5); // dpb_output_delay_length_minus1
299  }
300  }
301 
302  for (i = 0; i < max_sublayers; i++) {
303  int low_delay = 0;
304  unsigned int nb_cpb = 1;
305  int fixed_rate = get_bits1(gb);
306 
307  if (!fixed_rate)
308  fixed_rate = get_bits1(gb);
309 
310  if (fixed_rate)
311  get_ue_golomb_long(gb); // elemental_duration_in_tc_minus1
312  else
313  low_delay = get_bits1(gb);
314 
315  if (!low_delay)
316  nb_cpb = get_ue_golomb_long(gb) + 1;
317 
318  if (nal_params_present)
319  decode_sublayer_hrd(s, nb_cpb, subpic_params_present);
320  if (vcl_params_present)
321  decode_sublayer_hrd(s, nb_cpb, subpic_params_present);
322  }
323 }
324 
326 {
327  int i,j;
328  GetBitContext *gb = &s->HEVClc->gb;
329  int vps_id = 0;
330  HEVCVPS *vps;
331  AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps));
332 
333  if (!vps_buf)
334  return AVERROR(ENOMEM);
335  vps = (HEVCVPS*)vps_buf->data;
336 
337  av_log(s->avctx, AV_LOG_DEBUG, "Decoding VPS\n");
338 
339  vps_id = get_bits(gb, 4);
340  if (vps_id >= MAX_VPS_COUNT) {
341  av_log(s->avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", vps_id);
342  goto err;
343  }
344 
345  if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits
346  av_log(s->avctx, AV_LOG_ERROR, "vps_reserved_three_2bits is not three\n");
347  goto err;
348  }
349 
350  vps->vps_max_layers = get_bits(gb, 6) + 1;
351  vps->vps_max_sub_layers = get_bits(gb, 3) + 1;
353 
354  if (get_bits(gb, 16) != 0xffff) { // vps_reserved_ffff_16bits
355  av_log(s->avctx, AV_LOG_ERROR, "vps_reserved_ffff_16bits is not 0xffff\n");
356  goto err;
357  }
358 
359  if (vps->vps_max_sub_layers > MAX_SUB_LAYERS) {
360  av_log(s->avctx, AV_LOG_ERROR, "vps_max_sub_layers out of range: %d\n",
361  vps->vps_max_sub_layers);
362  goto err;
363  }
364 
365  parse_ptl(s, &vps->ptl, vps->vps_max_sub_layers);
366 
368 
370  for (; i < vps->vps_max_sub_layers; i++) {
374 
376  av_log(s->avctx, AV_LOG_ERROR, "vps_max_dec_pic_buffering_minus1 out of range: %d\n",
377  vps->vps_max_dec_pic_buffering[i] - 1);
378  goto err;
379  }
380  if (vps->vps_num_reorder_pics[i] > vps->vps_max_dec_pic_buffering[i] - 1) {
381  av_log(s->avctx, AV_LOG_WARNING, "vps_max_num_reorder_pics out of range: %d\n",
382  vps->vps_num_reorder_pics[i]);
384  goto err;
385  }
386  }
387 
388  vps->vps_max_layer_id = get_bits(gb, 6);
389  vps->vps_num_layer_sets = get_ue_golomb_long(gb) + 1;
390  if ((vps->vps_num_layer_sets - 1LL) * (vps->vps_max_layer_id + 1LL) > get_bits_left(gb)) {
391  av_log(s->avctx, AV_LOG_ERROR, "too many layer_id_included_flags\n");
392  goto err;
393  }
394 
395  for (i = 1; i < vps->vps_num_layer_sets; i++)
396  for (j = 0; j <= vps->vps_max_layer_id; j++)
397  skip_bits(gb, 1); // layer_id_included_flag[i][j]
398 
400  if (vps->vps_timing_info_present_flag) {
401  vps->vps_num_units_in_tick = get_bits_long(gb, 32);
402  vps->vps_time_scale = get_bits_long(gb, 32);
407  for (i = 0; i < vps->vps_num_hrd_parameters; i++) {
408  int common_inf_present = 1;
409 
410  get_ue_golomb_long(gb); // hrd_layer_set_idx
411  if (i)
412  common_inf_present = get_bits1(gb);
413  decode_hrd(s, common_inf_present, vps->vps_max_sub_layers);
414  }
415  }
416  get_bits1(gb); /* vps_extension_flag */
417 
418  av_buffer_unref(&s->vps_list[vps_id]);
419  s->vps_list[vps_id] = vps_buf;
420  return 0;
421 
422 err:
423  av_buffer_unref(&vps_buf);
424  return AVERROR_INVALIDDATA;
425 }
426 
427 static void decode_vui(HEVCContext *s, HEVCSPS *sps)
428 {
429  VUI *vui = &sps->vui;
430  GetBitContext *gb = &s->HEVClc->gb;
431  int sar_present;
432 
433  av_log(s->avctx, AV_LOG_DEBUG, "Decoding VUI\n");
434 
435  sar_present = get_bits1(gb);
436  if (sar_present) {
437  uint8_t sar_idx = get_bits(gb, 8);
438  if (sar_idx < FF_ARRAY_ELEMS(vui_sar))
439  vui->sar = vui_sar[sar_idx];
440  else if (sar_idx == 255) {
441  vui->sar.num = get_bits(gb, 16);
442  vui->sar.den = get_bits(gb, 16);
443  } else
445  "Unknown SAR index: %u.\n", sar_idx);
446  }
447 
451 
454  vui->video_format = get_bits(gb, 3);
455  vui->video_full_range_flag = get_bits1(gb);
460  vui->colour_primaries = get_bits(gb, 8);
461  vui->transfer_characteristic = get_bits(gb, 8);
462  vui->matrix_coeffs = get_bits(gb, 8);
463 
464  // Set invalid values to "unspecified"
465  if (vui->colour_primaries >= AVCOL_PRI_NB)
469  if (vui->matrix_coeffs >= AVCOL_SPC_NB)
471  }
472  }
473 
475  if (vui->chroma_loc_info_present_flag) {
478  }
479 
481  vui->field_seq_flag = get_bits1(gb);
483 
485  if (vui->default_display_window_flag) {
486  //TODO: * 2 is only valid for 420
491 
492  if (s->apply_defdispwin &&
495  "discarding vui default display window, "
496  "original values are l:%u r:%u t:%u b:%u\n",
501 
504  vui->def_disp_win.top_offset =
505  vui->def_disp_win.bottom_offset = 0;
506  }
507  }
508 
510 
511  if (vui->vui_timing_info_present_flag) {
512  vui->vui_num_units_in_tick = get_bits_long(gb, 32);
513  vui->vui_time_scale = get_bits_long(gb, 32);
519  decode_hrd(s, 1, sps->max_sub_layers);
520  }
521 
523  if (vui->bitstream_restriction_flag) {
532  }
533 }
534 
536 {
537  int matrixId;
538 
539  for (matrixId = 0; matrixId < 6; matrixId++) {
540  // 4x4 default is 16
541  memset(sl->sl[0][matrixId], 16, 16);
542  sl->sl_dc[0][matrixId] = 16; // default for 16x16
543  sl->sl_dc[1][matrixId] = 16; // default for 32x32
544  }
545  memcpy(sl->sl[1][0], default_scaling_list_intra, 64);
546  memcpy(sl->sl[1][1], default_scaling_list_intra, 64);
547  memcpy(sl->sl[1][2], default_scaling_list_intra, 64);
548  memcpy(sl->sl[1][3], default_scaling_list_inter, 64);
549  memcpy(sl->sl[1][4], default_scaling_list_inter, 64);
550  memcpy(sl->sl[1][5], default_scaling_list_inter, 64);
551  memcpy(sl->sl[2][0], default_scaling_list_intra, 64);
552  memcpy(sl->sl[2][1], default_scaling_list_intra, 64);
553  memcpy(sl->sl[2][2], default_scaling_list_intra, 64);
554  memcpy(sl->sl[2][3], default_scaling_list_inter, 64);
555  memcpy(sl->sl[2][4], default_scaling_list_inter, 64);
556  memcpy(sl->sl[2][5], default_scaling_list_inter, 64);
557  memcpy(sl->sl[3][0], default_scaling_list_intra, 64);
558  memcpy(sl->sl[3][1], default_scaling_list_inter, 64);
559 }
560 
562 {
563  GetBitContext *gb = &s->HEVClc->gb;
564  uint8_t scaling_list_pred_mode_flag[4][6];
565  int32_t scaling_list_dc_coef[2][6];
566  int size_id, matrix_id, i, pos;
567 
568  for (size_id = 0; size_id < 4; size_id++)
569  for (matrix_id = 0; matrix_id < (size_id == 3 ? 2 : 6); matrix_id++) {
570  scaling_list_pred_mode_flag[size_id][matrix_id] = get_bits1(gb);
571  if (!scaling_list_pred_mode_flag[size_id][matrix_id]) {
572  unsigned int delta = get_ue_golomb_long(gb);
573  /* Only need to handle non-zero delta. Zero means default,
574  * which should already be in the arrays. */
575  if (delta) {
576  // Copy from previous array.
577  if (matrix_id < delta) {
579  "Invalid delta in scaling list data: %d.\n", delta);
580  return AVERROR_INVALIDDATA;
581  }
582 
583  memcpy(sl->sl[size_id][matrix_id],
584  sl->sl[size_id][matrix_id - delta],
585  size_id > 0 ? 64 : 16);
586  if (size_id > 1)
587  sl->sl_dc[size_id - 2][matrix_id] = sl->sl_dc[size_id - 2][matrix_id - delta];
588  }
589  } else {
590  int next_coef, coef_num;
591  int32_t scaling_list_delta_coef;
592 
593  next_coef = 8;
594  coef_num = FFMIN(64, 1 << (4 + (size_id << 1)));
595  if (size_id > 1) {
596  scaling_list_dc_coef[size_id - 2][matrix_id] = get_se_golomb(gb) + 8;
597  next_coef = scaling_list_dc_coef[size_id - 2][matrix_id];
598  sl->sl_dc[size_id - 2][matrix_id] = next_coef;
599  }
600  for (i = 0; i < coef_num; i++) {
601  if (size_id == 0)
602  pos = 4 * ff_hevc_diag_scan4x4_y[i] +
604  else
605  pos = 8 * ff_hevc_diag_scan8x8_y[i] +
607 
608  scaling_list_delta_coef = get_se_golomb(gb);
609  next_coef = (next_coef + scaling_list_delta_coef + 256) % 256;
610  sl->sl[size_id][matrix_id][pos] = next_coef;
611  }
612  }
613  }
614 
615  return 0;
616 }
617 
619 {
620  const AVPixFmtDescriptor *desc;
621  GetBitContext *gb = &s->HEVClc->gb;
622  int ret = 0;
623  unsigned int sps_id = 0;
624  int log2_diff_max_min_transform_block_size;
625  int bit_depth_chroma, start, vui_present, sublayer_ordering_info;
626  int i;
627 
628  HEVCSPS *sps;
629  AVBufferRef *sps_buf = av_buffer_allocz(sizeof(*sps));
630 
631  if (!sps_buf)
632  return AVERROR(ENOMEM);
633  sps = (HEVCSPS*)sps_buf->data;
634 
635  av_log(s->avctx, AV_LOG_DEBUG, "Decoding SPS\n");
636 
637  // Coded parameters
638 
639  sps->vps_id = get_bits(gb, 4);
640  if (sps->vps_id >= MAX_VPS_COUNT) {
641  av_log(s->avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", sps->vps_id);
642  ret = AVERROR_INVALIDDATA;
643  goto err;
644  }
645 
646  if (!s->vps_list[sps->vps_id]) {
647  av_log(s->avctx, AV_LOG_ERROR, "VPS %d does not exist\n",
648  sps->vps_id);
649  ret = AVERROR_INVALIDDATA;
650  goto err;
651  }
652 
653  sps->max_sub_layers = get_bits(gb, 3) + 1;
654  if (sps->max_sub_layers > MAX_SUB_LAYERS) {
655  av_log(s->avctx, AV_LOG_ERROR, "sps_max_sub_layers out of range: %d\n",
656  sps->max_sub_layers);
657  ret = AVERROR_INVALIDDATA;
658  goto err;
659  }
660 
661  skip_bits1(gb); // temporal_id_nesting_flag
662 
663  parse_ptl(s, &sps->ptl, sps->max_sub_layers);
664 
665  sps_id = get_ue_golomb_long(gb);
666  if (sps_id >= MAX_SPS_COUNT) {
667  av_log(s->avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", sps_id);
668  ret = AVERROR_INVALIDDATA;
669  goto err;
670  }
671 
673  if (!(sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2 || sps->chroma_format_idc == 3)) {
674  avpriv_report_missing_feature(s->avctx, "chroma_format_idc != {1, 2, 3}\n");
675  ret = AVERROR_PATCHWELCOME;
676  goto err;
677  }
678 
679  if (sps->chroma_format_idc == 3)
681 
683  sps->chroma_format_idc = 0;
684 
685  sps->width = get_ue_golomb_long(gb);
686  sps->height = get_ue_golomb_long(gb);
687  if ((ret = av_image_check_size(sps->width,
688  sps->height, 0, s->avctx)) < 0)
689  goto err;
690 
691  if (get_bits1(gb)) { // pic_conformance_flag
692  //TODO: * 2 is only valid for 420
697 
700  "discarding sps conformance window, "
701  "original values are l:%u r:%u t:%u b:%u\n",
706 
709  sps->pic_conf_win.top_offset =
710  sps->pic_conf_win.bottom_offset = 0;
711  }
712  sps->output_window = sps->pic_conf_win;
713  }
714 
715  sps->bit_depth = get_ue_golomb_long(gb) + 8;
716  bit_depth_chroma = get_ue_golomb_long(gb) + 8;
717  if (bit_depth_chroma != sps->bit_depth) {
719  "Luma bit depth (%d) is different from chroma bit depth (%d), "
720  "this is unsupported.\n",
721  sps->bit_depth, bit_depth_chroma);
722  ret = AVERROR_INVALIDDATA;
723  goto err;
724  }
725 
726  switch (sps->bit_depth) {
727  case 8:
728  if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P;
729  if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P;
730  if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P;
731  break;
732  case 9:
733  if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P9;
734  if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P9;
735  if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P9;
736  break;
737  case 10:
738  if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10;
739  if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10;
740  if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10;
741  break;
742  case 12:
743  if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12;
744  if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12;
745  if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12;
746  break;
747  default:
749  "4:2:0, 4:2:2, 4:4:4 supports are currently specified for 8, 10 and 12 bits.\n");
750  return AVERROR_PATCHWELCOME;
751  }
752 
753  desc = av_pix_fmt_desc_get(sps->pix_fmt);
754  if (!desc) {
755  ret = AVERROR(EINVAL);
756  goto err;
757  }
758 
759  sps->hshift[0] = sps->vshift[0] = 0;
760  sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
761  sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;
762 
763  sps->pixel_shift = sps->bit_depth > 8;
764 
765  sps->log2_max_poc_lsb = get_ue_golomb_long(gb) + 4;
766  if (sps->log2_max_poc_lsb > 16) {
767  av_log(s->avctx, AV_LOG_ERROR, "log2_max_pic_order_cnt_lsb_minus4 out range: %d\n",
768  sps->log2_max_poc_lsb - 4);
769  ret = AVERROR_INVALIDDATA;
770  goto err;
771  }
772 
773  sublayer_ordering_info = get_bits1(gb);
774  start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1;
775  for (i = start; i < sps->max_sub_layers; i++) {
780  av_log(s->avctx, AV_LOG_ERROR, "sps_max_dec_pic_buffering_minus1 out of range: %d\n",
782  ret = AVERROR_INVALIDDATA;
783  goto err;
784  }
786  av_log(s->avctx, AV_LOG_WARNING, "sps_max_num_reorder_pics out of range: %d\n",
788  if (s->avctx->err_recognition & AV_EF_EXPLODE ||
790  ret = AVERROR_INVALIDDATA;
791  goto err;
792  }
794  }
795  }
796 
797  if (!sublayer_ordering_info) {
798  for (i = 0; i < start; i++) {
802  }
803  }
804 
805  sps->log2_min_cb_size = get_ue_golomb_long(gb) + 3;
807  sps->log2_min_tb_size = get_ue_golomb_long(gb) + 2;
808  log2_diff_max_min_transform_block_size = get_ue_golomb_long(gb);
809  sps->log2_max_trafo_size = log2_diff_max_min_transform_block_size +
810  sps->log2_min_tb_size;
811 
812  if (sps->log2_min_tb_size >= sps->log2_min_cb_size) {
813  av_log(s->avctx, AV_LOG_ERROR, "Invalid value for log2_min_tb_size");
814  ret = AVERROR_INVALIDDATA;
815  goto err;
816  }
819 
821  if (sps->scaling_list_enable_flag) {
823 
824  if (get_bits1(gb)) {
825  ret = scaling_list_data(s, &sps->scaling_list);
826  if (ret < 0)
827  goto err;
828  }
829  }
830 
831  sps->amp_enabled_flag = get_bits1(gb);
832  sps->sao_enabled = get_bits1(gb);
833 
834  sps->pcm_enabled_flag = get_bits1(gb);
835  if (sps->pcm_enabled_flag) {
836  sps->pcm.bit_depth = get_bits(gb, 4) + 1;
837  sps->pcm.bit_depth_chroma = get_bits(gb, 4) + 1;
840  get_ue_golomb_long(gb);
841  if (sps->pcm.bit_depth > sps->bit_depth) {
843  "PCM bit depth (%d) is greater than normal bit depth (%d)\n",
844  sps->pcm.bit_depth, sps->bit_depth);
845  ret = AVERROR_INVALIDDATA;
846  goto err;
847  }
848 
850  }
851 
852  sps->nb_st_rps = get_ue_golomb_long(gb);
853  if (sps->nb_st_rps > MAX_SHORT_TERM_RPS_COUNT) {
854  av_log(s->avctx, AV_LOG_ERROR, "Too many short term RPS: %d.\n",
855  sps->nb_st_rps);
856  ret = AVERROR_INVALIDDATA;
857  goto err;
858  }
859  for (i = 0; i < sps->nb_st_rps; i++) {
860  if ((ret = ff_hevc_decode_short_term_rps(s, &sps->st_rps[i],
861  sps, 0)) < 0)
862  goto err;
863  }
864 
868  for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) {
871  }
872  }
873 
876  sps->vui.sar = (AVRational){0, 1};
877  vui_present = get_bits1(gb);
878  if (vui_present)
879  decode_vui(s, sps);
880 
881  if (get_bits1(gb)) { // sps_extension_flag
882  int sps_extension_flag[1];
883  for (i = 0; i < 1; i++)
884  sps_extension_flag[i] = get_bits1(gb);
885  skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7);
886  if (sps_extension_flag[0]) {
887  int extended_precision_processing_flag;
888  int high_precision_offsets_enabled_flag;
889  int cabac_bypass_alignment_enabled_flag;
890 
894 
896 
897  extended_precision_processing_flag = get_bits1(gb);
898  if (extended_precision_processing_flag)
900  "extended_precision_processing_flag not yet implemented\n");
901 
903  high_precision_offsets_enabled_flag = get_bits1(gb);
904  if (high_precision_offsets_enabled_flag)
906  "high_precision_offsets_enabled_flag not yet implemented\n");
907 
909 
910  cabac_bypass_alignment_enabled_flag = get_bits1(gb);
911  if (cabac_bypass_alignment_enabled_flag)
913  "cabac_bypass_alignment_enabled_flag not yet implemented\n");
914  }
915  }
916  if (s->apply_defdispwin) {
921  }
922  if (sps->output_window.left_offset & (0x1F >> (sps->pixel_shift)) &&
923  !(s->avctx->flags & CODEC_FLAG_UNALIGNED)) {
924  sps->output_window.left_offset &= ~(0x1F >> (sps->pixel_shift));
925  av_log(s->avctx, AV_LOG_WARNING, "Reducing left output window to %d "
926  "chroma samples to preserve alignment.\n",
928  }
929  sps->output_width = sps->width -
931  sps->output_height = sps->height -
933  if (sps->output_width <= 0 || sps->output_height <= 0) {
934  av_log(s->avctx, AV_LOG_WARNING, "Invalid visible frame dimensions: %dx%d.\n",
935  sps->output_width, sps->output_height);
936  if (s->avctx->err_recognition & AV_EF_EXPLODE) {
937  ret = AVERROR_INVALIDDATA;
938  goto err;
939  }
941  "Displaying the whole video surface.\n");
944  sps->pic_conf_win.top_offset =
945  sps->pic_conf_win.bottom_offset = 0;
946  sps->output_width = sps->width;
947  sps->output_height = sps->height;
948  }
949 
950  // Inferred parameters
951  sps->log2_ctb_size = sps->log2_min_cb_size +
953  sps->log2_min_pu_size = sps->log2_min_cb_size - 1;
954 
955  sps->ctb_width = (sps->width + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
956  sps->ctb_height = (sps->height + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
957  sps->ctb_size = sps->ctb_width * sps->ctb_height;
958 
959  sps->min_cb_width = sps->width >> sps->log2_min_cb_size;
960  sps->min_cb_height = sps->height >> sps->log2_min_cb_size;
961  sps->min_tb_width = sps->width >> sps->log2_min_tb_size;
962  sps->min_tb_height = sps->height >> sps->log2_min_tb_size;
963  sps->min_pu_width = sps->width >> sps->log2_min_pu_size;
964  sps->min_pu_height = sps->height >> sps->log2_min_pu_size;
965  sps->tb_mask = (1 << (sps->log2_ctb_size - sps->log2_min_tb_size)) - 1;
966 
967  sps->qp_bd_offset = 6 * (sps->bit_depth - 8);
968 
969  if (sps->width & ((1 << sps->log2_min_cb_size) - 1) ||
970  sps->height & ((1 << sps->log2_min_cb_size) - 1)) {
971  av_log(s->avctx, AV_LOG_ERROR, "Invalid coded frame dimensions.\n");
972  goto err;
973  }
974 
975  if (sps->log2_ctb_size > MAX_LOG2_CTB_SIZE) {
976  av_log(s->avctx, AV_LOG_ERROR, "CTB size out of range: 2^%d\n", sps->log2_ctb_size);
977  goto err;
978  }
980  av_log(s->avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_inter out of range: %d\n",
982  goto err;
983  }
985  av_log(s->avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_intra out of range: %d\n",
987  goto err;
988  }
989  if (sps->log2_max_trafo_size > FFMIN(sps->log2_ctb_size, 5)) {
991  "max transform block size out of range: %d\n",
992  sps->log2_max_trafo_size);
993  goto err;
994  }
995 
996  if (s->avctx->debug & FF_DEBUG_BITSTREAM) {
998  "Parsed SPS: id %d; coded wxh: %dx%d; "
999  "cropped wxh: %dx%d; pix_fmt: %s.\n",
1000  sps_id, sps->width, sps->height,
1001  sps->output_width, sps->output_height,
1003  }
1004 
1005  /* check if this is a repeat of an already parsed SPS, then keep the
1006  * original one.
1007  * otherwise drop all PPSes that depend on it */
1008  if (s->sps_list[sps_id] &&
1009  !memcmp(s->sps_list[sps_id]->data, sps_buf->data, sps_buf->size)) {
1010  av_buffer_unref(&sps_buf);
1011  } else {
1012  for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
1013  if (s->pps_list[i] && ((HEVCPPS*)s->pps_list[i]->data)->sps_id == sps_id)
1014  av_buffer_unref(&s->pps_list[i]);
1015  }
1016  if (s->sps_list[sps_id] && s->sps == (HEVCSPS*)s->sps_list[sps_id]->data) {
1018  s->current_sps = av_buffer_ref(s->sps_list[sps_id]);
1019  if (!s->current_sps)
1020  s->sps = NULL;
1021  }
1022  av_buffer_unref(&s->sps_list[sps_id]);
1023  s->sps_list[sps_id] = sps_buf;
1024  }
1025 
1026  return 0;
1027 
1028 err:
1029  av_buffer_unref(&sps_buf);
1030  return ret;
1031 }
1032 
1033 static void hevc_pps_free(void *opaque, uint8_t *data)
1034 {
1035  HEVCPPS *pps = (HEVCPPS*)data;
1036 
1037  av_freep(&pps->column_width);
1038  av_freep(&pps->row_height);
1039  av_freep(&pps->col_bd);
1040  av_freep(&pps->row_bd);
1041  av_freep(&pps->col_idxX);
1042  av_freep(&pps->ctb_addr_rs_to_ts);
1043  av_freep(&pps->ctb_addr_ts_to_rs);
1044  av_freep(&pps->tile_pos_rs);
1045  av_freep(&pps->tile_id);
1047 
1048  av_freep(&pps);
1049 }
1050 
1052  GetBitContext *gb = &s->HEVClc->gb;
1053  int i;
1054 
1055  if (pps->transform_skip_enabled_flag) {
1057  }
1061  "cross_component_prediction_enabled_flag is not yet implemented.\n");
1062  }
1069  "chroma_qp_offset_list_len_minus1 shall be in the range [0, 5].\n");
1070  return AVERROR_INVALIDDATA;
1071  }
1072  for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
1073  pps->cb_qp_offset_list[i] = get_se_golomb_long(gb);
1074  if (pps->cb_qp_offset_list[i]) {
1076  "cb_qp_offset_list not tested yet.\n");
1077  }
1078  pps->cr_qp_offset_list[i] = get_se_golomb_long(gb);
1079  if (pps->cr_qp_offset_list[i]) {
1081  "cb_qp_offset_list not tested yet.\n");
1082  }
1083  }
1084  }
1087 
1088  return(0);
1089 }
1090 
1092 {
1093  GetBitContext *gb = &s->HEVClc->gb;
1094  HEVCSPS *sps = NULL;
1095  int pic_area_in_ctbs;
1096  int log2_diff_ctb_min_tb_size;
1097  int i, j, x, y, ctb_addr_rs, tile_id;
1098  int ret = 0;
1099  unsigned int pps_id = 0;
1100 
1101  AVBufferRef *pps_buf;
1102  HEVCPPS *pps = av_mallocz(sizeof(*pps));
1103 
1104  if (!pps)
1105  return AVERROR(ENOMEM);
1106 
1107  pps_buf = av_buffer_create((uint8_t *)pps, sizeof(*pps),
1108  hevc_pps_free, NULL, 0);
1109  if (!pps_buf) {
1110  av_freep(&pps);
1111  return AVERROR(ENOMEM);
1112  }
1113 
1114  av_log(s->avctx, AV_LOG_DEBUG, "Decoding PPS\n");
1115 
1116  // Default values
1118  pps->num_tile_columns = 1;
1119  pps->num_tile_rows = 1;
1120  pps->uniform_spacing_flag = 1;
1121  pps->disable_dbf = 0;
1122  pps->beta_offset = 0;
1123  pps->tc_offset = 0;
1125 
1126  // Coded parameters
1127  pps_id = get_ue_golomb_long(gb);
1128  if (pps_id >= MAX_PPS_COUNT) {
1129  av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id);
1130  ret = AVERROR_INVALIDDATA;
1131  goto err;
1132  }
1133  pps->sps_id = get_ue_golomb_long(gb);
1134  if (pps->sps_id >= MAX_SPS_COUNT) {
1135  av_log(s->avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", pps->sps_id);
1136  ret = AVERROR_INVALIDDATA;
1137  goto err;
1138  }
1139  if (!s->sps_list[pps->sps_id]) {
1140  av_log(s->avctx, AV_LOG_ERROR, "SPS %u does not exist.\n", pps->sps_id);
1141  ret = AVERROR_INVALIDDATA;
1142  goto err;
1143  }
1144  sps = (HEVCSPS *)s->sps_list[pps->sps_id]->data;
1145 
1148  pps->num_extra_slice_header_bits = get_bits(gb, 3);
1149 
1150  pps->sign_data_hiding_flag = get_bits1(gb);
1151 
1153 
1156 
1158 
1161 
1163  pps->diff_cu_qp_delta_depth = 0;
1164  if (pps->cu_qp_delta_enabled_flag)
1166 
1167  pps->cb_qp_offset = get_se_golomb(gb);
1168  if (pps->cb_qp_offset < -12 || pps->cb_qp_offset > 12) {
1169  av_log(s->avctx, AV_LOG_ERROR, "pps_cb_qp_offset out of range: %d\n",
1170  pps->cb_qp_offset);
1171  ret = AVERROR_INVALIDDATA;
1172  goto err;
1173  }
1174  pps->cr_qp_offset = get_se_golomb(gb);
1175  if (pps->cr_qp_offset < -12 || pps->cr_qp_offset > 12) {
1176  av_log(s->avctx, AV_LOG_ERROR, "pps_cr_qp_offset out of range: %d\n",
1177  pps->cr_qp_offset);
1178  ret = AVERROR_INVALIDDATA;
1179  goto err;
1180  }
1182 
1183  pps->weighted_pred_flag = get_bits1(gb);
1184  pps->weighted_bipred_flag = get_bits1(gb);
1185 
1187  pps->tiles_enabled_flag = get_bits1(gb);
1189 
1190  if (pps->tiles_enabled_flag) {
1191  pps->num_tile_columns = get_ue_golomb_long(gb) + 1;
1192  pps->num_tile_rows = get_ue_golomb_long(gb) + 1;
1193  if (pps->num_tile_columns == 0 ||
1194  pps->num_tile_columns >= sps->width) {
1195  av_log(s->avctx, AV_LOG_ERROR, "num_tile_columns_minus1 out of range: %d\n",
1196  pps->num_tile_columns - 1);
1197  ret = AVERROR_INVALIDDATA;
1198  goto err;
1199  }
1200  if (pps->num_tile_rows == 0 ||
1201  pps->num_tile_rows >= sps->height) {
1202  av_log(s->avctx, AV_LOG_ERROR, "num_tile_rows_minus1 out of range: %d\n",
1203  pps->num_tile_rows - 1);
1204  ret = AVERROR_INVALIDDATA;
1205  goto err;
1206  }
1207 
1208  pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width));
1209  pps->row_height = av_malloc_array(pps->num_tile_rows, sizeof(*pps->row_height));
1210  if (!pps->column_width || !pps->row_height) {
1211  ret = AVERROR(ENOMEM);
1212  goto err;
1213  }
1214 
1215  pps->uniform_spacing_flag = get_bits1(gb);
1216  if (!pps->uniform_spacing_flag) {
1217  uint64_t sum = 0;
1218  for (i = 0; i < pps->num_tile_columns - 1; i++) {
1219  pps->column_width[i] = get_ue_golomb_long(gb) + 1;
1220  sum += pps->column_width[i];
1221  }
1222  if (sum >= sps->ctb_width) {
1223  av_log(s->avctx, AV_LOG_ERROR, "Invalid tile widths.\n");
1224  ret = AVERROR_INVALIDDATA;
1225  goto err;
1226  }
1227  pps->column_width[pps->num_tile_columns - 1] = sps->ctb_width - sum;
1228 
1229  sum = 0;
1230  for (i = 0; i < pps->num_tile_rows - 1; i++) {
1231  pps->row_height[i] = get_ue_golomb_long(gb) + 1;
1232  sum += pps->row_height[i];
1233  }
1234  if (sum >= sps->ctb_height) {
1235  av_log(s->avctx, AV_LOG_ERROR, "Invalid tile heights.\n");
1236  ret = AVERROR_INVALIDDATA;
1237  goto err;
1238  }
1239  pps->row_height[pps->num_tile_rows - 1] = sps->ctb_height - sum;
1240  }
1242  }
1243 
1245 
1249  pps->disable_dbf = get_bits1(gb);
1250  if (!pps->disable_dbf) {
1251  pps->beta_offset = get_se_golomb(gb) * 2;
1252  pps->tc_offset = get_se_golomb(gb) * 2;
1253  if (pps->beta_offset/2 < -6 || pps->beta_offset/2 > 6) {
1254  av_log(s->avctx, AV_LOG_ERROR, "pps_beta_offset_div2 out of range: %d\n",
1255  pps->beta_offset/2);
1256  ret = AVERROR_INVALIDDATA;
1257  goto err;
1258  }
1259  if (pps->tc_offset/2 < -6 || pps->tc_offset/2 > 6) {
1260  av_log(s->avctx, AV_LOG_ERROR, "pps_tc_offset_div2 out of range: %d\n",
1261  pps->tc_offset/2);
1262  ret = AVERROR_INVALIDDATA;
1263  goto err;
1264  }
1265  }
1266  }
1267 
1269  if (pps->scaling_list_data_present_flag) {
1271  ret = scaling_list_data(s, &pps->scaling_list);
1272  if (ret < 0)
1273  goto err;
1274  }
1277  if (pps->log2_parallel_merge_level > sps->log2_ctb_size) {
1278  av_log(s->avctx, AV_LOG_ERROR, "log2_parallel_merge_level_minus2 out of range: %d\n",
1279  pps->log2_parallel_merge_level - 2);
1280  ret = AVERROR_INVALIDDATA;
1281  goto err;
1282  }
1283 
1285 
1286  if (get_bits1(gb)) { // pps_extension_present_flag
1287  int pps_range_extensions_flag = get_bits1(gb);
1288  /* int pps_extension_7bits = */ get_bits(gb, 7);
1289  if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && pps_range_extensions_flag) {
1291  "PPS extension flag is partially implemented.\n");
1292  pps_range_extensions(s, pps, sps);
1293  }
1294  }
1295 
1296  // Inferred parameters
1297  pps->col_bd = av_malloc_array(pps->num_tile_columns + 1, sizeof(*pps->col_bd));
1298  pps->row_bd = av_malloc_array(pps->num_tile_rows + 1, sizeof(*pps->row_bd));
1299  pps->col_idxX = av_malloc_array(sps->ctb_width, sizeof(*pps->col_idxX));
1300  if (!pps->col_bd || !pps->row_bd || !pps->col_idxX) {
1301  ret = AVERROR(ENOMEM);
1302  goto err;
1303  }
1304 
1305  if (pps->uniform_spacing_flag) {
1306  if (!pps->column_width) {
1307  pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width));
1308  pps->row_height = av_malloc_array(pps->num_tile_rows, sizeof(*pps->row_height));
1309  }
1310  if (!pps->column_width || !pps->row_height) {
1311  ret = AVERROR(ENOMEM);
1312  goto err;
1313  }
1314 
1315  for (i = 0; i < pps->num_tile_columns; i++) {
1316  pps->column_width[i] = ((i + 1) * sps->ctb_width) / pps->num_tile_columns -
1317  (i * sps->ctb_width) / pps->num_tile_columns;
1318  }
1319 
1320  for (i = 0; i < pps->num_tile_rows; i++) {
1321  pps->row_height[i] = ((i + 1) * sps->ctb_height) / pps->num_tile_rows -
1322  (i * sps->ctb_height) / pps->num_tile_rows;
1323  }
1324  }
1325 
1326  pps->col_bd[0] = 0;
1327  for (i = 0; i < pps->num_tile_columns; i++)
1328  pps->col_bd[i + 1] = pps->col_bd[i] + pps->column_width[i];
1329 
1330  pps->row_bd[0] = 0;
1331  for (i = 0; i < pps->num_tile_rows; i++)
1332  pps->row_bd[i + 1] = pps->row_bd[i] + pps->row_height[i];
1333 
1334  for (i = 0, j = 0; i < sps->ctb_width; i++) {
1335  if (i > pps->col_bd[j])
1336  j++;
1337  pps->col_idxX[i] = j;
1338  }
1339 
1340  /**
1341  * 6.5
1342  */
1343  pic_area_in_ctbs = sps->ctb_width * sps->ctb_height;
1344 
1345  pps->ctb_addr_rs_to_ts = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_addr_rs_to_ts));
1346  pps->ctb_addr_ts_to_rs = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_addr_ts_to_rs));
1347  pps->tile_id = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->tile_id));
1348  pps->min_tb_addr_zs_tab = av_malloc_array((sps->tb_mask+2) * (sps->tb_mask+2), sizeof(*pps->min_tb_addr_zs_tab));
1349  if (!pps->ctb_addr_rs_to_ts || !pps->ctb_addr_ts_to_rs ||
1350  !pps->tile_id || !pps->min_tb_addr_zs_tab) {
1351  ret = AVERROR(ENOMEM);
1352  goto err;
1353  }
1354 
1355  for (ctb_addr_rs = 0; ctb_addr_rs < pic_area_in_ctbs; ctb_addr_rs++) {
1356  int tb_x = ctb_addr_rs % sps->ctb_width;
1357  int tb_y = ctb_addr_rs / sps->ctb_width;
1358  int tile_x = 0;
1359  int tile_y = 0;
1360  int val = 0;
1361 
1362  for (i = 0; i < pps->num_tile_columns; i++) {
1363  if (tb_x < pps->col_bd[i + 1]) {
1364  tile_x = i;
1365  break;
1366  }
1367  }
1368 
1369  for (i = 0; i < pps->num_tile_rows; i++) {
1370  if (tb_y < pps->row_bd[i + 1]) {
1371  tile_y = i;
1372  break;
1373  }
1374  }
1375 
1376  for (i = 0; i < tile_x; i++)
1377  val += pps->row_height[tile_y] * pps->column_width[i];
1378  for (i = 0; i < tile_y; i++)
1379  val += sps->ctb_width * pps->row_height[i];
1380 
1381  val += (tb_y - pps->row_bd[tile_y]) * pps->column_width[tile_x] +
1382  tb_x - pps->col_bd[tile_x];
1383 
1384  pps->ctb_addr_rs_to_ts[ctb_addr_rs] = val;
1385  pps->ctb_addr_ts_to_rs[val] = ctb_addr_rs;
1386  }
1387 
1388  for (j = 0, tile_id = 0; j < pps->num_tile_rows; j++)
1389  for (i = 0; i < pps->num_tile_columns; i++, tile_id++)
1390  for (y = pps->row_bd[j]; y < pps->row_bd[j + 1]; y++)
1391  for (x = pps->col_bd[i]; x < pps->col_bd[i + 1]; x++)
1392  pps->tile_id[pps->ctb_addr_rs_to_ts[y * sps->ctb_width + x]] = tile_id;
1393 
1394  pps->tile_pos_rs = av_malloc_array(tile_id, sizeof(*pps->tile_pos_rs));
1395  if (!pps->tile_pos_rs) {
1396  ret = AVERROR(ENOMEM);
1397  goto err;
1398  }
1399 
1400  for (j = 0; j < pps->num_tile_rows; j++)
1401  for (i = 0; i < pps->num_tile_columns; i++)
1402  pps->tile_pos_rs[j * pps->num_tile_columns + i] = pps->row_bd[j] * sps->ctb_width + pps->col_bd[i];
1403 
1404  log2_diff_ctb_min_tb_size = sps->log2_ctb_size - sps->log2_min_tb_size;
1405  pps->min_tb_addr_zs = &pps->min_tb_addr_zs_tab[1*(sps->tb_mask+2)+1];
1406  for (y = 0; y < sps->tb_mask+2; y++) {
1407  pps->min_tb_addr_zs_tab[y*(sps->tb_mask+2)] = -1;
1408  pps->min_tb_addr_zs_tab[y] = -1;
1409  }
1410  for (y = 0; y < sps->tb_mask+1; y++) {
1411  for (x = 0; x < sps->tb_mask+1; x++) {
1412  int tb_x = x >> log2_diff_ctb_min_tb_size;
1413  int tb_y = y >> log2_diff_ctb_min_tb_size;
1414  int ctb_addr_rs = sps->ctb_width * tb_y + tb_x;
1415  int val = pps->ctb_addr_rs_to_ts[ctb_addr_rs] <<
1416  (log2_diff_ctb_min_tb_size * 2);
1417  for (i = 0; i < log2_diff_ctb_min_tb_size; i++) {
1418  int m = 1 << i;
1419  val += (m & x ? m * m : 0) + (m & y ? 2 * m * m : 0);
1420  }
1421  pps->min_tb_addr_zs[y * (sps->tb_mask+2) + x] = val;
1422  }
1423  }
1424 
1425  av_buffer_unref(&s->pps_list[pps_id]);
1426  s->pps_list[pps_id] = pps_buf;
1427 
1428  return 0;
1429 
1430 err:
1431  av_buffer_unref(&pps_buf);
1432  return ret;
1433 }